`
xitong
  • 浏览: 6198616 次
文章分类
社区版块
存档分类
最新评论

linux中的睡眠

 
阅读更多

在linux的内核中,有很多睡眠相关的函数,比如sleep_on,当然也有wake_up,睡眠的意义就是不能再运行了,那么睡眠总要有个地方啊,我们睡眠都要有个床,按照人性化设计出来的linux内核也应该有个睡眠用的床,这是对的,但是,睡眠一定要在床上吗?非也!
就好像现代的白领们,习惯就很不好,总喜欢伏案而小憩,这样不但不解乏而且还不利于健康,不管怎么说也算是一个休息方式,另外闲着没啥事的时候也会这样,但是躺在床上的睡眠一般都是必须的睡眠,而且都是确定的,不是临时的,比如如果你想睡上一觉,那么你就要上床,正好和伏案相反,伏案的意义是当时不是你睡觉的时间,只是万不得已了,太困了才勉强这样的,这些人要么是自己作的,要么就是人民的公仆,很累的那种。我们看一下linux内核中进程的睡眠,也就是这两种,一种是睡眠在队列,另一种就是睡眠在原地,其中第一种睡眠在队列就是:
static long __sched sleep_on_common(wait_queue_head_t *q, int state, long timeout)
{
unsigned long flags;
wait_queue_t wait;
init_waitqueue_entry(&wait, current); //先给这个进程铺张床
__set_current_state(state); //要睡了
spin_lock_irqsave(&q->lock, flags);
__add_wait_queue(q, &wait); //把床搬到一个统一的睡觉的地方
spin_unlock(&q->lock);
timeout = schedule_timeout(timeout); //睡吧
spin_lock_irq(&q->lock);
__remove_wait_queue(q, &wait); //醒了之后把床搬离睡觉的宿舍
spin_unlock_irqrestore(&q->lock, flags);
return timeout;
}
往往这种睡眠的都是一些默默无闻的进程,它们遇到一种特殊情况必须要睡一会,因为除此之外没有别的事情要它们做了,比如要获得一个资源,但是又获取不到,那么就只能睡觉了,linux内核用这种方式管理这大量的进程以使得不会发生和混乱,linux内核为每一种可能的资源都安排了一个宿舍,也就是一个睡眠队列,然后哪个进程由于这个资源需要睡眠,就搬到这间宿舍来睡一会,如果资源可以满足了,那么就是把所有睡着的进程全部唤醒,让它们一起来竞争资源,linux内核也只能用这种方式来兼顾公平了,这样大家都没有意见,毕竟内核不可能记住每一个进程的名字来纷纷唤醒它们,因为它们很平淡,只能这样。
那么还有一种进程可以随意睡眠,只要它们想睡就可以,这种进程一般都是内核守护线程,往往是完成一些重要又特殊工作的内核线程,内核当然会记住它们每一个的名字了,它们睡眠就不需要特定的宿舍了,比如pdflush线程会这么做:
for ( ; ; ) {
struct pdflush_work *pdf;
set_current_state(TASK_INTERRUPTIBLE); //要睡了
...
schedule(); //直接睡眠
...
(*my_work->fn)(my_work->arg0); //被唤醒以后执行工作
...
}
毕竟这些内核线程一直运行,它们很累,又不能回家休息,那么就只能伏案而小憩了,当内核需要它们工作时,因为内核记着它们的名字,于是直接将它们唤醒就是了。另外还有一种进程,虽然在集体宿舍登记了要睡眠了,但是事实上却只在那里挂个名字,并不真睡,而是马上出门继续工作,内核当然不反对了,当内核要唤醒宿舍的进程们时,还将包括它的名字,内核只按照名字唤醒而不管该进程真的在干什么,比如异步过程(AIO)就是这样的进程,这种异步的过程在阻塞在资源的时候登记完睡眠名单后要马上去做别的事情。
实际上,linux内核中睡眠,睡眠队列以及调度是不会相互影响的,你完全可以在睡眠队列而不真正睡眠,也可以睡眠了但是不在任何队列,到底怎样,就看编程者的策略了。

分享到:
评论

相关推荐

    Linux进程的睡眠和唤醒

    1 Linux进程的睡眠和唤醒 ...Linux 中的进程睡眠状态有两种:一种是可中断的睡眠状态,其状态标志位TASK_INTERRUPTIBLE; 另一种是不可中断 的睡眠状态,其状态标志位为TASK_UNINTERRUPTIBLE。可中断

    linux用多线程同步方法解决睡眠理发师问题(Sleeping-Barber_Problem).pdf

    linux用多线程同步方法解决睡眠理发师问题(Sleeping-Barber_Problem).pdf

    linux操作系统-睡眠的理发师问题.zip

    linux操作系统课程设计-睡眠的理发师问题,多线程与信号量机制实现,源代码+详细实验报告。

    Linux进程的睡眠和唤醒简析

    1、Linux进程的睡眠和唤醒  在Linux中,仅等待CPU时间的进程称为绪进程,它们被放置在一个运行队列中,一个绪进程的状 态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个...

    insomniad:Linux自动睡眠机制的用户空间策略

    insomniad是在用户空间中实现Linux的自动睡眠机制的守护程序。 这使其他策略可以将挂起系统的决定纳入内核的内置唤醒源之外。 这对于交流电供电的设备很有用,其中进入暂停状态的开销比尽快进入睡眠状态所节省的...

    linux-运行一个命令让你的电脑进入睡眠状态

    运行一个命令,让你的电脑进入睡眠状态

    实验四Linux中断与异常编程技术

    一个是用linux内部的三个定时器,另一个是用sleep, usleep函数让进程睡眠一段时间,使用alarm定时发出一个信号,还有那就是用gettimeofday, difftime等自己来计算时间间隔,然后时间到了就执行某一任务,但是这种...

    中断为什么不能睡眠

    详细分析linux操作系统中 的中断为什么不能睡眠原因。

    Shell脚本中让进程休眠的方法(sleep用法)

    有时候写Shell的脚本,...sleep 1 睡眠1秒 sleep 1s 睡眠1秒 sleep 1m 睡眠1分 sleep 1h 睡眠1小时 用法如下,例如重启tomcat: 代码如下: #!/bin/sh /opt/tomcat/bin/shutdown.sh sleep 3 #等3秒后执行下一条 /opt

    linux 内核同步机制

    本文档介绍在linux内核中两个不同进程或者过程访问和使用同一共享资源时,处理顺序的随机性,可能出现访问错误。结果依赖于多个任务的相对执行顺序(竟态条件)。其中处理竟态条件的同步机制在不同内核过程中处理的...

    生产者消费者问题(信号量)(linux)实现代码

    参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。...为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。

    进程监控和守护 linux C

    进程监控 进程守护 linux C语言 j进程重启 进程管理 利用linux C语言编写,读取配置文件里面要求启动的程序,并进行实时监控,若进程异常退出,就重新启动 ...6.进程若连续崩溃NUM_MAX次就进行相应的睡眠周期

    linux操作系统内核技术-uestc课件

     10介绍VFS原理,超级块,inode结构和方法,dentry结构和方法,file结构和方法,以及进程打开文件表,linux中的文件系统。(2小时)  11讲解块设备缓冲,bio结构,I/O请求队列,和有最终期限的块I/O调度算法。(2...

    进程的优先级与调度策略—Linux

    概述1.1 进程优先级1.2 普通进程的调度1.2.1 静态优先级和基本时间片1.2.2 动态优先级和平均睡眠1.3 实时进程的调度1.4 内核空间优先级2.调度策略2.1 进程的抢占2.2 调度算法2.3 O(1)调度2.4 调度模型——机制与策略...

    Linux下生产者消费者问题的实现

    利用互斥锁和计数信号完成生产者消费者问题 一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,... 主函数负责接收参数,初始化信号量,创建生产者线程,创建消费者线程,睡眠一段时间后,结束程序

    Linux系统编程之线程同步

    Linux中提供一把互斥锁mutex(也称之为互斥量)。 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。 资源还是共享的,线程间也还是竞争的, 但通过“锁”就将资源的访问变成互斥操作...

    linux驱动学习去开发入门

    包含驱动程序使用的大部分内核API的定义,包括睡眠函数以及各种变量声明。 (16)“#include <linux/version.h>” 包含所构造内核版本信息的头文件。 在学习过程中找到了几篇很好的参考文档: (1)第一章 模块...

    Linux系统内核的同步机制-自旋锁

    自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去,在那里看是否该自旋锁的保持者已经释放了锁,\"自旋\"一词就是因此而得名。由于自旋锁使用...

    linux进程监控和进程守护程序

    主要功能: 1.读取配置文件程序 2.启动进程 3.监控进程,查看进程是否退出或者崩溃 4.若进程退出或者崩溃,重启程序。 5.支持sleep功能 6.进程若连续崩溃NUM_MAX次就进行相应的睡眠周期

    Linux内核源码深度解析与开发实战视频.zip

    12:上下文:原子上下文和可睡眠环境_rec 13:内核同步_rec 14:第一份作业.txt 15:第一周答疑视频_rec 16:不可睡眠锁:自旋锁spinlock编码示例_rec 17:不可睡眠锁:RCUread-copy-update_rec 18:可睡眠锁-互斥量...

Global site tag (gtag.js) - Google Analytics