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_休眠唤醒

  • 2011年09月21日 14:25
  • 56KB
  • 下载

Android or Linux 的休眠与唤醒

Linux休眠/唤醒简介 休眠/唤醒在嵌入式Linux中是非常重要的部分,嵌入式设备尽可能的进入休眠状态来延长电池的续航时间。这篇文章就详细介绍一下Linux中休眠/唤醒是如何工作的,还有Andro...

linux内核休眠与唤醒

 转自http://blog.csdn.net/zhandoushi1982/article/details/5759050 在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内...

Linux系统的休眠与唤醒简介

系统挂起(Suspend)是电源管理(APM&ACPI)的一个特性,给用户带来了很大的方便。Linux在2.6系列核心中对电源管理有了较好的支持,下面就谈谈Linux对系统挂起的支持情况。 Li...

linux 休眠唤醒流程

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

Linux设备驱动程序学习(5) -高级字符驱动程序操作[(2)阻塞型I/O和休眠]

这一部分主要讨论:如果驱动程序无法立即满足请求,该如何响应?(65865346) 一、休眠 进程被置为休眠,意味着它被标识为处于一个特殊的状态并且从调度器的运行队列中移...
  • sadamoo
  • sadamoo
  • 2012年09月07日 17:10
  • 1704

Linux设备驱动程序学习(5)-高级字符驱动程序操作[(2)阻塞型I/O和休眠]

Linux设备驱动程序学习(5) -高级字符驱动程序操作[(2)阻塞型I/O和休眠]   这一部分主要讨论:如果驱动程序无法立即满足请求,该如何响应?(65865346) ...
  • tigerly
  • tigerly
  • 2014年04月03日 15:21
  • 325

linux内核的等待队列使用方法,wait_queue_head_t,进程休眠

阅读vhost的时候,发现使用了大量的等待队列和poll,这里温故而知新一下。注:wait_queue_t是等待在wait_queue_head_t队列中的等待元素当你在用户空间需要读写一大片数据的时...

linux内核休眠与唤醒

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

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