首页
学习
活动
专区
工具
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进程睡眠唤醒原理分析

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

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

如何解决iPhone屏幕挡住时无法唤醒Siri?

如果您在呼叫 Siri 时,没有得到任何回应,或偶尔才能获得回应,想要在任何时候都能正常唤醒 Siri,可以尝试检查如下设置:请在iPhone 设置-辅助功能``-Siri中打开始终用“嘿 Siri”唤醒即可...如果您还是无法正常使用“嘿 Siri”功能,请参考如下信息: 检查“嘿 Siri”是否已打开: 前往“设置”,轻点“Siri 与搜索”,在这里,确保以下设置已打开: 用“嘿 Siri”唤醒...关闭“用‘嘿 Siri’唤醒”,然后重新打开。 当出现“设置‘嘿 Siri’”屏幕时,轻点“继续”。 说出您在屏幕上看到的每个命令,轻点“完成”。...设检查“Siri”是否已经停用: 前往“设置”-“屏幕使用时间”-“内容和隐私访问限制”-“允许的应用”,确保“Siri 与听写”不是关闭的状态。

1.4K10

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

唤醒进程不必一定由完全公平调度器处理, 如果新进程是一个实时进程, 则会立即请求调度, 因为实时进程优先极高, 实时进程总会抢占CFS进程. 2 Linux进程的睡眠 在Linux中,仅等待CPU时间的进程称为就绪进程..., int wake_flags) 该函数接受的参数有: 唤醒进程的描述符指针(p), 可以唤醒进程状态掩码(state), 一个标志wake_flags,用来禁止唤醒进程抢占本地CPU上正在运行的进程..., 而我们fork新创建的进程在完成自己的创建工作后, 可以通过wake_up_new_task完成唤醒工作, 参见Linux进程的创建过程分析(_do_fork/do_fork详解)–Linux进程的管理与调度...我们发现无效唤醒主要发生在检查条件之后和进程状态设置为睡眠状态之前, 本来B进程的wake_up_process提供了一次将A进程状态置为TASK_RUNNING的机会,可惜这个时候A进程的状态仍然是...在Linux操作系统中, 内核的稳定性至关重要, 为了避免在Linux操作系统内核中出现无效唤醒问题, Linux内核在需要进程睡眠的时候应该使用类似如下的操作: /* ‘q’是我们希望睡眠的等待队列

3.7K30

服务器入侵,异常进程无法杀掉,随机进程

故事情节: 有一天在聚餐中,我有一个朋友和我说他的服务器上有有个异常的进程他一直在占满CPU在运行,我在一顿谦虚之后答应了他,有空登录上他的服务器看一下具体情况。...就是以上三张图,在proc目录中的exe指向的文件已被删除,我看到这里,我好奇这个进程肯定是隐藏掉了。这时,我急中生智跟这位朋友要了root账号密码。...登录服务器用top命令一看,发现一个奇怪的进程在运行,我使用kill命令将其杀后,等了十来分钟后,发现没有启动,这时我和这位朋友说干掉了,他问我是不是kill掉了,我说嗯,他又补充到,这个进程杀掉过段时间会起来的...没过多久,我又看了一下,发现这个进程换了个名字又启动了。...还干满了CPU,就在这时,我在研究这个进程运行文件的时候发现: 这个进程会连到一个韩国的服务器上,我访问这个IP发现是一个正常的网站,没有异常情况。

11K40

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

1 Linux 进程的睡眠和唤醒Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。...当然,这个进程只有在下次调度器调度到的时候才能真正地投入运行。 2 无效唤醒 几乎在所有的情况下,进程都会在检查了某些条件之后,发现条件不满足才进入睡眠。...我们发现无效唤醒主要发生在检查条件之后和进程状态设置为睡眠状态之前, 本来 B 进程的 wake_up_process() 提供了一次将 A 进程状态置为 TASK_RUNNING 的机会,可惜这个时候...4 Linux 内核的例子 在 Linux 操作系统中,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*...这样无论进程等待的条件是否满足, 进程都不会因为移出就绪队列而错误地进入睡眠状态,从而避免了无效唤醒问题。

2.2K90

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

, 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 一般情况下选择红黑树中的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->...关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,...这显然是另一种形式的不公平,因此CFS是这样做的:在休眠进程唤醒时重新设置vruntime值,以min_vruntime值为基础,给予一定的补偿,但不能补偿太多...., 即在红黑树中父进程curr更靠左(前), 这就意味着父进程将在子进程之前调度....即新创建的进程应该是可以迁移的.

2.5K31

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

1 Linux 进程的睡眠和唤醒Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。...当然,这个进程只有在下次调度器调度到的时候才能真正地投入运行。 2 无效唤醒 几乎在所有的情况下,进程都会在检查了某些条件之后,发现条件不满足才进入睡眠。...我们发现无效唤醒主要发生在检查条件之后和进程状态设置为睡眠状态之前, 本来 B 进程的 wake_up_process() 提供了一次将 A 进程状态置为 TASK_RUNNING 的机会,可惜这个时候...4 Linux 内核的例子 在 Linux 操作系统中,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*...这样无论进程等待的条件是否满足, 进程都不会因为移出就绪队列而错误地进入睡眠状态,从而避免了无效唤醒问题。

7.2K10

Linux 遭入侵,挖矿进程隐藏排查记录

今天来给大家分享下这两天遇到的一个问题,服务器挖矿了,把我的排查记录分享下,希望能帮到有需要的同学。...cpu使用率基本跑满(用户态),没有发现可疑的进程,初步怀疑可能是进程在哪里隐藏了 执行命令ps -aux --sort=-pcpu|head -10 嗯哼,藏得够深的,可还是揪出来啦 ? ?...这个eta可能是起的一个守护进程,用于唤起上面圈起来的python进程, 这个脚本的用途是,链接远程服务"http://g.upxmr.com:999/version.txt",并下载 写入到本地隐藏文件.../tmp/.x,然后执行 注意:这个执行文件会修改服务器的一些配置,如dns,hosts,定时任务,创建可执行文件 查看dns 果然dns修改了 ?...干掉可疑程序“ata”进程 [root@dtdream-common-prod-nginx-03 ~]# kill -9 70497 再次查看发现cpu使用率降下来了,挖矿程序也没启动了。 ? ?

6.6K30

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

如果我们的服务器没有部署在本地(实际上通常都是这样的,我们会把服务器托管到IDC机房), 而且服务器在机房中不止一台,其中一台关闭时,则我们可以远程连接一台没有关机的服务器上, 然后进行远程开机....先不要急着去关闭你的linux服务器,你首先要确定它是否支持远程开机?...因为机器关闭后,完全是靠网卡唤醒机器,此时的机器是关闭的,没有操作系统运行, 也就谈不上支持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.9K10

宋宝华: Linux僵尸进程可以“杀死”吗?

什么是僵尸 首先要明确一点,僵尸进程的含义是:子进程已经死了,但是父进程还没有wait它的一个中间状态,这个时候子进程是一个僵尸。...正常情况下子死,父wait,清理掉子进程的task_struct,释放子进程的PID: ? 编译上述程序,运行,我们看到2个a.out进程: ? 杀死子进程4578,看到父进程的打印: ?...之后,4578会消失,因为父进程执行到了wait,也知道了子进程信号2杀掉的。...但是如果子进程死了,父进程不执行到wait,比如把上图中的"#if 0"改为"#if 1",杀死子进程后,子进程就是一个僵尸: ?...僵尸不可能被杀死 我们看到上面4628是个僵尸很不爽,所以我们想把它干掉,据说Linux有个信号9,神挡杀神,佛挡杀佛,我们现在来用kill -9干掉4628: ?

2.5K10

安全研究 | Linux 遭入侵,挖矿进程隐藏案例分析

我们发现黑客主要是利用 Redis 未授权访问问题进行入侵,对于该问题的说明可以参考我们过去做的一些分析: https://mp.weixin.qq.com/s/inazTPN5mHJYnt2QDliv8w 在服务器入侵后...在变更文件里可以看到一些挖矿程序,同时 /etc/ld.so.preload 文件的变更需要引起注意,这里涉及到 Linux 动态链接库预加载机制,是一种常用的进程隐藏方法,而 top 等命令都是受这个机制影响的...在 Linux 操作系统的动态链接库加载过程中,动态链接器会读取 LD_PRELOAD 环境变量的值和默认配置文件 /etc/ld.so.preload 的文件内容,并将读取到的动态链接库进行预加载,即使程序不依赖这些动态链接库...——段落引自《警惕利用 Linux 预加载型恶意动态链接库的后门》 通过查看文件内容,可以看到加载一个 .so 文件:/usr/local/lib/libjdk.so ?...继续分析变更的文件,还能看到相关文件也变更,比如黑客通过修改 /etc/rc.d/init.d/network 文件来进行启动: ? 同时修改 /etc/resolv.conf : ?

3.1K80

Linux中查看端口哪个进程占用、进程调用的配置文件、目录等

1.查看被占用的端口的进程,netstat/ss -antulp | grep :端口号 2.通过上面的命令就可以列出,这个端口哪些应用程序所占用,然后找到对应的进程PID 3.根据PID查询进程...如果想详细查看这个进程,PID具体是哪一个进程,可以通过命令的方式进行查看进程的详细信息,ps -ef | grep 进程PID 或者ps -aux | grep 进程PID 通过执行上面的命令,...就可以看到这个进程的详细信息,同时也可以看到这个进程存在的目录,进程执行的文件、配置文件等信息。...4.查看进程所在目录。...通过ll /proc/进程PID/cwd命令,可以直接查看进程所在的目录,这样的话就可以快速定位到进程的目录 查找他的进程目录之后,就可以对这个应用程序进行一系列的操作,比如说重启删除等!

2K20

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
领券