线程:比进程更灵活高效的调度单位
线程是OS运行调度的最小单位,比进程要小。线程的引入可以说是为了克服进程的缺点。
进程的缺点是什么呢?我们首先来回顾一下OS使用进程时都需要为进程做些什么,以及这样的开销上的负担:
- 创建它时,我们要给它分配除了处理及外所有需要的资源(内存,I/O设备等),然后给它建立PCB(进程控制块,Process Control Block)
- 撤销它时,要收回这些分给它的资源,然后撤销PCB
- 进程切换时,要保留当前进程的CPU环境,然后设置新的进程的CPU环境
以上都需要花上好一些时间和资源,所以我们最好不要在系统中设置太多的进程,也不要在进程间频繁切来切去,以免给系统造成沉重负担。
我们可以看到进程面临这些限制,所以并发程度也就受到了限制。
但是我们想要获得更好的并发性和效率,怎么办?考虑一下进程的两个特点:
(1)它是调度和分派的基本单位;
(2)它拥有资源块。
既然要更加灵活高效地并发,我们可以尝试把这两个特性分开一下:我们依然让进程拥有资源块,然后让它拥有许多“小进程”去完成调度任务,在需要的适合进程再把资源分配给它们——这些只有作为调度单位的功能,而自己本身没有什么资源的“小进程”,就是线程了。
我们现在看看线程如何解决了上述缺陷:
- 进程创建一个线程,只需要把比起进程总资源少得多的资源分配给线程,然后给它配一个TCB(Thread Control Block,线程控制块)
- 撤销一个线程时,也只要收回这些较少的资源,这样我们就不会花太多时间,也可以减少空间的无效占领。
- 切换线程时仅需保存和设置少量寄存器内容,不涉及存储器管理方面的操作,又给我们省了很多时间空间。
在同一个进程里的线程拥有同一套地址空间,共享着进程拥有的资源,它们之间的同步和通信因此比较容易,它们之间的切换也变得很省开销。但是要注意不同进程里的两个线程切换时仍然需要是切换进程的。
现在,进程就把作为调度单位功能给了体量更小的线程,线程也就成了最小调度单位。那么进程自己还可以执行什么来自处理及的调度任务吗?答案是所有调度任务现在都给它手下的进程们干了,它自己只负责给线程们发发资源。
线程当然是可以并发执行的了——既然我们是为了获得更好的并发性。它可以并发,可以被调度,这和它的大哥进程很像,所以有时候我们也把线程叫做“轻进程”。
我们同时也因为线程获得了更好的灵活性——如果不引入线程,一个进程在出于某种原因被阻塞时,它依然会占有被OS分配的资源然而却不工作,也不能完成其他的功能而浪费了时间;如果引入线程,而让线程并行地分别去完成进程的若干个工作,即使某个线程被阻塞了,其他线程也可以继续干自己的,既不浪费占有的资源也不浪费时间。
Good job,现在我们的系统更加灵活高效了!
网友评论