Linux内核的并发

来源:互联网 发布:重庆网络监测公司 编辑:程序博客网 时间:2024/06/06 03:54

对于多线程来说,SMP和内核抢占是多线程执行的两种场景,多个线程能够同时共享内核数据结构,因此,这些数据结构的访问必须是串行的;

 

1.自旋锁和互斥体

 

自旋锁(spinlock)和互斥体(mutex)是保护内核临界区的两种机制。自旋锁可以保证在同一个时刻只有一个线程进入临界区,其他想进入临界区的线程只能原地打转,直到第一个线程释放掉自旋锁。

使用方法如下:

 

spinlock_t mylock = SPIN_LOCK_UNLOCKED;

spin_lock(&mylock);

/*.........临界区操作.........*/

spin_unlock(&mylock);

 

 

与自旋锁不同,互斥体在其他线程等待时处于睡眠状态,使用方法如下:

 

static DEFINE_MUTEX(mymutex);

mutex_lock(&mymutex);

/*.........临界区操作.........*/

mutex_unlock(&mymutex);

 

究竟什么时候用自旋锁什么时候采用互斥体呢?

1.如果临界区需要睡眠,只能使用互斥体;

2.中断处理中,只能使用自旋锁;

 

注:自旋锁既可以锁中断,也可以锁任务调度。

 

2.原子操作

 

原子操作用于执行轻量级的操作或者一次性操作,比如修改计数器,设置位等,原子操作可以确保操作的串行化,不再需要锁进行并发处理。原子操作的实现具体与体系结构有关。

 

3.读写锁

 

这也是一种并发保护的机制,如果每个执行单元在访问临界区的时候要么读要么写临界区,但是它们不会同时进行读和写操作,可以选择这种锁。

可以允许多个读线程进入临界区,但只要一个写线程进入临界区,其他的读和写都不允许进入。

原创粉丝点击