首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux0.11进程睡眠唤醒原理分析

进程睡眠是通过调用sleep_on函数,该函数修改了进程的状态并且通过schedule函数切换到其他进程执行,从而实现进程的挂起,TASK_UNINTERRUPTIBLE状态的进程只能被wake_up...,即tmp指向第一个睡眠节点 头指针指向当前进程,这个版本的实现没有采用真正链表的形式, 他通过每个进程在栈中的临时变量形成一个链表,每个睡眠进程, 在栈里有一个变量指向后面一个睡眠节点...,然后把链表的头指针指向当前进程, 然后切换到其他进程执行,当被wake_up唤醒的时候,wake_up会唤醒链表的第一个 睡眠节点,因为第一个节点里保存了后面一个节点的地址...,可以通过wake_up和接收信号唤醒,不可中断的时候, 能保证唤醒的时候,是从前往后逐个唤醒,但是可中断睡眠无法保证这一点, 因为进程可能被信号唤醒了,所以需要判断全局指针是否指向了自己...去唤醒别的进程,自己却还睡眠 */ if (*p && *p !

2.3K40

关于 Linux 进程睡眠唤醒 ,来看这篇就够了~

1 Linux 进程睡眠唤醒Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。...在现代的 Linux 操作系统中,进程一般都是用调用 schedule() 的方法进入睡眠状态的,下面的代码演示了如何让正在运行的进程进入睡眠状态。...在这个时间片内,B 进程执行完了它所有的指令,因此它试图唤醒 A 进程,而此时的 A 进程还没有进入睡眠,所以唤醒操作无效。...由于错过了 B 进程唤醒,它将会无限期的睡眠下去,这就是无效唤醒问题,因为即使链表中有数据需要处理,A 进程也还是睡眠了。 3 避免无效唤醒 如何避免无效唤醒问题呢?...4 Linux 内核的例子 在 Linux 操作系统中,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*

2.3K90
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    关于 Linux 进程睡眠唤醒 ,来看这篇就够了~

    1 Linux 进程睡眠唤醒Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。...在现代的 Linux 操作系统中,进程一般都是用调用 schedule() 的方法进入睡眠状态的,下面的代码演示了如何让正在运行的进程进入睡眠状态。...在这个时间片内,B 进程执行完了它所有的指令,因此它试图唤醒 A 进程,而此时的 A 进程还没有进入睡眠,所以唤醒操作无效。...由于错过了 B 进程唤醒,它将会无限期的睡眠下去,这就是无效唤醒问题,因为即使链表中有数据需要处理,A 进程也还是睡眠了。 3 避免无效唤醒 如何避免无效唤醒问题呢?...4 Linux 内核的例子 在 Linux 操作系统中,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*

    7.6K10

    深入理解Linux内核之进程唤醒

    1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 前面文章,我们介绍了进程是如何睡眠,本文来揭开进程唤醒的神秘面纱...进程睡眠主要内容如下: 2.应用场景 3.选择cpu 4.加入运行队列 5.唤醒抢占 5.1 抢占条件 5.2 本地cpu 5.3 远程cpu 6.总结 2....应用场景 进程唤醒主要应用场景如下: fork的时候唤醒进程 exec的时候唤醒进程 睡眠超时唤醒 睡眠锁释放唤醒 IO读写完成唤醒 其他正常的唤醒路径 注:应用场景在此不再分析,感兴趣的小伙伴可以自行查阅内核源代码...-> p->state = TASK_RUNNING; //设置运行状态 进程唤醒的主要调用链如上:会唤醒特定状态的进程(wake_up_process唤醒三种睡眠状态的进程睡眠文章已经讲到...,会做一些基本的判断,如唤醒进程是否是运行队列当前进程、是否已经设置了重新调度标志、抢占idle进程处理等,然后调整唤醒进程的调度实体和运行队列当前进程调度实体在同一层次任务组中,最后进行关键的唤醒抢占条件判断

    3.1K20

    深入理解Linux内核之进程睡眠

    1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠...注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠的三种状态 睡眠的内核原理 用户态睡眠 内核态睡眠 总结 2....这里给出被致命信号打断/唤醒的代码路径: include/linux/sched.h #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE...当任务睡眠完成,定时器超时,会调用之前在__hrtimer_init_sleeper设置的超时回调函数hrtimer_wakeup将睡眠的任务唤醒(关于进程唤醒在这里就不在赘述,在后面的进程唤醒专题文章在进行详细解读...进程睡眠按照进程所处的特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。

    2.8K40

    深入理解Linux内核之进程睡眠(下)

    来看下freezable_schedule: //include/linux/freezer.h freezable_schedule ->schedule() ->__schedule(false...当任务睡眠完成,定时器超时,会调用之前在__hrtimer_init_sleeper设置的超时回调函数hrtimer_wakeup将睡眠的任务唤醒(关于进程唤醒在这里就不在赘述,在后面的进程唤醒专题文章在进行详细解读...6.总结 进程睡眠按照应用场景可以分为:延迟睡眠和等待某些特定条件而睡眠,实际上都可以归于等待某些特定条件而睡眠,因为延迟特定时间也可以作为特定条件。...进程睡眠按照进程所处的特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。...对于进程睡眠,内核主要需要做三大步操作:1.设置任务状态为睡眠状态 2.记录睡眠的任务 3.发起主动调度。

    2.1K20

    深入理解Linux内核之进程睡眠(上)

    1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠...注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠的三种状态 睡眠的内核原理 用户态睡眠 内核态睡眠 总结 2....睡眠的三种状态 任务睡眠有三种状态: 浅度睡眠 中度睡眠 深度睡眠 2.1 浅度睡眠 进程描述符的state使用TASK_INTERRUPTIBLE表示这种状态。...2.2 中度睡眠 进程描述符的state使用TASK_KILLABLE表示这种状态。 可以被致命信号所打断。...这里给出被致命信号打断/唤醒的代码路径: include/linux/sched.h #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE

    1.5K20

    Linux唤醒抢占----Linux进程的管理与调度(二十三)

    唤醒进程不必一定由完全公平调度器处理, 如果新进程是一个实时进程, 则会立即请求调度, 因为实时进程优先极高, 实时进程总会抢占CFS进程. 2 Linux进程睡眠Linux中,仅等待CPU时间的进程称为就绪进程...Linux 中的进程睡眠状态有两种 一种是可中断的睡眠状态,其状态标志位TASK_INTERRUPTIBLE....在现代的Linux操作系统中, 进程一般都是用调用schedule的方法进入睡眠状态的, 下面的代码演示了如何让正在运行的进程进入睡眠状态。...由于错过了B进程唤醒, 它将会无限期的睡眠下去, 这就是无效唤醒问题, 因为即使链表中有数据需要处理, A进程也还是睡眠了. 4.2 无效唤醒的原因 如何避免无效唤醒问题呢?...在Linux操作系统中, 内核的稳定性至关重要, 为了避免在Linux操作系统内核中出现无效唤醒问题, Linux内核在需要进程睡眠的时候应该使用类似如下的操作: /* ‘q’是我们希望睡眠的等待队列

    3.9K30

    电脑总是意外从睡眠状态唤醒,可以找出原因然后解决

    到底是谁唤醒了我的电脑!!! 本文将介绍如何寻找唤醒电脑的真凶。 调查是谁唤醒了电脑 使用命令查看上一次是谁唤醒了电脑。...powercfg -lastwake 从图中可知上一次唤醒我计算机的是 英特尔® 以太网连接 I219-V 82186。 查看还有谁可以唤醒电脑 使用命令查看所有可以唤醒电脑的设备。...powercfg -devicequery wake_armed 发现能唤醒我电脑的设备是键盘鼠标以及刚刚的以太网。 查看下一次计划的唤醒 使用命令可以查看下一次计划的唤醒。...powercfg -waketimers 当然这只能查到计划的唤醒,类似鼠标键盘还有以太网这种根据硬件状态触发的唤醒是看不到的。...修复意外的唤醒 由于我不知道到底是谁通过以太网唤醒了我的电脑,所以我直接关掉以太网的唤醒即可。 前往设备管理器,找到刚刚发现的硬件设备,查看属性。 然后我关闭了此设备唤醒电脑的设置。

    31120

    Linux CFS调度器之唤醒抢占--Linux进程的管理与调度(三十)

    , 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 一般情况下选择红黑树中的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->...关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,...而其他运行进程的 vruntime一直在推进, 那么等到休眠进程终于唤醒的时候, 它的vruntime比别人小很多, 会使它获得长时间抢占CPU的优势, 其他进程就要饿死了....其中place_entity函数通过第三个参数initial参数来标识新进程创建和进程睡眠后苏醒两种情况的 在进程入队时enqueue_entity设置的initial参数为0, 参见kernel...se->vruntime -= cfs_rq->min_vruntime; 我们前面讲解place_entity的时候说到, 新创建的进程睡眠后苏醒的进程为了保证他们的vruntime与系统中进程的vruntime

    2.6K31

    电脑总是意外从睡眠状态唤醒,可以找出原因然后解决

    到底是谁唤醒了我的电脑!!! 本文将介绍如何寻找唤醒电脑的真凶。 调查是谁唤醒了电脑 使用命令查看上一次是谁唤醒了电脑。...查看还有谁可以唤醒电脑 使用命令查看所有可以唤醒电脑的设备。...image.png 查看下一次计划的唤醒 使用命令可以查看下一次计划的唤醒。...powercfg -waketimers 当然这只能查到计划的唤醒,类似鼠标键盘还有以太网这种根据硬件状态触发的唤醒是看不到的。...修复意外的唤醒 由于我不知道到底是谁通过以太网唤醒了我的电脑,所以我直接关掉以太网的唤醒即可。 前往设备管理器,找到刚刚发现的硬件设备,查看属性。

    3K20

    linux 主机支持远程唤醒_Linux远程开机

    先不要急着去关闭你的linux服务器,你首先要确定它是否支持远程开机?...则下次开机后会自动执行 第二个: 编辑/etc/sysconfig/network-scripts/ifcfg-eth0 (eth0网卡的配置文件),添加上一行: ETHTOOL_OPTS=”wol g” 4,网络唤醒的局限性...因为机器关闭后,完全是靠网卡唤醒机器,此时的机器是关闭的,没有操作系统运行, 也就谈不上支持tcp/ip协议,当然也就不能通过互联网运行了....我们必须能登录到局域网中的一台机器上,在此机器上运行wake on lan 去唤醒目标机器 前提条件就是:目标机器和我们登录的机器在同一局域网中 5,还有一点:被远程开机的目标机器必须是插电的,没插电源的机器也能开机只有电影中才会出现...下面简单介绍一下linux下的wakeonlan的用法: 假设远程要唤醒的计算机IP:12.34.56.78,Mac地址:01:02:03:04:05:06 $ wakeonlan -i 12.34.56.78

    11.6K30

    ubuntu linux下开启远程唤醒

    目录 启动远程唤醒,需要主板支持才能进行。 步骤一:检查计算机硬件是否支持WOL(wake on lan)功能。...步骤二:检查主板和电源是否支持WOL 步骤三:检查网卡是否支持WOL 步骤四:查看网卡 步骤五:查询网卡是否支持远程唤醒 步骤六:开启远程唤醒 d为关闭g为开启 步骤七:参考操作 启动远程唤醒,需要主板支持才能进行...Wake On Lan模式可以在完全关机状态下唤醒,而Wake On PCI Card模式要在深度休眠状态下唤醒。...步骤三:检查网卡是否支持WOL 安装ethtool,并执行以下命令: sudo apt-get install ethtool 步骤四:查看网卡 步骤五:查询网卡是否支持远程唤醒 sudo...在本地计算机上安装远程唤醒工具wakeonlan: sudo apt-get install wakeonlan 小结2:唤醒远程计算机 执行下面的命令就可以唤醒远程的计算机了: #host_address

    11.2K10

    Android电源管理基础知识整理

    举个例子来说,以该方式进入睡眠时,后续通过点击键盘也能将系统唤醒。...而以mem进入的睡眠为深度睡眠,只能通过中断唤醒设备唤醒系统,如电源键(此时按电源键,不会经过正常的开机流程的BIOS、BOOTLOAD等),此时按键盘是无法唤醒系统的。...(包括系统进程)被冻结,即进入上文所述的睡眠状态 idle进程是由原始进程(pid=0)在初始化init进程(pid=1)之后演变而来,可以说是init进程的祖先,关于其详细介绍可参考如下链接: Linux...WakeLock 唤醒锁,一种锁机制,用于阻止系统进入睡眠状态,只要有应用获取到改锁,那么系统就无法进入睡眠状态。...Late Resume 迟唤醒机制,用于唤醒预挂起的设备 睡眠状态转换 一般情况下,当我们息屏后,系统将先通过Early Suspend机制进入Idle状态,如果满足进入睡眠的条件(没有进程持有唤醒锁)

    5.3K21

    宋宝华: 聊一聊进程深度睡眠的TASK_KILLABLE这个状态

    众所周知,Linux进程睡眠有两种常规状态: TASK_INTERRUPTIBLE(浅度睡眠):可以被等待的资源唤醒,也能被signal唤醒; TASK_UNINTERRUPTIBLE(深度睡眠):可以被等待的资源唤醒...简单来说,深度睡眠进程必须等待资源来了才能醒,在此之前,甚至你给它发任何的信号,它都不可能醒来。...浅度睡眠进程,则可以被信号唤醒,对于常规的键盘、串口、触摸屏等等这些I/O设备,显然符合此类模型。...所以Linux内核的代码里面经常看到这样的代码模板,笔者在《Linux设备驱动开发详解》一书中也花了大篇幅解释如下模板: ?...Linux因此推出了一个特殊的深度睡眠状态,叫做 TASK_KILLABLE(可杀的深度睡眠):可以被等到的资源唤醒,不能被常规信号唤醒,但是可以被致命信号唤醒

    2.3K30

    宋宝华:可以杀死的深度睡眠TASK_KILLABLE状态(最透彻一篇)

    深度睡眠与浅度睡眠 众所周知,Linux进程睡眠有两种常规状态: TASK_INTERRUPTIBLE(浅度睡眠):可以被等待的资源唤醒,也能被signal唤醒; TASK_UNINTERRUPTIBLE...(深度睡眠):可以被等待的资源唤醒,但是不能被signal唤醒。...浅度睡眠进程,则可以被信号唤醒,对于常规的键盘、串口、触摸屏等等这些I/O设备,显然符合此类模型。...可杀的深度睡眠 Linux因此推出了一个特殊的深度睡眠状态,叫做 TASK_KILLABLE(可杀的深度睡眠):可以被等到的资源唤醒,不能被常规信号唤醒,但是可以被致命信号唤醒,醒后即死。...实际上,当Linux内核发现进程(线程组)收到了一个sig_fatal()的信号的时候,会给这个进程中的每个线程人为地插入一个SIGKILL信号,这个从while_each_thread循环可以看出。

    1.5K20

    【专业技术】Linux设备驱动第七篇:高级字符驱动操作之阻塞IO

    在持有信号量时可以睡眠,但是会造成其他等待的进程也会进入睡眠,所以应该特别注意,睡眠时间应很短。 在被唤醒后应做一些必要的检查,确定你等待的条件已经满足。因为你不知道睡眠的这段时间发生了什么。...睡眠前确定能被唤醒,否则不要睡眠。...非阻塞的IO由 filp->f_flags 中的 O_NONBLOCK 标志来指示,这个标志位于, 被 自动包含。...一般情况下这样是没有问题的,但是在个别的情况下,可能提前知道只有一个被唤醒进程将成功获得需要的资源,并且其他的进程将再次睡眠。...如果等待的进程太多,全部唤醒在进入睡眠这样的操作也是耗费资源的,会降低系统的性能。为了应对这种情况,内核中添加了一个互斥等待的选项。这样的结果是,进行互斥等待的进程被一次唤醒一个。

    1.4K70
    领券