等待队列_睡眠和唤醒

1.定义并初始化一个等待队列头:
DECLARE_WAIT_QUEUE_HEAD(wait_que);

wait_queue_head_t wait_que;
init_waitqueue_head( &wait_que);

2.简单休眠:
wait_event(wait_que, condition)
wait_event_timeout(wait_que, condition, timeout)
wait_event_interruptible(wait_que, condition)
wait_event_interruptible_timeout(wait_que, condition, timeout)
...

还有好多wait系列的函数;
它们的实现主体架构一致:
DEFINE_WAIT(__wait);
prepare_to_wait(&wq, &__wait, TASK_KILLABLE);
schedule();
finish_wait(&wq, &__wait);
只是其中参数有些差异,处理过程略有不同

3.高级休眠(手动休眠):
方式一:
DEFINE_WAIT(my_wait);

wait_queue_t my_wait;
init_wait(&my_wait);

prepare_to_wait(&wait_que, &my_wait, state);
可以根据自己的需要,修改state;比如独占等待标志

schedule();
//或者是同族函数;例如schedule_timeout(ret);

finish_wait(&wait_que, &my_wait);

方式二:
DECLARE_WAITQUEUE(my_wait, tsk)

__add_wait_queue(&wait_que, &my_wait);
set_current_state(state);
raw_spin_unlock_irq(&lock);
schedule();
raw_spin_lock_irq(&lock);
set_current_state(state);
__remove_wait_queue(&wait_que, &my_wait);

其实其他的休眠方式的实现都与方式二类似;
只是给用户提供了更方便的接口;
提供更底层的接口是以防提供的方法不能满足用户需求。

4.唤醒
wake_up(wait_que)
wake_up_interruptible(wait_que)
wake_up_nr(wait_que, nr)
wake_up_interruptible_nr(wait_que, nr)
wake_up_all(wait_que)
wake_up_interruptible_all(wait_que)
wake_up_interruptible_sync(wait_que)

时间: 2024-11-07 18:06:58

等待队列_睡眠和唤醒的相关文章

Linux进程的睡眠和唤醒

1   Linux进程的睡眠和唤醒 在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING.一旦一个运行中的进程时间片用完, Linux内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行. 当然,一个进程也可以主动释放CPU的控制权.函数schedule()是一个调度函数,它可以被一个进程主动调用,从而调度其它进程占用CPU.一旦这个主动放弃CPU的进程被重新调度占用CPU,那么它将从

Linux进程的睡眠和唤醒简析

COPY FROM:http://www.2cto.com/os/201204/127771.html 1 Linux进程的睡眠和唤醒 在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为TASK_RUNNING.一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行. 当然,一个进程也可以主动释放CPU的控制权.函数 schedule()是一个调度函数,它可以被

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_resume.html Linux电源管理(6)_Generic PM之Suspend功能一文中的下图. 本文主要分析平台相关的CPU睡眠和唤醒,即下电和上电流程,以及ARM底层汇编代码实现. 内核版本:3.1.0               CPU:ARM Cortex-A7 1 平台相关函数执行流程

Win10系统睡眠无法唤醒如何解决

大家都知道我们的电脑一段时间不动的话,就会自动进入睡眠状态,只要轻晃鼠标就可以进行唤醒了,可是有不少用户升级到win10系统之后,却发现睡眠无法唤醒,这是怎么回事呢?现在给大家讲解一下具体的解决方法吧. 1.A记CPU和显卡,似乎在32位上没有遇到过这个问题,但自从装了64位,偶尔就会出现该现象: 2.电扇还在转,但显示器没信号,唤醒操作后硬盘灯不亮,键盘灯正常,主机应该还在工作状态.小编尝试了很多次,最终确认是睡眠和硬件有些不兼容,可以考虑以以前的休眠模式来替代: 3.使用"控制面板"

从sys/power/state分析并实现S3C2416的睡眠和唤醒

环境: PC: debian-7.6.0 ARM CPU: S3C2416 Linux-Kernel: 3.6.0(FriendlyARM) U-boot: 1.3.4 一.问题来源 根据需要,在S3C2416上添加中断睡眠和唤醒功能,于是我就查查Linux支持S3C2416的睡眠模式: cat /sys/power/state 执行完,万万没想到:竟然是空的,该命令没有任何输出!也就是说,我的内核目前不支持任何方式的睡眠. 不可能啊!之前我用S3C2440的CPU(内核版本Linux_2_6_

linux 内核睡眠与唤醒

休眠(被阻塞)的进程处于一个特殊的不可执行状态.进程休眠由多种原因,但肯定都是为了等待一些事件.事件可能是一 段时间从文件I/O读取更多数据,或者是某个硬件事件.一个进程还由可能在尝试获取一个已被占用的内核信号量时被迫进入休眠.休眠的一个常见原因就是文件 I/O —— 如进程对一个文件执行了read()操作,而这需要从磁盘里读取.还有,进程在获取键盘输入的时候也需要等待.无论哪种情况,内核的操作都相同:进程把自己标记成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用schedule()选择

Zigbee系列 学习笔记四(睡眠及唤醒)

大家都知道2430有3种睡眠模式,pm2模式比较省功耗而且可以被定时唤醒:pm3模式最省电但是只能被外部中断唤醒.开启睡眠功能很简单: 首先确认/Texas Instruments/ZStack-1.4.3-1.2.1/Projects/zstack/Tools/CC2430DB目录下的f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE:然后在IAR的Options->C/C++Compiler->Preprocessor->Defined symbo

S3C2416睡眠后唤醒的具体细节

〇.引子 书接上回,即:S3C2416睡眠的底层实现. 话说,春梦了无痕,秋鸿有信终需醒.睡醒后的恢复操作以及恢复哪些东西,在s3c_pm_enter(suspend_state_t state)函数的后半部分有具体实现: arch/arm/plat-samsung/pm.c <span style="font-family:Courier New;">static int s3c_pm_enter(suspend_state_t state) { ...... /* re

win 10 睡眠无法唤醒

近日遇到win10系统睡眠后无法唤醒的问题,于是网上到处搜索解决办法,试了其中几个比如回退 Intel(R) Management Engine Interface 的版本.设置电源的睡眠选项以利用休眠代替睡眠等等,结果都没得到解决.无奈之下,继续搜索解决办法时,下载到了dell的SurportAssist,然后升级了一下BIOS驱动以及其它推荐的驱动,结果就好了,经过好几次实验确认是真的好了.所以记录一下,有碰到的可以借鉴. 原文地址:https://www.cnblogs.com/ydcbl