两阶段加锁
第一阶段:进程试图对所有所需的记录进行加锁,一次锁一个记录。若第一阶段加锁成功,就开始第二阶段,完成更新然后释放锁。
若在第一阶段某个进程需要的记录已被加锁,则该进程释放它所有加锁的记录,然后重新开始第一阶段。
通信死锁
在一系列进程中,每个进程因为等待另外一个进程引发的时间而产生阻塞。
超时可以中断通信死锁,只要一个信息被发送至一个特定的地方,并等待其返回一个预期的回复,发送者就同时启动计数器,若计时器在回复到达前就停止计时了,则信息发送者可认定信息已经丢失,并重新发送。
但若原始信息没有丢失,仅是回复延时,接受者会收到两次或更多次信息,甚至导致意想不到的后果。
活锁
活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。 进程正在活动,然而并不会继续往下执行。
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
饥饿
产生饥饿的主要原因是:在一个动态系统中,对于每类系统资源,操作系统需要确定一个分配策略,当多个进程同时申请某类资源时,由分配策略确定资源分配给进程的次序。有时资源分配策略可能是不公平的,即不能保证等待时间上界的存在 。在这种情况下,即使系统没有发生死锁,某些进程也可能会长时间等待.当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿,当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。
举个例子,当有多个进程需要打印文件时,如果系统分配打印机的策略是最短文件优先,那么长文件的打印任务将由于短文件的源源不断到来而被无限期推迟,导致最终的饥饿甚至饿死。
死锁和饥饿的异同
相同点:二者都是由于竞争资源而引起的。
不同点:
- 从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死;
- 死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限没有上界(排队等待或忙式等待);
- 死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;
- 死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
- 在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。