OS:资源类型 & 锁

1、资源类型

分类标准:可重用、可抢占。

1.1、重用性

  • 可重用资源(永久)
    • 可被多个进程重复使用。一次只能分配给一个进程使用,其它线程必须等待资源释放。
    • 数目:固定,进程无法创建或删除。
    • 使用顺序:请求资源、使用资源、释放资源。
  • 消耗性资源(临时)
    • 进程在运行期间动态的创建和消耗。
    • 数目:进程运行期间是可以不断变化(0 或多个)。
    • 典例:进程间通信的消息。
      • 创建:通常由生产者进程创建,放入该资源类的缓冲区。
      • 消耗:通常由消费者进程消耗,进程可请求若干个资源并消耗,不再放回缓冲区。

1.2、抢占性

  • 可抢占资源:被进程获取后,可被其他进程或系统抢占,不会引起死锁(如 CPU、主存)
  • 不可抢占资源:被进程获取后,只能等进程本身释放资源(如打印机)。

2、锁

根据锁的活跃性,分为两类。

  • 死锁:多个进程在竞争资源,或彼此通信而造成的阻塞。
  • 饥饿:某个进程一直得不到资源。

3、死锁

3.1、产生原因

① 互斥

竞争不可抢占资源

示例:OS 中仅有一台打印机和输入设备。

  1. 某一时刻进程 P1 使用打印机,P2 使用输入设备。
  2. 此时,P1 请求使用输入设备、P2 请求使用打印机,双方等待彼此的资源。

② 循环等待

竞争可消耗资源

示例:三个进程互相发送消息。进程 P1 发给 P2,P2 发给 P3,P3 发给 P1。

  1. 正常:每个进程都是先发送消息,再等待接收消息。
  2. 死锁:每个进程先等待接收消息,系统进入不安全状态。

3.2、特征(必要条件)

只要发生死锁,以下 4 个条件同时成立。

  1. 互斥:至少有一个资源非共享,同一时刻只有一个线程能使用。
  2. 不可剥夺:即存在不可抢占资源,资源只能在进程完成任务后主动释放
  3. 请求与保持:进程占用至少一个资源,并等待另一个被其它进程占用的资源。
  4. 循环等待:存在进程资源的循环等待链(如进程 P1 等待 P2,P2 等待 P1)

3.3、处理

① 预防

设置限制条件,破坏产生死锁的以下两个条件。

  1. 破坏不可剥夺:弱请求的资源被其它进程占有,释放当前进程的资源、或抢占资源。
  2. 破坏循环等待:有序资源分配法。

② 避免

在资源的动态分配过程中,用某种方法防止系统进入不安全状态。

  1. 有序资源分配法:将资源统一编号,进程必须按编号顺序申请资源。
    • 示例:操作系统中有一个 R1、R2 资源,分别编号为 1、2
    • 进程必须按编号升序申请,即 R1 → R2,不能是 R2→ R1。
    • 破坏循环等待的条件
  2. 银行家算法:允许进程动态申请资源,在资源分配前检查安全性。
    • 拟分配资源给当前进程,计算剩余资源数量是否能满足下一进程的需求。

常用技术

  • 加锁顺序:线程按一定的顺序加锁。
  • 加锁时限:线程尝试获取锁时加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁。
  • 死锁检测

③ 检测

设置检测机构,及时检测死锁的发生。

④ 解除

检测出死锁后,采取适当措施将进程从死锁状态中解脱出来。

  1. 资源剥夺:挂起某些死锁进程并剥夺资源,分配给其它死锁进程。
  2. 撤销进程:强制撤销部分或全部死锁进程并剥夺资源。
  3. 进程回退:设置还原点,让死锁进程回退到足以回避死锁,进程回退时自愿释放资源而不是被剥夺。
posted @ 2023-03-29 19:56  Jaywee  阅读(110)  评论(0编辑  收藏  举报

👇