zoukankan      html  css  js  c++  java
  • 进程与线程

    进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位。

    线程:线程是进程的一个执行子序列。是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 

    从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

    PCB(进程控制器)与TCB(线程控制器)的作用都是用来切换进程(线程),储存之前状态,用来恢复的。

    进程的实现只能由操作系统内核来实现,而不存在用户态实现的情况。但是对于线程就不同了,线程的管理者可以是用户也可以是操作系统本身,线程是进程内部的东西,当然存在由进程直接管理线程的可能性。因此线程的实现就应该分为内核态线程实现和用户态线程实现。

    内核态线程实现:

           线程是进程的不同执行序列,也就是说线程是独立运行的基本单位,也是CPU调度的基本单位。

    用户态线程实现:

      用户态下进行线程的管理需要用户创建一个调度线程。一个线程在执行完一段时间后主动把资源释放给其他线程使用,而在内核态下则无需如此,因为操作系统可通过周期性的时钟中断把控制权夺过来,在用户态实现情况下,执行系统的调度器也是线程,没有能力夺取控制权。

    用户态实现的优点?

      灵活快速便捷。

    用户态实现的缺点?

           首先编程起来很诡异,由于在用户台下各个进程间需要相互合作才能正常运转。那么在编程时必须考虑什么情况下让出CPU,让其他的线程运行,而让出时机的选择对线程的效率和可靠性有很大影响,这个并不容易做到;

           其次,用户态线程实现无法完全达到线程提出所要达到的目的:进程级多道编程;如果在执行过程中一个线程受阻,它将无法将控制权交出来,这样整个进程都无法推进。操作系统随即把CPU控制权交给另外一个进程。这样,一个线程受阻造成整个进程受阻,我们期望的通过线程对进程实施分身的计划就失败了。这是用户态线程致命的缺点。

           调度器激活:线程阻塞后,CPU控制权交给了操作系统,要激活受阻进程的线程,唯一的办法就是让操作系统在进程切换时先不切换,而是通知受阻的进程执行系统(即调用执行系统),并问其是否还有别的线程可以执行。如果有,将CPU控制权交给该受阻进程的执行系统线程,从而调度另一个可以执行的线程到CPU上。一个进程挂起后,操作系统并不立即切换到别的进程上,而是给该进程二次机会,让其继续执行。如果该进程只有一个线程,或者其所有线程都已经阻塞,则控制权将再次返回给操作系统。而现在,操作系统就会切换到其他线程了。

    参考资料:

    https://www.cnblogs.com/baoendemao/p/3804677.html

  • 相关阅读:
    安装 OSS-FTP 时出现 ImportError: No module named gtk的解决
    Two Sum III
    两线程交叉打印奇偶数
    /dev/kvm device: permission denied Deepin Ubuntu AndroidStudio
    05webpack-webpack-dev-server时时跟新-第2种方式
    04webpack--webpack-dev-server 时时跟新
    03webpack--输入webpack--自动打包
    02-webpack的基本配置-运行webpack
    01-day-什么是webpack
    学习51cto中美团中的小知识点--组件实现按需求加载
  • 原文地址:https://www.cnblogs.com/hekiraku/p/12095768.html
Copyright © 2011-2022 走看看