内核中的

来源:互联网 发布:linux 网络性能测试 编辑:程序博客网 时间:2024/06/01 07:15

访问共享资源的代码 区域称为临界区。自旋锁和互斥体是保护内核临界区的两种机制

自旋锁可以确保在同时只有一个线程进入临界区。其他进程想进入临界区的线程必须不停得原地打转,知道第一个线程释放自旋锁。这里说的线程不是内核线程,是执行的线程。

下面的例子演示了自旋锁的基本用法

#include<linux/spinlock.h>

spinlock_t mylock=SPIN_LOCK_UNLOCKED;


spin_lock(&mylock);

.........................................

spin_unlock(&mylock);

与自旋锁不同的是,互斥体进入一个被占用的临界区之前不会原地打转,而是使当前线程进入睡眠状态。如果要等待的时间较长,互斥体比自旋锁更适合,因为自旋锁会消耗CPU资源。在使用互斥体的场合,多于2次进程切换时间都可被认为是长时间,因此一个互斥体会引起本线程睡眠,而当期唤醒的时候,它需要被切换回来

因此,在很多情况下,决定使用自旋锁还是互斥体相对来说比较容易

(1)如果临界区需要睡眠,只能使用互斥体,因为在获得自旋锁后进行调度、抢占以及在等待队列上睡眠都是非法的。

(2)由于互斥体会面临竞争情况下将当前线程设置于睡眠状态,因此在中断处理函数中,只能使用自旋锁

#include<linux/mutex.h>


staticDEFINE_MUTEX(mymutex)


mutex_lock(&mymutex);

mutex_unlock(&mymutex);


互斥体接口代替了旧的信号量接口(semaphore)。互斥体接口是由-rt树演化而来。尽管如此,但是旧的信号量依然在内核和驱动程序中广泛使用,基本用法如下

#include<asm/semaphore.h>

static DECLARE_MUTEX(mysem);

down(&mysem);

....................................

up(&mysem);


原创粉丝点击