进程、线程和协程

进程、线程和协程是学习操作系统和编程中常见的重要概念。

从操作系统的角度解释什么是进程?什么是线程?

进程是操作系统资源分配的基本单位。保存在外存的程序运行起来的时候,操作系统会在内存空间内形成一个独立的内存体,这个内存体有自己独立的地址空间。即操作系统会以进程为单位分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位,是操作系统进行资源分配和调度的一个独立单位。

CPU上的实际运作单位是线程,故线程是操作系统执行运算调度的最小单位。一个进程中至少有一个线程,进程中的多个线程共享进程的资源。

进程的组成

进程一般由程序、数据和进程控制块(PCB)三部分组成。

如何通俗地理解进程和线程的关系?

线程的状态

根据OS对线程调度表现阶段的不同,可以分为3个基本状态:Ready(就绪状态)、Running(运行状态)和Blocked(阻塞状态),如图所示:
OS-thread-status.png

协程

协程不是由操作系统内核管理的,而是完全由程序所控制(也就是在用户态执行)。

线程通信的同步与异步、阻塞与非阻塞

同步与异步是针对线程一次调用得到结果的时间来分类的。

  1. 同步情况下,返回的结果就是调用的结果;或者说在没有得到结果之前,调用就不返回。
  2. 异步情况下,调用会立即返回一个空值,调用方不会直接获得真正的结果,真正的结果由被调用方来主动通知或发送给调用方。

阻塞与非阻塞是根据多线程并发的相互影响程度来分类的。

  1. 若一个线程是阻塞的,那么当该线程期待获得的临界区资源被其他线程占用未释放时,该线程就会调用阻塞原语将自己挂起,直到获取临界区资源才会调用唤醒原语进入就绪状态。阻塞是最严格的并发级别。
  2. 对非阻塞线程,当前线程对资源的使用不妨碍其他线程的继续执行。

举个例子,Java编程的三个IO模型中,BIO属于同步阻塞,NIO属于同步非阻塞,AIO属于异步非阻塞。而在线程池中处理BIO则属于异步阻塞。

同步 异步
阻塞 BIO 线程池
非阻塞 NIO AIO

阻塞和等待的区别

阻塞是被动的,而等待是主动的。
如使当前线程进入等待状态:Object.wait()
而当一个线程试图获取一个对象锁(非java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入阻塞状态。

服务型合约引擎构建指南 通过案例学习OriginPro绘图

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×