1.进程

1. 进程和线程的区别

参考知乎的解答,感谢热心网友。

课本上的是 “进程是资源分配的最小单位,线程是CPU调度的最小单位”。如何理解呢?

进程和线程都是一个时间段的描述,是CPU工作时间段的描述。是运行中的程序指令的一种描述,这需要与程序中的代码区别开来。一个重要的事实就是CPU太快了,除了寄存器,其他外设更不上它的速度。那当多个任务要执行的时候(并发模式),在CPU看来就是轮流着来。而且因为速度差异,CPU实际的执行时间和等待执行的时间是数量级的差异,但在我们看来这些任务就仿佛是同时在执行。

一个进程处于就绪态,会被分配在就绪队列中,等待CPU的执行。执行一段程序代码,实现一个功能的过程之前 ,当得到CPU的时候,相关的资源必须也已经就位,就是万事俱备只欠CPU这个东风。所有这些任务都处于就绪队列,然后由操作系统的调度算法,选出某个任务,让CPU来执行。然后就是PC指针指向该任务的代码开始,由CPU开始取指令,然后执行。

进程执行时,他有自己的PCB结构来保存运行环境。除了CPU以外所有的执行环境,主要是寄存器的一些内容,就构成了的进程的上下文环境。进程的上下文是进程执行的环境。当这个程序执行完了,或者分配给他的CPU时间片用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去做的主要工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。

相比于进程的上下文切换,线程的颗粒度就小很多。举个例子就是:
进程的颗粒度太大,每次的执行都要进行进程上下文的切换。

如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:程序A得到CPU => CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。

这里a,b,c的执行是共享了A进程的上下文,CPU在执行的时候仅仅切换线程的上下文,而没有进行进程上下文切换的。进程的上下文切换的时间开销是远远大于线程上下文时间的开销。这样就让CPU的有效使用率得到提高。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段。线程主要共享的是进程的地址空间。

总结来说:进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。线程关注的是中央处理器的运行,而不是内存等资源的管理,它并不会改变进程对内存(heap)等资源的管理,线程之间会共享这些资源。