操作系统填坑

自旋锁,互斥锁,条件变量,信号量

后续再来排版先记录



产生

提示:这里可以添加本文要记录的大概内容:

一条程序代码,比如a = a +1,多条CPU指令,多线程(多进程),操作系统中断机制,对同一个内存进行操作。


提示:以下是本篇文章正文内容,下面案例可供参考

一、实现基础

修改与测试指令合并为一条指令:TestAndSet指令,CompareExchange指令等,返回修改之前的内存数值。即CPU指令原子性。

二、自旋锁

利用原子的CPU指令,Lock函数构建一个while循环,while(testandset (_lock,0)== 1){},这样边界函数使用前调用Lock,如果其他函数已经调用过Lock就会自旋在while中,等待被暂停为就绪状态。

三、互斥锁

自旋锁,浪费性能CPU被占用,利用操作系统的系统调用方式,弄一个阻塞队列,将线程阻塞,以及一个唤醒的系统调用,提升性能。

四、条件变量

解决同步问题,即父线程等待子线程;或者生产者消费者问题。
可认为是一个互斥锁的升级版本。一般先用一个lock_b,然后一个wait(条件变量a,Lock_b)函数内部流程:1.释放lock_b,阻塞在条件变量a上;2.等待唤醒,3.唤醒后内部再次获取Lock_b。signal(条件变量_a)函数内部流程:1.通知阻塞在条件变量a上线程为就绪状态,等待cpu调用。

解决父等子问题:利用一个标记done,加lock,判定done == 0,则加条件变量wait函数,unlock;子进程,lock,done = 1,unLock。
解决生产者消费者问题:生产者:Lock,判断条件(数量),wait(empty,lock),通知signal(full),生产操作,unLock;消费者:Lock,判断条件(数量),wait(full,lock),通知signal(empty),获取操作,unLock;

在这里插入图片描述

五、信号量

互斥锁+条件变量+运行条件数量。代表一个共享资源数量,且判断条件也是这个数量,加一个条件变量代表的阻塞队列。

wait:共享资源-1,负数则阻塞
signal(post):共享资源+1,通知阻塞队列取一个为就绪。

信号量为初始化为1,二值信号量,行程互斥锁。父线程wait,子线程signal。
多生产者消费者:
usequeue = 1,用于队列使用的互斥信号量队列
empty代表有几个空位置资源的信号量队列
full代表已经生产了几个资源的信号量队列

生产者:
while(1)
sem_wait(empty)
sem_wait(usequeue)
put(data)
sem_post(usequeue)
sem_post(full)
消费者:
while(1)
sem_wait(full)
sem_wait(usequeue)
get(data)
sem_post(usequeue)
sem_post(empty)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值