恢复流程实例的流程监控
如果多个进程因条件 x 而挂起,并且某个进程执行了 x.signal() 操作,那么我们可以通过一个简单的解决方案来确定接下来应该恢复哪个挂起的进程:使用先到先服务 (FCFS) 顺序,以便最先等待的进程首先恢复。然而,在许多情况下,这种简单的调度方案是不够的。因此,可以使用条件等待结构。此结构具有以下形式
x.wait(c);
这里 c 是一个整数表达式,在执行 wait() 操作时计算。c 的值称为优先级数字,然后与挂起进程的名称一起存储。当执行 x.signal() 时,优先级数字最小的进程将被恢复。为了说明这种新机制,请考虑下面代码中所示的 ResourceAllocator 监视器,它控制单个资源在竞争进程之间的分配。
示例
monitor ResourceAllocator{ boolean busy; condition x; void acquire(int time){ if (busy) x.wait(time); busy = true; } void release(){ busy = false; x.signal(); } initialization code(){ busy = false; } }
当每个进程请求分配此资源时,都会指定其计划使用资源的最长时间。监视器将资源分配给时间分配请求最短的进程。需要访问上面问题中资源的进程必须遵循以下顺序:
R.acquire(t); ... access the resource; … R.release();
其中 R 是 ResourceAllocator 类型的实例。
不幸的是,监视器概念无法保证会遵守上述访问顺序,可能会发生以下问题:
进程可能在未首先获得对资源的访问权限的情况下访问资源。
一旦进程被授予对资源的访问权限,它可能永远不会释放资源。
进程可能会尝试释放其从未请求过的资源。
进程可能会两次请求相同的资源(而没有首先释放该资源)。
当前问题的可能解决方案是将资源访问操作包含在 ResourceAllocator 监视器中。但是,使用此解决方案意味着调度将根据内置的监视器调度算法而不是我们编写的调度算法进行。
我们必须检查所有使用 ResourceAllocator 监视器及其管理资源的程序,以确保进程遵守相应的顺序。必须建立两个条件才能确保此系统的正确性。首先,用户进程必须始终以正确的顺序对其进行监视器调用,其次,必须确保不合作的进程不会简单地忽略监视器提供的互斥网关,并尝试直接访问共享资源,而不使用访问协议。只有在确保这两个条件的情况下,我们才能保证不会发生与时间相关的错误,并且调度算法不会被破坏。