linux内核的并发与竞态的理解

一、概念理解

1.概述
对于我们的驱动程序,或一个代码片段,是可以被两个独立的进程同时执行。驱动程序,或者代码片段对cpu来说就是机器指令,显然指令是可以同时发出的。但是共享资源却不能同时使用,不然就没法统计了。

2.竞态
多个进程同时执行某一代码段,或者调用同一个驱动程序;而这一代码段涉及到对内存的分配,或者驱动程序对硬件进行访问;由于内存或者硬件资源对系统来说都是共享的,那么就容易出问题。比如A进程刚刚分配的内存还没有来得及保存,B进程又重新执行相同的代码段分配了相同的内存,进行保存,这样A进程分配的内存就丢失了。对于这样一种同时访问共享资源出现的竞争态势,称之为竞态。

3.并发
正是因为并发的状态,才导致竟态。所以,像上述描述的多个进程同时执行同一代码片段或调用同一驱动程序的状态,称之为并发状态,简称并发。当然并发来源不止这些,比如:内核是可抢占的,当前驱动程序很容易丢失对cpu的独占,而拥有cpu的进程可能正在调用我们的驱动程序;设备中断是异步事件,也会导致代码并发执行。还有延迟机制如工作队列,tasklet,定时器会在未来任何时刻执行,而不管当前进程在干什么。再有热插拔,在使用过程中设备就消失了。

4.竟态通常作为对资源的共享访问结果而产生,而并发简单理解,就是进程同时执行某一代码段,而不用管其他进程是否正在访问这一代码段的状态。

二、应对策略

我们需要重新设计,使得代码要么看到已经分配好的内存,要么知道内存还没有分配或将要由其他人分配。访问管理的常见技术称为“锁定”或者“互斥”。

1.原子性操作

  • 指这一操作过程是独占cpu的,不能被打断的,所以其结果是cpu要么完成,要么失败,而不存在被中止,打断,挂起的情况。

2.信号量与互斥体

  • a.信号量就是对信号量值进行PV操作,希望进入临界区的进程需要进行P操作减1,进程继续,如果信号量值为0或者小于0,则进程必须等待知道其他人释放该信号量。对信号量的解锁通过调用V操作,增加信号量的值,并在必要的时候唤醒等待该信号量的进程,因为获取不到该信号量值的进程大部分情况都是进入睡眠状态。
  • b.如果共享资源很多,则允许多个进程同时执行,直到信号量变为0或小于0,进程才需要等待。如果共享资源只有1个,即同时只允许一个进程执行,即信号量值初始化为1,这种情况下,一个信号量就是互斥体,简称互斥。而linux内核中几乎所有的信号量均用于互斥。但是linux内核中真正的互斥
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值