问答题 一个SPOOLing系统由输入进程I、用户进程P、输出进程O、输入缓冲区、输出缓冲区组成。进程I通过输入缓冲区为进程P输入数据,进程P的处理结果通过输出缓冲区交给进程O输出。进程间数据交换以等长度的数据块为单位。这些数据块均存储在同一磁盘上。因此,SPOOLing系统的数据块通信原语保证始终满足:
i+o≤max ①

其中,max为磁盘容量(以该数据块为单位),i为磁盘上输入数据块总数,o为磁盘上输出数据块总数。
该SPOOLing系统运行时:只要有输入数据,进程I终究会将它放入输入缓冲区;只要输入缓冲区有数据块,进程P终究会读入、处理,并产生结果数据,写到输出缓冲区;只有输出缓冲区有数据块,进程O终究会输出它。
请说明该SPOOLing系统在什么情况下死锁。请说明如何修正约束条件①来避免死锁,同时仍允许输入数据块和输出数据块均存储在同一个磁盘上。
【正确答案】这是一个综合性很强的题目,题目中出现了缓冲区、SPOOLing技术、进程共享资源(共享同一个缓冲区)、死锁等概念。而究其本质,其实本题考查的是死锁现象的判断,就是要考生找出该系统的一种死锁的可能。
可以先画出该系统的大致结构草图,如图所示。
[*]

下面找到一种导致该SPOOLing系统死锁的情况:
当磁盘上输入数据块总数i=max时,那么磁盘上输出数据块总数。必然为零。此时,进程I发现输入缓冲区已经满了,所以不能再把输入数据放入到缓冲区中;进程P此时有一个处理好了的数据,打算把结果数据放入缓冲区,但是也发现没有空闲的空间可以放结果数据,因为o=0,所以没有输出数据可以输出,于是进程O也无事可做。这时进程I、P、O各自都等待着一个事件的发生,如果没有外力的作用,它们将一直等待下去,这种僵局显然是死锁。
只需要修改条件①为:i+o≤max,且i≤max-1;这样就不会再发生死锁。也就是说,产生的数据不能达到缓冲区总和的上限,至少保证能够有一个非输入数据有缓冲空间可以存放,以便进程P和进程O正常运行。
在其他类似题目中,通常都会在临界条件处发生死锁,因此可以通过验证临界值来考查条件是否能完全满足要求。
【答案解析】