linux内核之内核同步

首先简单说明一下内核为什么要进行同步


同步的主要目的是为了解决资源竞争的问题,特别是在smp体系结构,内核可抢占模式下,抢占无处不在,多核并行执行程序

随时随地都有可能访问临界资源,如果不好好处理,必然会出现很多问题。


比如,在单核情况下,某个进程搜索task链表,另一个进程插入或删除或修改task链表,那么可能会出现同时(内核抢占)访问task链表的情况,那么搜索task的进程可能就会有错误的结果,


再比如,在多核情况下,还是上面的情况,两个进程访问task链表,并且在两个CPU上,那么会出现真正的同时访问task的可能,更加容易出错。

更不要说多核内核可抢占情况下,出现错误的可能会更大。


所以,在访问可能会被其他进程访问的资源时,需要做到同步。需要注意的事,在编码阶段和开发前期就要考虑好各种同步情况,一旦在开发结束后发现同步bug将会非常难以调试(因为不容易重现)。


而原子操作与锁能够很好的解决这个问题


内核在处理同步问题上有几种非常好用的方法,下面我慢慢介绍

linux内核之内核同步_第1张图片

linux内核之内核同步_第2张图片

原子操作一般用于对整形数据的操作,保证操作过程中不会被打断


自旋锁

linux内核之内核同步_第3张图片

linux内核之内核同步_第4张图片

自旋锁之间的代码能保证不被竞争,但是自旋锁不能睡眠,所以自旋锁最好用在耗时少且不能睡眠的过程中,比如中断(注意,自旋锁用来锁数据而不是代码)


信号量

linux内核之内核同步_第5张图片linux内核之内核同步_第6张图片


读写信号量

linux内核之内核同步_第7张图片

互斥体

linux内核之内核同步_第8张图片

一般情况下,互斥体能完全代替信号量,只有当有特殊要求,能发出多个竞争资源时用信号量


完成变量


linux内核之内核同步_第9张图片

互斥变量能取代完全变量


顺序和屏障

linux内核之内核同步_第10张图片


还有 大内核锁 顺序锁 禁止内核抢占等方法

但是用少这里就不介绍了


最常用的还是自旋锁和互斥信号量还有原子操作


你可能感兴趣的:(linux内核之内核同步)