linux内核的并发与竞态

原创 2016年08月30日 19:35:27

并发与竞态是指多个任务单元同时访问同一个资源,就会出现并发,竞态的现象。

其中多个任务单元包括中断,进程/线程,甚至多个多处理器;同一资源既包含硬件资源,也包括软件数据,比如:gpio,硬件设备... ...,软件包括全局变量等。

并发与竞态在内核的设计和驱动的设计都是非常重要的一个模块,因为当多个任务单元同时访问同一资源时,势必会造成某个数据单元的数据的异步,也就是访问错误的数据,如果放问的是指针,则甚至有可能导致系统的崩溃(访问非法内存),而造成这种结果的原因则是访问同一资源时,是并行访问,我们要解决这个问题,就必须将这种并行访问,认为的转化为串行访问,也就是当一个任务单元获取该资源时,其他的任务单元就不能访问该资源,要想访问必须等待拥有资源者将资源释放掉。

对于解决这个问题,内核提供了2个最主要的机制:信号量,自旋锁。另外还有其他的一些衍生机制,其功能都是相同的,只不过用在特定的条件下,不具有通用使用的价值,我们可以暂且了解一下,等到我们经验足够的时候,再去深入的学习。

内核编程模型通常都是结构体数据 + 对应的函数,这也是为什么底层编程的代码量少,并且内核源代码一般也都有现成的例子,我们也可以画瓢。

信号量:数据类型semaphore_t , 对应的函数则是down, up函数也就是我们常说的pv模型,p对应的就是down, v对应up函数。实际上信号量就是一个计数器,我们执行down函数的时候,信号量减1,也表示该当前任务单元获取了该资源,当sem等于0,或者小于0,则其他人物单元不能获取该资源;而执行up函数的时候正好与down函数相反,sem增加1,表示资源可以被其他任务单元获取到。

自旋锁:当信号量初始化为1的时候表示自旋锁,这也是内核中的常用手法,表示资源只能被一个任务单元获取。由于信号量允许任务单元休眠,所以,信号量只能工作在进程上下文中,不能工作在中断上下文。自旋锁也是内核设计中的一个非常有力的解决并发与竞态的手段。

自旋锁:编程模型与信号量相似,也是初始化,获取锁,释放锁,销毁锁。

自旋锁对应的数据类型:spinlock_t, 对应的函数spin_lock, spin_unlock函数,当然了还有init函数和destory函数,执行spin_lock函数则是获取到资源,而其他的任务单原则是不能再对该资源访问,只有执行过spin_unlock函数之后才表示资源可以被其他的任务单元获取,当然,如果当一个任务单元去访问该资源时,正好这个资源已经被其他的人物单元霸占着,那么在门口的这个人物单元只能在门前溜达,就好像我们等人一样,原地打转消磨时间,这也正是自旋锁,自旋的两个字的由来。

其实与并发竞态伴随的还有一个就是临界区,所谓临界区就是共享资源前后的代码,具体多大的范围,全靠程序员自己定,不过一般,都是紧挨着共享资源的代码作为临界区。

死锁是解决并发竞态时,因程序构思或者代码书写不规范等原因,造成死锁现象,在计算机上则表示为程序挂起。

具体死锁的一些特点和如何避免死锁,后边再说

出了上述两种普遍的解决方法,其实还有原子量,位操作,顺序锁。。。 。。。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux----并发与竞态

并发是指多个执行单元同时、并发被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问也很容易导致竞态。 即:同一时间多个“设备”同时访问同一个“区域”是会出错的。 但是在C...

《Linux内核并发与竞态》分析Linux2.6.29内核死锁

一、前言 1.自旋锁与信号量 自旋锁:当不能获得自旋锁时一直忙等待,既不睡眠、也不执行调度。 信号量:当不能获得信号量时,系统睡眠或执行调度(进程上下文中)。 2.自旋锁 在内核非抢占时,自旋锁相当于...

Linux C 多线程【3】--传递参数&共享进程数据

Linux多线程编程的基本的函数  1线程创建     函数原型:                     #include  int pthread_creat...

Qt 多线程之间的通信 实例 emit

Qt的信号与槽机制可以将任何继承自QObject类的对象捆绑在一起,使不同对象之间能够相互通信。...
  • hpu11
  • hpu11
  • 2017年07月09日 15:21
  • 478

linux内核并发与竞态

转自http://blog.chinaunix.net/uid-28820980-id-3868564.html (1) 并发(concurrrncy):多个执行单元同时,并行被执行,并发的执行单...

linux内核哈希链表在用户态应用

  • 2017年12月13日 08:59
  • 105KB
  • 下载

Linux内核开发之并发控制(一)

“小涛,你说十一黄金周,火车站,飞机场那些售票系统咋没一个宕掉的呢。你不宕掉也没关系,来两个卖错票的,说不定哥就去上海看世博,去北京看青梅竹马的表妹了…”小王抱怨道。 “晕死..哥鄙视你,你说都...
  • Aniu127
  • Aniu127
  • 2014年06月04日 15:38
  • 312

修改Linux内核参数提高服务器并发能力

1.参数设置 查看相关的参数 sysctl -a|grep tcp_keepalive net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepa...
  • unix21
  • unix21
  • 2013年03月31日 17:43
  • 12162

Linux内核中的并发与同步编程

Linux内核中的并发与同步编程 解决并发和同步问题对于一个支持SMP和多任务的操作系统来说是十分重要的, linux操作系统在这方面为我们提供了各种丰富的机制用于满足不同应用场景的需求. ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux内核的并发与竞态
举报原因:
原因补充:

(最多只允许输入30个字)