【操作系统学习】同步机制(十)

1. 信号量

信号量(Semaphore)是一个整数,包含两个操作P()和V()。其中P()操作导致sem-1,如果sem<0线程等待,否则继续。V()操作导致sem+1,如果sem<=0,唤醒一个等待的线程。

信号量是被保护的变量

  • 初始化完成后,唯一改变一个信号量的值的办法是通过P()和V()
  • 操作必须是原子的

信号量的类型

  • 二进制信号量:可以是0或1
  • 一般/计数信号量:可取任何非负值
  • 两者相互表现(给定一个可以实现另一个)

信号量的实现

Semaphore::P() { 
sem--; 
if (sem < 0) { 
Add this thread t to q; 
block(p); 
classSemaphore { 
int sem; 
WaitQueue q; 
Semaphore::V() { 
sem++; 
if { 
Remove a thread t from q; 
wakeup(t);


2. 管程

3. 经典同步问题

4. 死锁

死锁:一组阻塞的进程持有一种资源等待获取另一个进程所占有的一个资源。

· 流 量 只 在 一 个 方 向 。 
· 桥 的 每 个 部 分 可 以 看 作 为 一 个 资 源 。 
· 如 果 死 锁 , 可 能 通 过 一 辆 车 倒 退 可 以 解 决 ( 抢 占 资 氵 原 和 回 滚 ) 
· 如 果 发 生 死 锁 , 可 能 辆 车 必 须 都 倒 退 
可 能 发 生 饥 饿

可重复使用的资源

  • 在一个时间只能一个进程使用且不能被删除
  • 进程获得资源,后来释放由其他进程重用
  • 处理器,I/O通道,主和副存储器,设备和数据结构,如文件,数据库和信号量
  • 如果每个进程拥有一个资源并请求其它资源,死锁可能发生

使用资源

  • 创建和销毁
  • 在I/O缓冲区的中断,信号,消息,信息
  • 如果接收消息阻塞可能会发生死锁
  • 可能少见的组合事件会发生死锁

 

死锁产生的条件

死锁可能出现如果四个条件同时成立

  • 互斥:在一个时间只能有一个进程使用资源。
  • 持有并等待:进程保持至少一个资源正在等待获取其他进程持有的额外资源。
  • 无抢占:一个资源只能被进程资源释放,进程已经完成了它的任务之后。
  • 循环等待:存在等待进程集合{P0,P1,….PN},互相等待。


死锁处理方法

  • 死锁预防
  • 死锁避免
  • 死锁检测
  • 死锁恢复


死锁预防

  • 限制申请方式
    • 互斥(没办法)
    • 占用并等待
      • 需要进程请求并分配所有资源,它开始执行之前或允许进程请求资源仅当进程没有资源
      • 资源利用率低;可能发生饥饿
    • 无抢占
      • 如果进程占有某些资源,并请求其它不能被立即分配的资源,则释放当前正占有的资源
      • 被抢占资源添加到资源列表中
      • 只有当它能狗获得旧的资源以及它请求新的资源,进程可以得到执行
    • 循环等待
      • 等所有资源类型进行排序,并要求每个进程按照资源的顺序进行申请。


死锁避免

  • 需要系统具有一些额外的先验信息提供
    • 最简单和有效的模式是要求每个进程声明它可能需要的每个类型资源的最大数目。
    • 资源的分配状态是通过限定提供与分配的资源数量,和进程的最大需求
    • 死锁避免算法动态检查的资源分配状态,以确保永远不会有一个环形等待状态。
  • 银行家算法
    • 银行家算法通过尝试寻找允许每个进程获得的的最大资源并结束(把资源返还给系统)的进程请求的一个理想执行时序,来决定一个状态是否安全。不满足这些要求的时序的状态都是不安全的。


死锁检测

  • 允许系统进入死锁状态
  • 死锁检测算法
  • 恢复机制


死锁恢复

  • 终止所有的死锁进程
  • 在一个时间内终止一个进程直到死锁消除
  • 终止进程的顺序应该是
    • 进程的优先级
    • 进程允许了多久以及需要多少时间才能完成
    • 进程占用的资源
    • 进程完成需要的资源
    • 多少进程需要被终止
    • 进程是交互还是批处理


5. 进程间通信(IPC)

  • IPC facility提供2个操作
    • Send(message) 消息大小固定或可变
    • Receive(message)
  • 如果P和Q想通信,需要
    • 在它们之间建立通信链路
    • 通过send/receive交换消息
  • 通信链路的实现
    • 物理(共享内存,硬件总线)
    • 逻辑(逻辑属性)


直接通信

  • 进程必须正确的命名对方
    • Send 发送消息到进程P
    • Receive 从进程Q接收消息
  • 通信链路的属性
    • 自动建立链路
    • 一条链路恰好对应一对通信进程
    • 每对进程之间只有一个链接存在
    • 链接可以是单向的,但通常为双向的


间接通信

  • 定向从消息队列接收消息
    • 每个消息队列都有一个唯一的ID
    • 只有它们共享了一个消息队列,进程才能够通信
  • 通信链路的属性
    • 只有进程共享一个共同的消息队列,才建立链路
    • 链接可以与许多进程相关联
    • 每对进程可以共享多个通信链路
    • 连接可以是单向或双向


消息队列可以是阻塞的和非阻塞的。

队列的消息被附加到链路;可以是以下三种方式之一

  • 0容量
    • 发送方必须等待接收方
  • 有限容量 -n messages的有限长度
    • 发送方必须等待,如果队列满
  • 无限容量 - 无限长度
    • 发送方不需要等待

(1) 信号

  • 软件中断通知事件处理
  • 接收到信号会发生什么
    • Catch:指定信号处理函数被调用
    • Ignore:依靠操作系统的默认操作
    • Mask:闭塞信号因此不会传送
  • 不足
    • 不能传输要交换的任何数据

Process X 
(Signal handles) 
1. register handles 
2. dispatch to h«ndler 
kernel: 
System call interface 
{read(), write(), sigaltstack() . 
deliver signal 
scheduler 
sta abl 
ste all 
I/O facilities 
signal handler 
stack 
instruction set 
filesystem (2) 管道

file descriptor O stdin, I stdout, 2 stderr 
1 
Shell 
2 
3 
% Is I more 
Is 
stdout 
more 
stdin

(3) 消息队列

  • 消息队列按FIFO来管理消息
    • Message 作为一个字节序列存储
    • Message Queues:消息队列

Post Message Queues 
pend 
"message

(4) 共享内存

  • 每个进程都有私有地址空间
  • 在每个地址空间中,明确地设置了共享内存段
  • 优点
    • 快速、方便地共享数据
  • 不足
    • 必须同步数据访问

addr space Of 
process I 
attach(); 
page tbl 
最 快 的 万 法 
DRAM 
addr space Of 
processJ 
main() { 
attach(); 
page tbl 
一 个 进 程 写 另 外 一 个 进 程 立 可 见 
没 有 糸 统 调 用 干 预 
没 有 数 据 复 制 
不 提 供 同 步 
由 程 序 员 提 供 同 步

posted @ 2021-12-28 10:12  no_forget  阅读(72)  评论(0编辑  收藏  举报