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内核开发之并发控制(五)

"小涛,还有多少啊,你看我本来就开玩笑似的说说火车票,飞机票的事,看MM的事,你在眉飞色舞,鸡飞狗跳的没完了呢…” "啊?怎么这样呢,本来一个寝室,做人的差别就那么大嗫,平时不好好学习,有问题了...

linux内核开发之并发控制(三)

算了,既然给你那么多秘籍了,也不在乎这剩下的两三招: 出招表五:顺序锁(seqlock) 使用顺序锁,读执行单元绝不会被写执行单元阻塞,同时写执行单元也不需要等待所有读执行单元完成读操作后...

nginx 高并发参数配置及linux内核参数优化

一、一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个...

并发过10万的TCP请求 ,对Linux内核优化配置

以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一下,如有那位高人看到配置上有问题,请给与指出! # Controls the use o...

linux内核编程之并发控制

版权声明:转载请保留出处:blog.csdn.net/gentleliu。邮箱:shallnew*163.com】 只要并发的多个执行单元存在对共享资源的访问,竞态就可能发生。在 Linux 内...

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

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

Linux内核态抢占机制分析

【摘要】本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别。接着分析Linux下有两种抢占:用户态抢占(User Pree...
  • myxmu
  • myxmu
  • 2012-10-08 18:08
  • 506

Linux内核态抢占机制分析

摘要】本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别。接着分析Linux下有两种抢占:用户态抢占(User Pree...

Linux内核态与用户态通信的常用方法

前言 最近做的事情很多地方用到Linux驱动层与应用层的通信,在此总结下常见的并且在我工作中用到的通信方法。 总结 由于每种方法都可以找到大量的示例代码,同时还有详细的函数手册,我就...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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