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内核分析笔记----定时器和时间管理)

相关推荐