具有等待队列的信号量的实现可能导致这样的情况: 两个或多个进程无限地等待一个事件,而该事件只能由这些等待进程之一来产生。这里的事件是V操作的执行(即释放资源)。 当出现这样的状态时,这些进程称为死锁。

与死锁相关的另一个问题是无限期阻塞或饥饿,即进程在信号量内无穷等待的情况。

产生饥饿的主要原因是:在一个动态系统中,对于每类系统资源,操作系统需要一个分配策略,当多个进程同时申请 某类资源时,由分配策略确定资源分配给进程的次序。有时资源分配策略是不公平的,即不能保证等待时间上限的存在。在这种情况下,即使系统没有发生死锁,某些进程也可能会长时间等待。当等待时间给进程推进和响应带来明显影响时,称发生了进程“饥饿”。当“饥饿”到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被“饿死”。

例如,当有多个进程需要打印文件时,如果系统分配打印机的策略是最短文件优先,那么长文件的打印任务将由于短文件的源源不断到来而被无限期推迟,导致最终的“饥饿”甚至饿死。

“饥饿”并不表示系统一定死锁,但至少有一个进程的执行被无限期推迟。饥饿与死锁的主要差别有:

1)进入“饥饿”状态的进程可以只有一个,而由于循环等待条件而进入死锁状态的进程却必须大于或等于两个。

2)处于饥饿状态的进程可以是一个就绪进程,如静态优先权调度算法时的低优先权进程,而处于死锁状态的进程则必定是阻塞进程。