1.Linux电源管理之休眠
2.除了运行、休眠休眠休眠…进程居然还有僵尸、源码孤儿状态
3.Kswapd 源码解析
4.Java多线程中sleep方法中参数为负数和正数有什么区别?
Linux电源管理之休眠
当嵌入式设备依赖电池供电时,关闭电源管理变得至关重要。代码电源管理的休眠休眠目的是在不影响设备正常功能的前提下,最大程度地节省电能。源码java传奇游戏源码这一概念在移动设备中尤为常见。关闭
Linux内核提供了三种休眠模式:Freeze、代码Standby和STR(Suspend to RAM)。休眠休眠通过向“/sys/power/state”文件写入“freeze”、源码“standby”或“mem”,关闭可以在用户空间触发这些模式。代码
如何进入Suspend模式呢?
内核中与Suspend功能相关的休眠休眠admui框架源码代码包括PM core、Device PM、源码Platform PM等几个主要部分,关闭具体如下:
1)PM Core
2)Device PM
3)Platform dependent PM
下面这张图对Linux suspend & resume过程进行了概述,读者可以按照这个流程阅读内核源代码。具体说明请参考后面的代码分析。
系统初始化时,会调用pm_init函数,主要完成以下任务:
当我们执行echo "mem" > /sys/power/state命令时,可以在串口上分析休眠代码。
总结上述休眠相关的调用流程:
内核提供的PM中的两个重要结构体:
结合上述代码过程和suspend过程概述图,有助于理解其工作原理。
如果本文对你有所帮助,html源码 页脚请一键三连+关注。下篇文章将讲解resume的过程。
参考文章:
Linux电源管理(6)_Generic PM之Suspend功能 (wowotech.net)
Linux内核睡眠唤醒调试_pm_freeze_timeout-CSDN博客
除了运行、休眠…进程居然还有僵尸、孤儿状态
认识进程状态
在Linux中,进程状态一般包括运行状态、休眠状态、暂停状态、退出状态等。这些状态在kernel源代码中有特定的定义。
如何查看进程状态
要观察进程状态,可以写一段简单的电气安装源码代码。运行该程序之后,查看进程的状态,通常会看到R状态。R状态表示进程正在等待被CPU调度。要看到R状态,可以修改代码使其不停做重复运算,使CPU一直被调度。
S状态与D状态
S状态是休眠状态,进程因为等待资源而暂停执行,但不能占用CPU。D状态也是休眠状态,但进程在磁盘中休眠,c 打洞源码以防止被中断。
T状态是停止状态,进程暂停执行,通常在调试时设置断点。
如何看到僵尸进程
编写一段代码,运行后正常的程序运行。执行指令终止子进程后,子进程将变为僵尸进程。僵尸进程状态表明进程已终止但没有父进程。
孤儿进程
若父进程提前挂掉,子进程会成为孤儿进程。孤儿进程会被系统自动领养,通常由系统进程(如1号进程)接管。如果父进程挂掉后不及时处理,子进程可能会成为僵尸进程,造成系统资源浪费。
Kswapd 源码解析
kswapd是Linux内核中的一个内存回收线程,主要用于内存不足时回收内存。初始化函数为kswapd_init,内核为每个节点分配一个kswapd进程。每个节点的pg_data_t结构体中维护四个成员变量,用于管理kswapd线程。
在初始化后,每个节点的kswapd线程进入睡眠状态。唤醒时机主要在被动唤醒和主动唤醒两种场景:被动唤醒是内存分配进程唤醒并完成异步内存回收后,对节点内存环境进行平衡度检查,若平衡则线程短暂休眠ms后主动唤醒。主动唤醒是内存回收策略调用kswapd,对节点进行异步内存回收,让节点达到平衡状态。
内存回收包括快速和直接两种方式,但系统周期性调用kswapd线程平衡不满足要求的节点,因为有些任务内存分配不允许阻塞或激活I/O访问,回收内存相当于亡羊补牢,系统利用空闲时间进行内存回收是必要的。
kswapd线程通过module_init(kswapd_init)创建,一般处于睡眠状态等待被唤醒,当系统内存紧张时,会唤醒kswapd线程,调整不平衡节点至平衡状态。
kswapd函数包含alloc_order、reclaim_order和classzone_idx三个变量,用于控制线程执行流程。kswapd_try_to_sleep函数判断是否睡眠并让出CPU控制权,同时是线程唤醒的入口。balance_pgdat函数是实际内存回收操作,涉及内存分配失败后唤醒kswapd线程,调用此函数对指定节点进行异步内存回收。
kswapd_shrink_node函数通过shrink_node对低于sc->reclaim_idx的非平衡zone区域进行回收。
总结kswapd执行流程,其生命周期与Linux操作系统相似,平时处于睡眠状态让出CPU控制权。在内存紧张时被唤醒,有被动唤醒和周期性主动唤醒两种时机。被动唤醒发生在内存分配任务获取不到内存时,表明系统内存环境紧张,主动唤醒则是内存回收策略的执行。线程周期性唤醒在被动唤醒后的短暂时间内,原因在于系统内存环境紧张,需要在这段时间内进行内存回收。
Java多线程中sleep方法中参数为负数和正数有什么区别?
首先这个参数是必须>=0的,如果输入负数会抛出异常:
java.lang.IllegalArgumentException: timeout value is negative
再看看源码中这个方法的注释
* Causes the currently executing thread to sleep (temporarily cease
* execution) for the specified number of milliseconds, subject to
* the precision and accuracy of system timers and schedulers. The thread
* does not lose ownership of any monitors.
大概翻译过来意思就是
当前线程休眠(暂时中止执行)指定数值(毫秒)的时长,当前线程仅仅是休眠,并不会释放临界资源锁(如果有的话)