Linux 是如何实现阻塞进程功能的原理
Linux是如何实现阻塞进程功能的原理
linux等待队列wait_queue_head_t(队列头用于挂wait_queue_t)和wait_queue_t(包含进程的信息)
进程要指定挂在那个wait_queue_head_t,唤醒时也要这个wait_queue_head_t,
等待事件:
wait_event(wq,condition);//在等待队列中睡眠直到condition为真。
wait_event_timeout(wq,condition,timeout);
wait_event_interruptible(wq,condition);
wait_event_interruptible_timeout(wq,condition,timeout);
唤醒等待队列:
//可唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态的进程;
#definewake_up(x)__wake_up(x,TASK_NORMAL,1,NULL)
//只能唤醒处于TASK_INTERRUPTIBLE状态的进程
#definewake_up_interruptible(x)__wake_up(x,TASK_INTERRUPTIBLE,1,NULL)
x代表wq(为wait_queue_head_t)
队列阻塞过程:先入队列头,条件不满足就进程切换(更改进程运行状态)(不满足就退出进行像进程被唤醒的逻辑处理),进程被唤醒,wait_queue_t从队列头中移除,进程继续运行
如果有超时参数的,会在系统中申请一个定时器,定时到时调用process_timeout回调函数用于时间到了就执行该函数,自然该函数就是完成唤醒进程的功能。
process_timeout,会使进程状态更改并重新运行,运行后删除定义的定时器,之后又是回到'队列阻塞过程'的分析一样了.
https://www.cnblogs.com/ck1020/p/6938287.html(wait_event族函数浅析)
http://www.cnblogs.com/hanyan225/archive/2011/07/26/2117158.html(linux内核分析笔记----定时器和时间管理)