Chinaunix首页 | 论坛 | 博客
  • 博客访问: 844513
  • 博文数量: 489
  • 博客积分: 475
  • 博客等级: 下士
  • 技术积分: 3087
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 16:28
文章分类

全部博文(489)

文章存档

2013年(7)

2012年(301)

2011年(181)

分类:

2011-11-26 11:15:44

原文地址:信号量与自旋锁 作者:

信号量
<1>.信号量的定义与初始化
struct semaphore sem; //定义一个信号量
void semahore_init(struct semaphore *sem,int val); //初始化一个信号量
void init_MUTEX(struct semaphore *sem); //初始化一个互斥锁,初始值为1。
void init_MUTEX_LOCKED(struct semaphore *sem); //初始化一个互斥锁,初始值为0,开始就处于锁定状态。
DECLARE_MUTEX(name); //定义一个信号量,并初始化为1
DECLARE_MUTEX_LOCKED(name);  //定义一个信号量,并初始化为1
<2>.获取信号量
void down(struct semaphore *sem);
获取信号sem,可能会导致进程睡眠,因为不能在中断上下文使用该函数,该函数将把sem的值减1,如果信号量
sem的值非零,则立刻返回。否则调用者被挂起,知道别的进程释放该信号。
void down_interrupt(struct semaphore *sem);
获取信号sem,该函数将把sem减1操作,如果信号sem的值非零,则立刻返回,否则将被置为TASK_INTERRUPTIBLE
类型的睡眠状态,该函数正常返回值为0,如果被信号打断,返回-EINTR;
void down_killable(struct semaphore *sem);
获取信号sem,如果信号不可用,进程将进入到TASK_KILLABLE类型的睡眠状态。
【注】down()函数已不建议继续使用,建议使用down_killable,down_interrupt()函数。
<3>.释放信号量
void up(struct semaphore *sem);
该函数释放信号量sem,即把sem的值加1操作,如果sem的值为非整数,说明有任务等待信号量,唤醒等待任务。
自旋锁
自旋锁最多只能被一个可执行单元持有,自旋锁不会引起调用者睡眠,如果一个进程试图获取一个被占有的自旋
锁,该进程就会一直进行忙循环,一直等待下去,直到自旋锁持有者,释放了该锁。
<1>.初始化自旋锁
spin_lock_init(x);
该宏用于初始化一个自旋锁X,自旋锁在使用前必须初始化。
spin_lock(x);
获取自旋锁lock,如果成功,立即获得锁,并马上返回,否则它将一直自旋在哪里。
spin_trylock(lock);
试图获取自旋锁lock,如果获取成功则返回真,否则立即返回假,它不会一直等待。
spin_unlock(lock);
释放自旋锁lock,它与spin_trylock或者spin_lock配对使用。
信号量与自旋锁的比较
<1>.信号量可能允许有多个持有者,自旋锁只能有一个持有者。
<2>.信号量适用于保持时间较长的情况,而自旋锁适用于保持时间非常短的情况。
等待队列
可以使用等待队列实现进城的阻塞,等待队列可以看做是保存进城的容器。当进程阻塞时把进程放入到等待队列。
当唤醒进程时,从等待队列中取出进城。
<1>.等待队列的定义与初始化
wait_queue_head_t my_queue;  //定义等待队列
init_waitqueue_head(&my_queue); //初始化等待队列
DECLARE_WAIT_QUEUE_HEAD(my_queue); //定义并初始化等待队列
<2>.有条件睡眠
wait_event(queue,condition);
当condition为真时,立即返回;否则进城进入到TASK_UNINTERRUPTIBLE模式的睡眠,并挂起queue所指定的队列上。
wait_event_interruptible(queue,condition);
当condition为真时,立即返回;否则进城进入到TASK_INTERRUPTIBLE模式的睡眠,并挂起queue所指定的队列上。
wait_event_killable(wait_queue_t queue,condition)
当condition为真时,立即返回;否则进城进入到TASK_KILLABLE模式的睡眠,并挂起queue所指定的队列上。
<3>.唤醒进城
wake_up(wait_queue_t *q);
从等待队列q中唤醒状态为TASK_UNINTERRUPTIBLE,TASK_INTERRUPTIBLE,TASK_KILLABLE的所有进城。
wake_up_interruptible(wait_queue_t *q);
从等待队列q中唤醒状态为TASK_INTERRUPTIBLE的进城。

 
阅读(621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~