黑板上的记忆作文800字:抢占式多任务 vs. 协同式多任务

来源:百度文库 编辑:九乡新闻网 时间:2024/05/06 17:30:57

抢占式多任务 vs. 协同式多任务

在前些年的操作系统中(Windows 95之前),需要程序在自己的时间片结束后主动将CPU使用权交出。这种方式就叫做“cooperative multitasking”(协同式多任务),因为这种方式需要运行的程序和操作系统彼此协同工作,彼此“公正平等”的使用CPU。当然,每个程序都会有自己不同的时间片,但是操作系统却无法严格执行规则。某些程序可能会独占CPU而不释放资源,使得整个系统陷入瘫痪。

而“Preemptive multitasking”(抢占式多任务)则恰好相反,会强制执行规则,将时间片结束的程序“毫不留情的赶出”CPU。伴随“抢占式”的还有“memory protection”(内存保护)机制,操作系统监控每个程序的内存使用情况,确保其可以使用并只能使用分配到的内存部分。在这样的操作系统中,程序之间彼此是不可见的,各自都认为自己是系统上唯一运行的程序。

操作系统和系统硬件不仅一起向用户隐瞒了多任务的真实机制,也没有透露给所运行的程序。用户会认为所有运行的程序都同时得到执行,而运行的程序也会认为自己独占了CPU和内存资源。对于一个正运行的程序而言,它就是唯一读入内存并被CPU执行的程序。程序会认为自己完全使用了系统所有的内存寻址空间,而CPU也在执行期间没有任何中断。当然,这一切都不是事实。程序只是和其他运行的程序一起共享系统的内存,并且需要在自己的时间片结束后等待下一次分配,就像其他所有程序一样。

单线程的CPU

在上面这个图上,内存中的不同颜色方块代表了四个不同程序的指令。可以看到,只有红色方块表示的程序正在被执行,而其他的都在内存中等待。不过,提醒大家注意图中CPU执行单元中的白色方块。这些空闲的管道表明闲置的资源。不管出于何种原因,CPU没有能将要用到的代码载入到其中。

在CPU的前端还有些空的方块。这块CPU可以在一次时钟循环中可以执行4条指令,但就像图中表示的那样,实际上它没有达到这么大的工作量。在大多数时间,该CPU都只是执行2条指令。

在继续讨论之前,我们还要了解一下“程序”这个概念。在现在的大多数操作系统中,用户通常所说的程序应该被称为“Process”(过程),过程之间通过“Context”(相关内容)相连,这个相关内容t,是一个范围很广的概念,包含了当前处理器执行状态的所有信息,比如CPU寄存器、程序计数器、标志位等。

过程是由“Thread”(进程)组成的,每个过程至少有一个线程:执行主线程。过程也可以由多个线程组成,每个线程在过程的相关内容(可由全体线程共享)之外,都可以由自己独立的相关内容。实际上,线程就是一种特别的拆开了的过程,一个轻量级的过程。在下面的文章中,单独提到的这两个概念一般都是可以互换的。

尽管过程中包含了不少线程,但是线程还是有一些独立性的。这种独立性使得他们获得了一定的速度和稳定性。在一个SMP的系统中,不仅不同的处理器可以处理不同的过程,同一过程的不同闲扯也可以在不同处理器上运行。这也就是为什么使用多线程的程序可以在SMP系统上性能有所提高,而单线程的应用程序却不能。

让一个程序认为自己是唯一正在运行的需要不少工作。首先,也是最主要的就是一旦某个程序的时间片结束后,其对应的内容就要进行保存,这样可以使该程序再次获得运行权时可以和中断前的环境一致。这样就可以使这个程序运行获得了某个角度上的“连续性”。

保存当前执行程序的相关内容,将其退出CPU执行区,读入下一个“Context”的过程就称为“Context Switch”(内容切换)。很自然,多线程程序的内容切换要比单线程的程序复杂的多。所有,对于硬件支持的内容切换数量和内容切换的类型(程序切换还是线程切换),内容切换可能会用去相当的时间,也就是要占用一些CPU时钟循环。减少内容切换可以提高执行效率、减少消耗,而目前广泛使用到的多线程在切换上比程序切换快得多。

提高效率的另一种方式就是增加每个程序的CPU的执行时间,建立一个可以同时执行不止一个程序的系统,也就是给系统再加一个处理器。在SMP系统中,操作系统可以将两个程序同时执行,各自运行在不同的处理器上。当然,在大多数桌面操作系统中,程序还是不能独占处理器,仍然需要等待执行自己的时间片。由于有两个CPU来执行,程序的等待时间就没有那么长了。所以最后的结果就是,系统中程序可执行的时间增加了,在任何时间运行的程序都获得更多的执行时间,而减少了时间片结束后在内存中等待的时间。