深圳Linux培训
达内深圳龙岗中心

150-1322-7143

热门课程

【深圳linux培训】对linux系统休眠的理解

  • 时间:2017-11-03
  • 发布:深圳linux培训
  • 来源:达内新闻

深圳linux培训携手深圳linux培训专家对linux系统休眠做了了一些简单的解析,希望对大家有帮助。

一、休眠的目的

简单的说,休眠是为在一个当前进程等待暂时无法获得的资源或者一个event的到来时(原因),避免当前进程浪费CPU时间(目的),将自己放入进程等待队列中,同时让出CPU给别的进程(工作)。休眠就是为了更好地利用CPU。
一旦资源可用或event到来,将由内核代码(可能是其他进程通过系统调用)唤醒某个等待队列上的部分或全部进程。从这点来说,休眠也是一种进程间的同步机制。

二、休眠的对象

休眠是针对进程,也就是拥有task_struct的独立个体。
当进程执行某个系统调用的时候,暂时无法获得的某种资源或必须等待某event的到来,在这个系统调用的底层实现代码就可以通过让系统调度的手段让出CPU,让当前进程处于休眠状态。

三、休眠操作做了什么

进程被置为休眠,意味着它被标识为处于一个特殊的状态(TASK_UNINTERRUPTIBLE或 TASK_INTERRUPTIBLE),并且从调度器的运行队列中移走。这个进程将不在任何 CPU 上被调度,即不会被运行。 直到发生某些事情改变了那个状态(to TASK_WAKING)。这时处理器重新开始执行此进程,此时进程会再次检查是否需要继续休眠如果不需要就做清理工作,并将自己的状态调整为TASK_RUNNING。

四、谁来唤醒休眠进程

进程在休眠后,就不再被调度器执行,就不可能由自己唤醒自己,也就是说进程不可能“睡觉睡到自然醒”。唤醒工作必然是由其他进程或者内核本身来完成的。唤醒需要改变进程的task_struct中的状态等,代码必然在内核中,所以唤醒必然是在系统调用的实现代码中以及各种形式的中断代码(包括软、硬中断)中。

如果在系统调用代码中唤醒,则说明是由其他的某个进程来调用了这个系统调用唤醒了休眠的进程。

五、休眠和唤醒的代码

1、休眠:wait_event
2、唤醒:wake_up

六、使用休眠的注意事项

(1) 永远不要在原子上下文中进入休眠,即当驱动在持有一个自旋锁、seqlock或者 RCU 锁时不能睡眠;关闭中断也不能睡眠,终端例程中也不可休眠。

持有一个信号量时休眠是合法的,如果代码在持有一个信号量时睡眠,任何其他的等待这个信号量的线程也会休眠。发生在持有信号量时的休眠必须短暂,而且决不能阻塞那个将最终唤醒你的进程。

(2)当进程被唤醒,它并不知道休眠了多长时间以及休眠时发生什么;也不知道是否另有进程也在休眠等待同一事件,且那个进程可能在它之前醒来并获取了所等待的资源。所以不能对唤醒后的系统状态做任何的假设,并必须重新检查等待条件来确保正确的响应。

(3)除非确信其他进程会在其他地方唤醒休眠的进程,否则也不能睡眠。使进程可被找到意味着:需要维护一个等待队列的数据结构。它是一个进程链表,其中包含了等待某个特定事件的所有进程的相关信息。

想更深入了解linux专业吗?欢迎来到我们达内,跟着达内的脚步,一起跟上的互联网信息时代的节奏,给你一个丰富多彩的人生——【深圳linux培训】

上一篇:深圳linux培训:内核对文件的读写
下一篇:【深圳linux培训】三种系统调用的方法

【深圳linux培训】磁盘分区的标识

【深圳linux培训】inode介绍

【深圳linux培训】存储设备分区

【深圳linux培训】systemtap的工作原理

选择城市和中心
贵州省

广西省

海南省