进程与线程的比较真的有必要吗

在没有线程的时代,一个进程内的所有动作就只能依次执行,如果有并发执行需求,就得用多进程,既然多进程可以搞定,为啥操作系统又引入了线程呢?大家都知道,因为线程更轻量,那线程到底轻在哪里?

我们前面说过,进程开启后,操作系统会为其维护一个进程控制块PCB,同样的,线程开启后,会为其维护一个线程控制块TCB,这两个控制块的大小决定了它们体积上的轻重

进程/线程作为CPU调度单元,都包含操作系统对其进行调度的控制信息,以及运行上下文信息保存区等(比如进程/线程状态信息,堆栈指针信息,运行时各种寄存器的保存信息),这部分内容两者差异并不大,剩余的就是差异部分了,大家想一想,线程是进程之下的调度单元,进程下的多个线程共享进程中的公用信息,这部分信息大多都放在PCB中,所以进程块必然比线程块大,大的这部分就是线程共享的内容,比如前面说的包含虚拟地址和物理地址的映射关系的页表,程序运行过程中使用的资源(如打开的文件表),程序的代码段数据段的地址信息,进程间通信信息等等。所以从体积上来说,线程=进程-共享资源,操作系统创建进程时,得分配资源,建立PCB,销毁进程时,得回收资源,撤销PCB,线程创建时要的资源更少,TCB空间更小,自然比进程轻量。

除了体积上的轻重差异外,在多进程/多线程通讯和共享数据的代价方面,线程也比进程更轻,进程间是互相独立的,这个独立体现在内存空间隔离的上,操作系统开启A,B两个进程,把这块空间分配给A,把另一块空间分配给B,A看不见B的,B看不见A的,是为隔离。进程内的线程就没有这种限制,内存空间共享,共享带来的好处就是有数据对大家都可见,那共享和通讯就很方便,代价也很低,而相对的,隔离就没有这些方便了。

换个角度理解进程

        我们上面说了,进程和线程都作为操作系统的调度单元,实际上,在引入线程后,大部分的现代操作系统设计中,进程都已不再作为调度单元了,即使是不使用多线程的进程,操作系统也会默认为其分配一个主线程去执行任务,这样,进程和线程已经完全不是一个概念了,自然就没有了可比性

操作系统调度的是线程,所以线程是CPU调度单位,承载的是执行控制流所需要的信息

而进程是资源分配的单位,进程拥有一个完整的资源平台,这些资源包含内存、文件、访问的网络资源等,当进程中有任务要执行时,就分配给线程去完成

我们前面在比较线程进程的轻重时,是以二者都是CPU调度单位为前提,去考虑为何操作系统选择多线程而不是多进程的设计原因。在大多数操作系统已经只将线程作为调度单位的今天,我们对进程的理解就应该有所变化,我们将进程的功能作了切分,将资源承载的这部分留在进程,将执行流的那部分归给线程,二者紧密联系,各司其职。

PS:如果有不足之处,欢迎指出;如果解决了你的疑惑,就点个赞吧o(* ̄︶ ̄*)o

猜你喜欢

转载自blog.csdn.net/wb_snail/article/details/105338889
今日推荐