Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55973
  • 博文数量: 17
  • 博客积分: 370
  • 博客等级: 一等列兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-14 10:11
文章分类
文章存档

2011年(17)

我的朋友

分类: LINUX

2011-02-16 11:02:48

#define   DECLARE_WAITQUEUE(name,   tsk)       \
wait_queue_t   name     =__WAITQUEUE_INITIALIZER(name,   tsk)
#define   __WAITQUEUE_INITIALIZER(name,   tsk)   {         task:     tsk,             task_list:   {   NULL,   NULL   },       __WAITQUEUE_DEBUG_INI(name)}

它的解释是:
通过DECLARE_WAITQUEUE宏将等待队列项初始化成对应的任务结构,并且用于连接的相关指针均设置为空。其中加入了调试相关代码。


进程通过执行下面步骤将自己加入到一个等待队列中:
1) 调用DECLARE_WAITQUEUE()创建一个等待队列的项;
2) 调用add_wait_queue()把自己加入到等待队列中。该队列会在进程等待的条件满足时唤醒它。在其他地方写相关代码,在事件发生时,对等的队列执行wake_up()操作。
3) 将进程状态变更为: TASK_INTERRUPTIBLE or TASK_UNINTERRUPTIBLE。
4) 如果状态被置为TASK_INTERRUPTIBLE ,则信号唤醒进程。即为伪唤醒(唤醒不是因为事件的发生),因此检查并处理信号。
5) 检查condition是否为真,为真则没必要休眠,如果不为真,则调用scheduled()。
6) 当进程被唤醒的时候,它会再次检查条件是否为真。真就退出循环,否则再次调用scheduled()并一直重复这步操作。
7) condition满足后,进程将自己设置为TASK_RUNNING 并通过remove_wait_queue()退出。
阅读(1068) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~