文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>内核竞争(linux)

内核竞争(linux)

时间:2009-08-15  来源:hongliangliu

内核竞争(linux)

1、 临界区和竞争条件

临界区(critical regions),就是访问和操作共享数据的代码段,即,所谓的临界区就是一组操作指令或者更直观的讲就是代码段。例如:

Static g_var = 0;

Critical_function(inte n)

{

       g_var = n;

       ……………………

       g_var++;

}

假设g_var是一个全局变量,如果有多于一个线程调用cirtical_function()函数时,我们可以看做该函数这段代码为一个临界区。更微观的说法其实g_var = 10,g_var++才是一个真正的临界区。

多个执行线程并发的访问同一个资源通常是不安全的,为了避免在临界区内并发访问,必须保证这些代码原子地执行——即,代码在执行结束前不可被打断,就如同整个临界区是一个不可分割的指令一样。如果两个执行线程有可能处于同一个临界区中,那么就会有问题。

例如:有两个线程都会调用Critical_function()函数,即,两个线程都会对全局变量g_var操作(不一定是两个线程都调用该函数,只要是都对全局变量执行操作既可)。如果不加保护,那么可能线程1刚执行一部分操作时,线程2介入,在线程1没执行完所有操作时开始执行线程2中的操作,导致g_var的值不可预测。

       但是如果确实两个线程都需要做这样的操作,而且也的确会发生临界区冲突,那么就叫做“竞争条件”。

2、 保护内容

我们到底要保护什么,是保护代码还是保护代码所操作的共享资源?答案当然是后者。

我们一定要非常清楚,想保护什么,虽然临界区是一组指令,但是如果不涉及到操作共享资源的时候指令即使被打断了我们也不关心,因为进程切换的时候指令会压栈,下次重新调度的时候会恢复的。

       所以我们很明确我们要保护的是共享资源,而不是代码(即指令)。

3、 Linux锁机制

Linux内核在保护临界区时用到了锁机制,包括自旋锁、原子操作、信号量等。

3.1原子操作

       原子操作可以保证指令以“原子的方式”执行,即,指令在执行过程中不被打断。原子操纵分为bitops(位)和atomic_t(整数)类型。

       原子操作相对比较简单,不详述。

3.2   自选锁

Linux内核中最常见的锁是自旋锁(spin lock),自旋锁最多只能被一个可执行线程持有。如果一个执行线程试图获得一个“被征用”的自旋锁,那么改线程就会一直进行忙等待。

自旋锁用在多个CPU系统中,当一个线程在一个cpu上正使用资源,而另一个线程在另一个cpu上忙等待这个资源的时候,就会用自旋锁来保护临界资源,在单处理器系统中自旋锁函数扩展为空。(未完,待续)

相关阅读 更多 +
排行榜 更多 +
勇敢的哈克中文版

勇敢的哈克中文版

飞行射击 下载
狙击突袭特种行动手机版

狙击突袭特种行动手机版

飞行射击 下载
射箭小子

射箭小子

飞行射击 下载