进程详细剖析(二)

摘自《C++多核高级编程》

5.6.3  进程状态

在进程执行期间,它的状态会发生改变。进程的状态时指进程的当前状况。在POSIX兼容的环境中,进程可以处于以下状态:

1)运行(running)

2)就绪(runnable, ready)

3)僵死(zombied)

4)等待(waiting, blocked)

5)停止(stopped)

进程的当前状况取决于进程或操作系统所创造的境况(circumstance)。当特定境况出现时,进程将改变它的状态。状态转换(state transition)是进程改变其状态的境况。下图时进程的状态图,状态图由节点以及节点之间的有向边组成。每个节点代表进程的状态,节点之间的有向边时状态转换。表5-4列出了状态转换以及简要描述。如下图和下表所以,状态之间只能发生特定转换。例如,在就绪和运行之间存在转换,但是在休眠和运行之间不存在转换。这意味着有一些境况能够导致一个进程从就绪状态转到运行状态,但是没有哪个境况能够使得进程从休眠状态转到运行状态。

当创建了一个进程后,它就已经准备好执行它的指令了,但是它首先必须等待,直到处理器可用。每个进程只允许使用处理器一小段时间,被称作时间片(time slice)。等待使用处理器的进程处于就绪队列中,只要就绪队列中的进程会被调度器选中来使用处理器。就绪队列中的进程时可运行的(runnable)。当处理器可用时,会由分派器(dispatcher)指派一个可运行的进程给处理器。当时间片用完之后,无论它是否运行完它的全部指令,进程都将被从处理器上移除。进程会被放回到就绪队列中,等待下一次轮到它使用处理器。从就绪队列中选出一个新的进程并给它时间片来执行。系统进程是非抢占式的,当它们占用处理器后,会一直运行到结束。如果时间片没有用完,进程如果因为等待某个事件的发生而不能够继续处理,会主动放弃处理器。进程也可能通过发起系统调用来发出访问I/O设备的请求,或者可能需要等待一个同步变量被释放。由于等待事件发生而不能够继续执行的进程会处于休眠状态,它会同其他休眠进程一同被放入一个队列中。当事件发生之后,会从该队列中将它们删除,病放回到就绪队列中。在时间片被用完之前,进程锁使用的处理器可能被抢夺走,这发生在有更高优先级的进程可运行时,如系统进程。被强占的进程仍然是可运行的,因此会被放到就绪队列中。

运行中的进程可能会收到一个停止信号。停止状态同休眠状态是不同的,进程的时间片没有用完,而进程也没有发起任何系统请求。进程可能会接收到停止信号,是因为它正在被调试,或者在系统中发生了某种情况。进程接收到信号后,会进行从运行状态到停止状态的转换,稍后进程可能会被唤醒,或者可能被销毁。

当进程执行完所有的指令后,它会退出系统。进程会从进程表中被删除,PCB将被销毁,它的所有 资源将被释放并退回到系统可用资源池中。不能够继续执行但也不能够退出系统的进程的状态被称为僵死状态。僵死进程不使用任何系统资源,但是仍然在进程表中占用一个条目。当进程表中包含过多的僵死进程时,会影响系统的性能,甚至可能导致系统重新启动。

5.6.4 进程是如何被调度的

当一个就绪队列包含多个进程时,调度器必须决定首先将哪个进程指派给处理器。调度器维护使得它可以以高效的方式调度进程的数据结构。每个进程将被赋予一个优先级别,并同其他有着相同优先级别的可运行进程放置在同一个优先级队列中。存在多个优先级队列,每个队列代表系统所使用的不同的优先级别。这些优先级别队列时分不同等级的,而且被放置在一个名为多优先级队列(multilevel priority queue)的分派数组(dispatcg arrat)中。下图描述了多个优先级队列。数组中的每个元素指向一个优先级队列。调度器将位于非空最高优先级队列头部的进程指派给处理器。

优先级可以时动态的或静态的。一旦进程的静态优先级被设置,则不能够改变它,而动态优先级是可以改变的。有着最高优先级的进程可以垄断对处理器的使用。如果一个进程的优先级时动态的,最初的优先级可以被调整为更合适的值。进程会被放置到有着更改优先级的优先级队列。还可以给垄断处理器的进程设置较低的优先级,或者把其他进程的优先级设置得更高一些。当您为用户进程设置优先级时,需要考虑进程多数时间是做什么类型的工作。有些进程是CPU密集型的,这些进程在整个时间片内部都使用处理器,有些进程将多数时间用于等待I/O或一些其他事件的发生。当这样的一个进程准备好使用处理器时,应当立即将处理器交给它使用,这样它能够处理下一个I/O请求。交互进程可能会要求高优先级来保证良好的响应时间。系统进程的优先级高于用户进程。

进程是根据调度策略放置在优先级队列中的,在POSIX API中使用的两个主要调度策略是FIFO(First-in, First-out, 先进先出)和RR(round robin, 轮询)策略。

1)下图显示了FIFO调度策略。使用FIFO调度策略时,进程时根据到达队列的时间被指派给处理器的。当正在运行的进程的时间片耗尽时,它会被放置到优先级的头部。当一个休眠进程变为可运行时,它将被放置在优先级队列的尾部。进程可以发起系统调用并放弃处理器,将处理器交给有着相同优先级等级的另一个进程,然后这个进程会被放置到优先级队列的尾部。

2)在轮询调度策略下,所有进程都被同等对待。下图描述了RR调度策略。RR调度和FIFO的区别在于:当时间片耗尽时,进程被放置到队列的后端,同时队列中的下一个进程被指派给处理器。除了这一点之外,RR和FIFO相同。

上图显示了FIFO和RR调度策略的行为。FIFO调度策略根据进程到达队列的时间将它们指派到处理器,进程将一直运行,直到结束。RR调度策略使用FIFO调度指派线程,但是当时间片耗尽时,进程将被放置到就绪队列的尾部。

原文地址:https://www.cnblogs.com/rohens-hbg/p/10153829.html