首页
学习
活动
专区
工具
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的红黑树。 唤醒抢占处理,被唤醒的高优先级进程可以抢占当前进程

3K20

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

关于 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.6K31

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

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

7.5K10

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

如果我们的服务器没有部署在本地(实际上通常都是这样的,我们会把服务器托管到IDC机房), 而且服务器在机房中不止一台,其中一台被关闭时,则我们可以远程连接一台没有关机的服务器上, 然后进行远程开机....先不要急着去关闭你的linux服务器,你首先要确定它是否支持远程开机?...则下次开机后会自动执行 第二个: 编辑/etc/sysconfig/network-scripts/ifcfg-eth0 (eth0网卡的配置文件),添加上一行: ETHTOOL_OPTS=”wol g” 4,网络唤醒的局限性...因为机器关闭后,完全是靠网卡唤醒机器,此时的机器是关闭的,没有操作系统运行, 也就谈不上支持tcp/ip协议,当然也就不能通过互联网运行了....下面简单介绍一下linux下的wakeonlan的用法: 假设远程要唤醒的计算机IP:12.34.56.78,Mac地址:01:02:03:04:05:06 $ wakeonlan -i 12.34.56.78

11.5K30

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

10.6K10

Linux服务器进程查看命令详解

Linux 服务器正常启动后,提供服务时会调用程序,占用进程。这时候我们如何查看系统中有哪些进程在被调用呢?我们可以通过以下命令来查看。...SMar16  0:06 nginx: worker process 二、top 命令 top 命令可动态显示服务器进程信息。top 命令和 ps 命令的基本作用是相同的,都显示系统当前进程的状况。...kill 命令的工作原理是,向 Linux 系统的内核发送一个系统操作信号和某个程序的进程标志号,然后系统内核就可以对进程标志号指定的进程进行操作了。...另外,大家有兴趣也可以了解一下 pkill 的用法,在服务器里用它来“踢人”还是很方便的,这个命令在工作中我们用得不多,大家稍微了解一下即可。...在 Linux 下,最强大的进程管理命令莫过于 ps 和 top 了,我们应该掌握它们的详细语法,在工作中灵活地使用它们。 注:以上内容整理自《构建高可用的 Linux 服务器》一书。

22K101

Linux进程——Linux进程进程优先级

如果对前面Linux进程不太熟悉可以先阅读: Linux进程 本篇主要内容: 僵尸进程和孤儿进程 Linux进程优先级 1. 僵尸进程 僵尸进程就是处于僵尸状态下的进程!...所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态 僵尸状态就是Linux状态中的X死亡状态!...配置进程优先权对多任务环境的linux很有用,可以改善系统性能。...NI :NICE值,表示优先级的修改数据 NICE其取值范围是-20至19,一共40个级别 Linux进程的优先级数值范围:60~99 Linux中默认进程的优先级都是:80 Linux是支持动态优先级调整的...总结 本篇文章前部分紧贴上篇Linux进程,分析完了Linux下常见的进程状态,然后初步了解了Linux进程优先级,而进程优先级与前面内容相差较大,希望大家能够多花点时间理解!

8210

LinuxLinux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

1.进程创建 1.1 fork函数 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。...新进程为子进程,而原进程为父进程 #include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当控制转移到内核中的...else if (ret > 0) { // 异常退出 printf("sig code : %d\n", st & 0X7F); } } } 测试结果: [root@localhost linux.../a.out #等20秒退出 child exit code:10 [root@localhost linux]# ....Linux鼓励将这种应用于程序之内的模式扩展到程序之间。如下图 一个C程序可以fork/exec另一个程序,并传给它一些参数。这个被调用的程序执行一定的操作,然后通过exit(n)来返回值。

13110

Linux进程控制——Linux进程等待

前言:接着前面进程终止,话不多说我们进入Linux进程等待的学习,如果你还不了解进程终止建议先了解: Linux进程终止 本篇主要内容: 什么是进程等待 为什么要进行进程等待 如何进程等待...进程等待的概念: 我们通常说的进程等待其实是通过wait/waitpid的方式,让父进程(一般)对子进程进行资源回收的等待过程,父进程必须等待这个子进程结束后,处理它的代码和数据! 2....进程等待必要性 在了解完进程等待的概念后,新的问题出现了,我们为什么要进行进程等待,进程等待的必要性是什么?...进程等待必要性: 若子进程退出,而父进程对它不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...父进程创建子进程的目的是为了让子进程协助自己完成任务的,而父进程需要知道子进程将任务完成得如何。这就需要通过进程等待的方式,获取子进程的退出信息。 3.

8510

linux代理服务器守护进程squid命令

squid命令是使用最广泛的代理服务器软件,可以节省网络带宽,提高网站的访问速度,它对服务器硬件的内存要求比较高。 它支持FTP、Gopher和HTTP协议的数据对象。...语法格式: squid [参数] 常用参数: -d 将指定调试等级的信息发送到标准错误设备 -f 使用指定的配置文件,而不使用默认配置文件 -k 向squid服务器发送指令 -s...启用syslog日志 -z 创建缓存目录 -C 不捕获致命信号 -D 不进行DNS参数测试 -N 以非守护进程模式运行 -X 强制进入完全调试模式 参考实例 创建缓存目录: [root@linuxcool...# squid -C 强制进入完全调试模式: [root@linuxcool ~]# squid -X 启用syslog日志: [root@linuxcool ~]# squid -s 关闭squid服务器

1.7K00

Linux服务器产生大量僵尸进程的解决

如何查看Linux系统上的僵尸进程,如何统计有多少僵尸进程? #ps -ef | grep defunct 或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思。...另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程。...Tasks:  95 total,  1 running,  94 sleeping,  0 stopped,  1617 zombie top命令中也统计了僵尸进程。...或者使用下面的命令: ps -ef | grep defunct | grep -v grep | wc -l 如何杀死僵尸进程呢? 一般僵尸进程很难直接kill掉,不过您可以kill僵尸爸爸。...父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

2.4K10

Linux进程控制——Linux进程终止

前言:前面了解完前面的Linux进程基础概念后,我们算是解决了Linux进程中的一大麻烦,现在我们准备更深入的了解Linux进程——Linux进程控制!...我们主要介绍的Linux进程控制内容包括:进程终止,进程等待与替换,进程程序替换! 本篇主要内容: 重识进程创建 进程退出场景 错误码和退出码 1....重识进程创建 1.1 fork函数 在我们之前提到过,创建进程使用的是fork函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...内核做: 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度 fork函数返回值: 子进程返回0, 父进程返回的是子进程的...在多进程环境中,我们创建子进程的目的就是协助父进程办事,但是父进程怎么知道子进程把事情办得怎么样?所以父进程要知道子进程办的怎么样,就有了退出码,而main函数的返回值,就是进程的退出码!

8610

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.9K20

Linux进程

Linux进程是系统中正在运行的程序的实例。每个进程都有一个唯一的进程标识符(PID),并且拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行状态的属性。...Linux进程可以根据其特性和用途被分为多种类型。以下是一些主要的Linux进程类型: 1....进程间通信(IPC) 进程间通信(IPC)是指两个或多个进程之间传输数据或信号的机制。Linux支持多种IPC机制,包括: 1....共享内存: • 共享内存允许两个或多个进程共享一个给定的存储区。这是最快的IPC形式,因为数据不需要在客户端和服务器之间复制。 5....RPC允许一个程序调用另一个地址空间(通常是在远程服务器上)的过程或函数,就像调用本地程序一样。

5110
领券