分类: LINUX
2010-06-13 16:10:14
对UNIX而言,进程状态和状态转移类似于本章前面关于进程方面讨论的内容。这里再进一步介绍,有助于读者更好地理解这部分内容。此外,要考虑的新 内容如下(参见图13-34)。
进程要么在用户模式下执行,要么在内核模式下执行。
(点击查看大图)图 13-34 进程状态和状态转移 |
进程在创建后并不会立刻进入"准备就绪"状态。实际上,先将其状态设为"创建"(参见图中圆圈"h")。想法就是创建进程时没有足够的内存运行该进 程。随后,该进程状态从"创建"变成"准备就绪"(也就是在内存中),或是变成"准备就绪、已交换的"(也就是图中的圆圈"e"),这取决于可用的内存大 小(参见图13-34)。
当进程结束时,它调用"Exit退出"系统调用,如图中顶部所示的"系统调用中断"。此时,它进入"内核运行"模式(也就是图13-34中从圆 圈"a"到"b"),并最终进入图13-34中圆圈"i"表示的"僵尸"状态。在该状态中,除了进程表中一个槽之外所有的信息都会被清除。
图13-34中用"c"和"g"描述了进程"准备就绪"到"运行"和"抢占优先"的这两个状态。这两个状态本质上很相似。从某种意义上讲,这两种状 态实际上都是"准备就绪态",也就是处于这两种状态的进程都可以内核被调度,因为实际上不会有一个正在等待任何事件的发生。处于这两种状态的进程之所以没 有运行,是因为CPU正在运行某个其他进程,而且CPU每次只能运行一个进程。然而,主要差别在于当调度"准备就绪"进程时,它先进入"内核运行"状态 (从图中的圆圈"c"到"b"),然后状态是"用户运行"状态(从图中的圆圈"b"到"a"),反之,抢占优先的进程可以直接进入"用户运行"态(从图中 圆圈"g"到"a")。实际上,这样做很有必要。
这样做的原因可以首先在进程变成抢占优先的方式中找到。当进程在内核模式下运行(也就是圆圈"b")而且在内核模式下完成后将要进入"用户运行态" (圆圈"a")时,当时它的时间槽已经用完,那么该进程就进入抢占优先状态(圆圈"g")。因此,操作系统知道在调度进程后,该进程可以立刻在"用户运行 态"运行。所有其他准备就绪进程在用户模式中开始执行前,要先进到"内核模式"中。
本节使用了一些与前面讨论不同的术语,例如,这里用"睡眠"替代"受阻塞",如果进程"被阻塞",也就是如果它正等待如I/O完成这样的事件,就称 其为"睡眠"。
如图13-34所示,可以列出以下的进程状态:
(1) 用户运行态(UR)--进程运行在用户模式下。
(2) 内核运行态(KR)--进程运行在内核模式下。
(3) 准备就绪态(RD)--进程运行准备就绪。
(4) 内存睡眠态(AM)--进程受阻塞,并且正在等待诸如I/O完成这样的事件。
(5) 就绪交换态(RS)--进程只有被交换进入之后才可以被调度,而不是在等待其他事件时被调度。
(6) 睡眠交换态(AS)--进程已经被换出,同时还在等待事件。通常,在等待的事件发生后,它先转移到"就绪交换态",然后是在被换入时才转移到"准备就绪 态"。作为选择,如果该进程在某个事件中被阻塞时就被换入,那么它可以进入"内存睡眠态"。在事件处理完以后可以进入"准备就绪态"。之后,该进程进入" 内核运行态",最终进入"用户运行态",内核就可以调度该进程了,因而可以执行实际的用户进程。
(7) 抢占优先态(PR)--进程没有等待任何事件,并且有一个进程已经放弃对CPU的控制,且其直接返回到"用户模式",那么可以调用该进程。
(8) 已经创建态(CR)--进程已经创建完毕,但尚未准备就绪。
(9) 僵尸存放态(ZM)--进程已经被终止,但尚未完全从系统中删除。
进程的进程表条目包含一个字段,名为"进程状态",它指明进程的状态(参见13.5.2节(2))。内核可以将进程表中状态相同的所有条目通过指针 链表链接在一起。例如,准备就绪状态或抢占优先状态链表可以按照优先级顺序维护,而进程优先级就是进程表中的一个字段。由于进程在其生命周期中频繁改变自 己的状态和优先级,所以管理这些变化的算法和数据结构要有很高的处理效率。
这里已经知道,进程层次结构中进程表条目通过链表链接在一起,这样可以提高遍历速度。这会使操作系统设计人员的工作更复杂。例如,所有准备就绪进程 的进程表也被链接在一起,所有抢占优先的进程、已经创建的进程以及就绪交换的进程也分别被各自链表链接在一起。实际上,内核按照优先级顺序维护这些链表, 按照时间顺序维护其他链表。同样的,进程层次结构中的所有进程也链接在一起,这里不考虑进程的状态。