同步互斥

原子操作:(Atomic Operation)原子操作是指一次不存在任何中断或失败的操作
要么操作成功完成,或者操作没有执行,不会出现部分执行的状态
操作系统需要利用同步机制在并发执行的同时,保证一些操作是原子操作

进程的交互关系:相互感知程度
在这里插入图片描述
互斥(mutual exclusion):一个进程占用资源,其他进程不能使用
死锁(deadlock):多个进程各自占用部分资源,形成循环等待
饥饿(starvation):其他进程可能轮流占用资源,一个进程一直得不到资源

那么怎么解决上面的问题呢?下面来说明:
首先,约定访问临界区的模式如下图:在这里插入图片描述
参照上图,我们再来描述临界区的访问规则
1.空闲则入。没有程序在临界区,任何进程可进入
2.忙则等待。有进程在临界区,其他进程均不能进入临界区
3.有限等待。等待进入临界区的进程不能无限期等待
4.让权等待(可选)。不能进入临界区的进程,应释放CPU(比如转到阻塞状态)

临界区的实现方法
1.禁用中断:
没有中断,没有上下文切换,因此没有并发;硬件将中断处理延迟到中断被启用之后。
进入临界区时禁止所有中断,并保存标志;离开临界区时,使能所有中断,并恢复标志
缺点是:禁用中断后,进程无法被停止,整个系统都会为此停下来,可能导致其他进程处于饥饿状态;临界区可能很长,无法确定响应中断所需的时间
2.软件方法:
Peterson算法:满足线程Ti和Tj之间互斥的经典的基于软件的解决方法
在这里插入图片描述
3.更高级的抽象方法:
操作系统提供了一些同步原语(中断禁用,原子操作指令等);操作系统提供了更高级的编程抽象来简化进程同步(例如锁,信号量;用硬件原语来构建)

:锁是一个抽象的数据结构(一个变量两个原语组成)
1.一个二进制变量(锁定/解锁)
2.Lock::Acquire()
锁被释放前一直等待,然后得到锁
3.Lock::Release()
释放锁,唤醒任何等待锁的进程

原子操作指令
(现代CPU体系结构都提供一些特殊的原子操作指令)
1.测试和置位(Test-and-Set)指令
从内存单元中读值
测试该值是否为1(然后返回真或假)
内存单元设置为1
2.交换指令(exchange)
交换内存中的两个值

使用测试和置位指令实现自旋锁(spinlock):
在这里插入图片描述
特点:在等待的时候会消耗CPU时间
优化方法是,如果出现等待,那么让等待的进程去等待队列,当锁被释放时,唤醒这个等待中的进程。这样的话,就实现了让权等待。

原子操作指令锁的特征
优点 :适用于单处理器或者共享主存的多处理器中任意数量的进程同步;支持多临界区
缺点:忙等待消耗处理器时间;可能导致饥饿,进程离开临界区时有多个等待进程的情况;死锁,拥有临界区的低优先级进程,请求访问临界区的高优先级进程获得处理器并等待临界区

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值