操作系统系列笔记(五) - 同步互斥, 信号量和管程

同步互斥

背景

并发进程在多个进程间有资源共享, 导致执行过程是不确定性和不可重现的, 程序错误可能是间歇性发生
原子操作: 是指一次不存在任何中断或失败的操作
操作系统需要利用同步机制, 在并发执行的同时保证一些操作是原子操作
几个状态:
互斥: 一个进程占用资源, 其他进程不能使用
死锁: 多个进程各自占用部分资源, 形成循环等待
饥饿: 其他进程可能轮流占用资源, 一个进程一直得不到资源

临界区

临界区: 是进程中访问临界资源的一段需要互斥执行的代码
进入区, 检查可否进入临界区的一段代码, 如可进入, 设置相应正在访问临界区的标志
退出区, 清除正在访问临界区的标志
剩余区, 代码中的其他部分, 和同步互斥没关系
临界区访问规则: 空闲则入, 忙则等待, 有限等待, 让权等待
临界区的实现方法有三种: 禁用中断, 软件方法, 更高级的抽象方法
禁用硬件中断: 没有中断, 没有上下文切换, 因此没有并发, 硬件将中断处理延迟到中断被启用之后, 缺点进程无法被停止, 可能导致其他进程处于饥饿, 临界区可能很长中断不能及时响应, 要小心使用
软件方法: Peterson算法, Dekkers算法, Eisenberg和McGuire, 复杂, 需要两个进程间的共享数据项, 是忙等待, 浪费CPU时间
更高级的抽象方法: 基于硬件的一些同步原语, 例如原子操作指令
原子操作指令: 测试和置位(Teat and Set)指令, 交换指令(Exchange), 使用TS指令实现自旋锁(Spinlock), 无忙等待锁
锁: 一个抽象的数据结构, 一个二进制变量, 和两个操作原语
原子操作指令锁的特征, 适用于单处理器或共享主存的多处理器中任意数量的进程同步, 简单, 支持多临界区, 缺点忙等待消耗CPU时间, 可能导致饥饿, 可能死锁
总结, 禁用中断, 仅用于单处理器, 软件方法, 复杂, 原子操作指令, 单处理器或多处理器均可

信号量与管程

信号量与管程都属于解决同步问题的高级抽象方法

信号量(Semaphore)

信号量: 是操作系统提供的一种协调共享资源访问的方法, 早期操作系统的主要同步机制, 现在很少用
信号量由一个整型变量和两个原子操作组成, P操作(减少), V操作(增加), 被保护的整数变量, 初始化完成后, 只能通过P和V操作修改, 由操作系统保证P和V操作的原子性
P可能阻塞, V不会阻塞
信号量分为两种, 二进制信号量和资源信号量(任何非负数)

管程(Moniter)

管程: 是一种用于多线程互斥访问共享资源的程序结构, 采用面向对象方法, 简化了线程间的同步控制, 任一时刻最多只有一个线程执行管程代码
正在管程中的线程可临时放弃管程的互斥访问
管程的组成: 一个锁, 控制管程代码的互斥访问, 0或多个条件变量, 管理共享数据的并发访问
条件变量是管程内部的等待机制, 进入管程的线程因资源占用而进入等待状态, 每个条件变量表示一种等待原因
Hansen管程和Hoare管程, 哲学家就餐问题, 读者-写着问题, 略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值