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

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

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

2.8K20

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

进程的睡眠是通过调用sleep_on函数,该函数修改了进程的状态并且通过schedule函数切换到其他进程执行,从而实现进程的挂起,TASK_UNINTERRUPTIBLE状态的进程只能被wake_up...TASK_INTERRUPTIBLE状态的进程可以被wake_up和信号唤醒唤醒的时候也是通过修改进程的状态为可运行,然后等待下一次进程调度,被唤醒进程不一定马上得到执行。..., 然后切换到其他进程执行,当被wake_up唤醒的时候,wake_up会唤醒链表的第一个 睡眠节点,因为第一个节点里保存了后面一个节点的地址,所以他唤醒后面一个节点,...,不可中断的时候, 能保证唤醒的时候,是从前往后逐个唤醒,但是可中断睡眠无法保证这一点, 因为进程可能被信号唤醒了,所以需要判断全局指针是否指向了自己,即自己插入 链表后,还有没有进程也插入了该链表...wake_up能保证唤醒的是第一个节点, 这里先唤醒链表中比当前进程后插入链表的节点,有点奇怪,自己被信号唤醒了, 去唤醒别的进程,自己却还睡眠 */ if

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

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

唤醒进程不必一定由完全公平调度器处理, 如果新进程是一个实时进程, 则会立即请求调度, 因为实时进程优先极高, 实时进程总会抢占CFS进程. 2 Linux进程的睡眠 在Linux中,仅等待CPU时间的进程称为就绪进程.... */ 3 linux进程唤醒 当在try_to_wake_up/wake_up_process和wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当前进程可以抢占当前运行的进程..., 而我们fork新创建的进程在完成自己的创建工作后, 可以通过wake_up_new_task完成唤醒工作, 参见Linux进程的创建过程分析(_do_fork/do_fork详解)–Linux进程的管理与调度...在Linux操作系统中, 内核的稳定性至关重要, 为了避免在Linux操作系统内核中出现无效唤醒问题, Linux内核在需要进程睡眠的时候应该使用类似如下的操作: /* ‘q’是我们希望睡眠的等待队列...2号进程的例子-避免无效抢占 下面让我们用linux内核中的实例来看看Linux 内核是如何避免无效睡眠的, 我还记得2号进程吧, 它的主要工作就是接手内核线程kthread的创建, 其工作流程函数是

3.7K30

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

1 Linux 进程的睡眠和唤醒Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。...在这个时间片内,B 进程执行完了它所有的指令,因此它试图唤醒 A 进程,而此时的 A 进程还没有进入睡眠,所以唤醒操作无效。...由于错过了 B 进程唤醒,它将会无限期的睡眠下去,这就是无效唤醒问题,因为即使链表中有数据需要处理,A 进程也还是睡眠了。 3 避免无效唤醒 如何避免无效唤醒问题呢?...4 Linux 内核的例子 在 Linux 操作系统中,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*...小结 通过上面的讨论,可以发现在 Linux 中避免进程的无效唤醒的关键是在进程检查条件之前就将进程的状态置为 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE,并且如果检查的条件满足的话就应该将其状态重新设置为

2.2K90

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

, 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 一般情况下选择红黑树中的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->...进程由于刚被唤醒, 可能比较饥饿, 优先调度他们能提高系统缓存的命中率 周期性调度 task_tick_fair 周期性调度器的工作由scheduler_tick函数完成, 在scheduler_tick...关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,...而其他运行进程的 vruntime一直在推进, 那么等到休眠进程终于唤醒的时候, 它的vruntime比别人小很多, 会使它获得长时间抢占CPU的优势, 其他进程就要饿死了....这显然是另一种形式的不公平,因此CFS是这样做的:在休眠进程唤醒时重新设置vruntime值,以min_vruntime值为基础,给予一定的补偿,但不能补偿太多.

2.5K31

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

1 Linux 进程的睡眠和唤醒Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。...在这个时间片内,B 进程执行完了它所有的指令,因此它试图唤醒 A 进程,而此时的 A 进程还没有进入睡眠,所以唤醒操作无效。...由于错过了 B 进程唤醒,它将会无限期的睡眠下去,这就是无效唤醒问题,因为即使链表中有数据需要处理,A 进程也还是睡眠了。 3 避免无效唤醒 如何避免无效唤醒问题呢?...4 Linux 内核的例子 在 Linux 操作系统中,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*...小结 通过上面的讨论,可以发现在 Linux 中避免进程的无效唤醒的关键是在进程检查条件之前就将进程的状态置为 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE,并且如果检查的条件满足的话就应该将其状态重新设置为

7.2K10

ps 命令详解

ps 概述 Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。...linux进程有5种状态: 运行(正在运行或在运行队列中等待) 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 僵死(进程已终止...-l 长格式(有F,wchan,C 等字段) -j 作业格式 -o 用户自定义格式。...D: 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。...START: 进程启动时间和日期 NI: 优先级(Nice) PRI: 进程优先级编号(Priority) WCHAN进程正在睡眠的内核函数名称;该函数的名称是从/root

1.8K130

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.4K30

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

9.8K10

linux 进程管理

进程的属性 ​ 在Linux系统中总是有很多进程同时在运行,每一个进程都有一个识别号,叫做PID(Process ID),用以区分不同的进程。...二、linux的工作调度 由于linux是一个多人多任务的操作系统,所以用户在使用linux的时候就会出现有些工作我们需要盯着完成的进度,而有些工作我们直接放在后台执行就可以了,这里面我们就涉及到任务的前后台执行的问题...执行具体内容 [root@zutuanxue ~]# ps -l 查看当前用户开启的进程 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY...4=权限为root 1=从父进程派生出来但是没有执行 5=1+4 0=没有被设置 S 进程状态 R=运行 S=睡眠,可被唤醒 D=睡眠,不可被唤醒(资源不足引起)T=停止 Z=僵尸进程...,1个内存页=4096Bytes 也就是6994x4=27976K内存 WCHAN 当前进程在哪个内核函数上睡眠,-表示正在运行,没有睡眠 TTY 由哪个终端开启的 pts/n=图形界面或远程 ttyn

2.1K30

linux通过进程名杀死进程_linux关闭进程命令

笔记:根据一个进程的名字或启动此进程的命令(连续的一部分即可)杀死进程 一、使用单条命令 ps -ef | grep 进程名/启动进程的命令 | grep -v grep | awk ‘{print $2...}’ | xargs kill -9 执行结果: [1]-  已杀死               sleep 200 [2]+  已杀死               sleep 200 二、编写脚本 linux.../bin/bash # 脚本名:kill_process.sh # 脚本功能:强制杀死进程 方式kill -9     # 1通过ps查询进程的id     # 2使用kill -9 强制终止进程...函数功能:根据进程名杀死程序     参数:进程名     返回值:无 !...————————————————————— # 根据进程名查询包含进程名的进程 并排除grep查询进程和此脚本进程 ps -ef | grep “$pName” | grep -v grep | grep

15.8K20

linux系统查看网卡是否支持WOL网络唤醒并开启WOL唤醒功能

硬件开启了网络唤醒功能,接下来就需要在系统里设置了。 检查是否开启WOL唤醒功能 linux检查网卡是否支持唤醒功能,输入命令命令打印出网卡的信息。...d -- 禁用 p -- 物理活动唤醒 u -- 单播消息唤醒 m -- 多播(组播)消息唤醒 b -- 广播消息唤醒 a -- ARP 唤醒 g -- 特定数据包magic packet唤醒 s --...设有密码的特定数据包magic packet唤醒 然后看Wake-on的值,若为g,表示网卡已开启远程唤醒功能; 开启WOL唤醒功能 若为d,则需要输入命令开启。...为什么这里选择的g,因为其他只是单纯的唤醒,并没有验证,可能路由器的一个广播操作都会将电脑给唤醒,g为特定数据包magic packet唤醒唤醒的时候是发送一段特殊的代码,进行操作。...幻数据包(Magic Packet) 由 AMD 公司提出,幻数据包是一个广播帧,包含待唤醒计算机的MAC地址。

6.6K20

Linux进程学习【进程状态】

本文将会带着大家认识的各种 进程 状态 ---- 正文 在谈 进程状态 之前,首先要回顾下之前的 进程 相关知识 OS管理的本质是先描述,再组织 OS并非直接管理 进程 ,而是管理 进程 的 PCB(...,即把手机揣进兜里,然后 专心执行走路这个 进程 进程状态 进程 有各种运行状态,方便OS进行管理,在 Windows 中,进程 状态是这样的 而在我们 Linux 中,新建、就绪、运行都可以看作...运行 R 这一个状态,所以比较清晰 而我们今天要学习的正是 Linux 中的 进程 状态 进程是何种状态,取决于此进程的PCB在哪里排队 ️运行 R 首先来看看第一种状态 R 以我们以往的认知来说...父进程,此时 子进程 会被OS领养 子进程 的 父进程 变为 1号进程进程 就变成了一个 孤儿进程 发出指令终止 父进程 假设 子进程 不被 1号进程 领养 子进程 退出时就会无人回收...,成为一只游离的僵尸 僵尸进程 有 内存泄漏 的风险 因此 子进程 会被OS领养 ---- 总结 以上就是关于进程学习【进程状态】的全部内容了,我们简单学习了 进程 的相关状态,知道了何为 阻塞、进程

18230

Linux进程学习【进程地址】

,这种行为称为 写时拷贝 刚开始,父子进程共同使用同一块空间 当子进程修改共享值后 ---- 进程地址空间 下面来好好谈谈 进程地址空间 (虚拟地址) ️虚拟地址 在早期程序中,是没有虚拟地址空间的...因为每个进程都有属于自己的空间,OS 在管理进程时,能够以统一的视角进行管理,效率很高 光有 虚拟地址空间 是不够的,还需要一套完整的 ‘‘翻译’’ 机制进行程序寻址,如 Linux 中的 页表 +...后续对这块进行写入操作时,会直接拒绝 对于这种机制感兴趣的同学可以点击下面这几篇文章查看详细内容: Linux的虚拟内存详解(MMU、页表结构) ARM体系架构——MMU 逻辑地址、页表、MMU等...️写时拷贝 Linux 中存在一个很有意思的机制:写时拷贝 这是一种 赌bo 行为,OS 此时就赌你不会对数据进行修改,这样就可以 使多个 进程 在访问同一个数据时,指向同一块空间,当发生改写行为时...(权限设置) 将 进程管理 和 内存管理 进行 解耦,方便 OS 进行更高效的管理 可以让进程以统一的视角看待自己的代码和数据 ---- 总结 以上就是本篇关于 Linux进程学习【进程地址】的全部内容了

14120

bug 排查大曝光,涉及Linux 内核的那种

古老的ps命令永不过时 我们可以利用 ps 命令来查看进程的运行状态和 WCHAN(waiting channel)。 WCHAN 是什么意思呢?...在 Linux 世界,有问题问男人(man),这就是万能的 man 命令,我们使用 man 命令来看一下 ps 展示内容的含义: $ man ps 运行 man 命令并搜索“WCHAN”,啊哈!...最终在“STANDARD FORMAT SPECIFIERS”这一部分中找到了 WCHAN 的含义,是这样写的: ? 这里清楚的写着 WCHAN 指的是当前进程正阻塞在哪个内核函数上。...,我们可以使用最简单的 cat 命令,使用 proc 后跟进程ID以及wchan: ?...总结 本文为大家完整展示了一次 bug 的定位过程,可以看到 Linux 为我们提供了极为丰富的调试工具,当然这离不开 Linux 系统本身优秀的设计思想,那就是将进程和内核的运行时信息通过文件系统提供出来

1.6K20

Linux进程调度_linux进程的查看和调度

对于处理器消耗型的进程,调度策略往往是降低他们的执行频率,延长运行时间。 Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...一、普通进程Linux 中普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...Linux 调度时机 ---- 一、进程切换 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。...curr->sched_class->task_tick(rq, curr, 0); ... } 唤醒进程的时候 当进程唤醒的时候,如果优先级高于CPU上的当前进程,就会触发抢占。

20.5K10
领券