linux 休眠

转载 2012年03月21日 08:55:45
 

1. 休眠的原则

 

第一条: "永远不要在原子上下文中进入休眠" (LDD3 p149)

第二条: 当线程被唤醒时,应当检查等待的条件是否为真

第三条: 确保即将休眠的线程一定会被唤醒

 

2. 简单休眠

 

wait_event(queue, condition) // 不可中断的休眠,不符合休眠的原则(第一条)不推荐

wait_event_interruptible(queue, condition) // 接受终端的休眠,推荐

wait_event_timeout(queue, condition, timeout) // 不可中断,定时唤醒

wait_event_interruptible_timeout(queue, condition, timeout) // 接受中断,定时唤醒

 

约定: 对于不可中断的休眠,使用wait_up唤醒,对于接受中断的休眠,使用wait_up_interruptible唤醒

 

3. 阻塞和非阻塞标志

 

file文件结构指针filp的成员f_flags可以设定进程的阻塞和非阻塞标志,如果filp_flags & O_NONBLOCK为真,进程被标志为非阻塞的,反之进程被标志为可阻塞的

 

4. 高级休眠

 

第一步: 初始化wait_queue_t结构

             静态初始化 DEFINE_WAIT(my_wait);

             动态初始化 wait_queue_t my_wait;

                              init_wait(&my_wait);

 

第二步: 设置进程状态

              void prepare_to_wait(wait_queue_head_t *queue,

                                                  wait_queue_t *wait,

                                                  int state);

              state就是要设置的新状态,它可以是TASK_INTERRUPTIBLE(可中断休眠状态)和TASK_UNINTERRUPTIBLE(不可中断休眠)

 

第三步:  让出处理器,开始休眠

              if (!condition)

                      schedule();

 

第四步: 如果condition为true,表示进程不需要休眠了,要完成一些清理工作

              void finish_wait(wait_queue_head_t *queue, wait_queue_t *wait);

 

5. 独占等待

 

当调用wake_up时,所有在等待队列中的线程都被唤醒,当等待队列中的线程很多的时候,这样唤醒的代价就会显得很"疯狂"

为了防止这种情况,驱动程序员可以考虑在等待队列入口为休眠线程设置WQ_FLAG_EXCLUSIVE标志,这样在wake_up的时候,操作系统唤醒第一个具有WQ_FLAG_EXCLUSIVE标志的线程后就停止唤醒操作

 

6. 缓冲区操作

 

这里的缓冲区操作是仅仅是策略问题,而非机制问题,为了看懂scullpipe,对缓冲区操作应该有清晰的认识

 

需要注意的是: 读写指针都不会读写缓冲区的结尾地址,缓冲区的结尾地址仅仅用于回卷;

                      因为读指针始终在追赶写指针,是写指针让读写指针能够相遇,也就是写指针不可能超过读指针,除非读指针读完所有数据,与写指针重逢;

                       当读写指针相遇,表示缓冲区为空。

禁止Linux自动休眠

方法很简单,但是原理很复杂。 系统设置-->安全与隐私-->去掉唤醒与黑屏密码唤醒等类似选项 还可以通过脚本实现,具体方法在网上查找;比较麻烦,暂时不深究,以后用到继续深究。...
  • dreamwbt
  • dreamwbt
  • 2016年11月27日 00:01
  • 2084

linux应用层定时器与休眠

linux下定时器的使用 -- alarm() & setitimer():1、alarm-------------------------------------------    如果不要求很精确...
  • hannick
  • hannick
  • 2007年12月19日 22:36
  • 3030

linux禁止休眠

配置文件xorg.conf生成并修改 查看是否有xorg.conf文件 # cd /etc/X11/ # ls 如果没有,需要重新生成。 备注:千万不要自己创建新文件,不然重启电脑将发现不能...
  • lxy_yunge
  • lxy_yunge
  • 2016年11月18日 13:29
  • 2732

android /linux休眠与唤醒(二)

如何进入休眠 1. 当所有wake_lock被释放,自动进入休眠; 2. echo mem > /sys/power/state;(也需要等待wake_lock全部释放才能进入suspend)...
  • lbaihao
  • lbaihao
  • 2015年08月14日 20:01
  • 1210

如何设置ubuntu的自动休眠时间

相信很多在学习linux的过程中,总会遇到各种各样的系统设置问题,简单的花一分钟了解一下怎样解决linux系统长时间就会休眠的这个问题吧...
  • u011401496
  • u011401496
  • 2014年11月17日 17:33
  • 5523

linux内核休眠与唤醒

转自:http://blog.csdn.net/zhandoushi1982/article/details/5759050       在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态...
  • njuitjf
  • njuitjf
  • 2014年01月08日 11:36
  • 1961

linux 休眠唤醒流程

Linux Suspend主要有以下三步:    1) 冻结用户态进程和内核态任务     2) 调用注册的设备的suspend的回调函数,顺序是按照注册顺序     3) 休眠核心设备和使CPU进入...
  • qwaszx523
  • qwaszx523
  • 2016年09月24日 17:09
  • 962

linux休眠、待机的区别及相关命令笔记

休眠挂起至硬盘,待机挂起至内存。 pm(power-manager) 立刻关机: sudo halt sudo init 0 sudo shutdown -h now sudo shutd...
  • philosophyatmath
  • philosophyatmath
  • 2015年09月14日 21:41
  • 1013

嵌入式 linux下sleep函数到底是线程休眠还是进程休眠

linux下的sleep函数原型为:         unsigned int sleep(unsigned int seconds); 注:线程必须是分离状态哦   使用gcc的...
  • skdkjxy
  • skdkjxy
  • 2014年01月10日 15:24
  • 2241

Linux休眠与唤醒

在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务;(2)调用注册的设备的suspend的回调函数;(3)按照注册顺序休眠核心设备和使CPU进入休眠态。      冻结进程是内...
  • liaokesen168
  • liaokesen168
  • 2016年05月06日 16:07
  • 649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 休眠
举报原因:
原因补充:

(最多只允许输入30个字)