欢迎来到皮皮网网首页

【mql5 源码】【android面试源码】【尖叫体源码】休眠 源码_关闭休眠代码

来源:叮咚买菜网站源码 时间:2024-12-27 13:55:15

1.Linux电源管理之休眠
2.除了运行、休眠休眠休眠…进程居然还有僵尸、源码孤儿状态
3.Kswapd 源码解析
4.Java多线程中sleep方法中参数为负数和正数有什么区别?

休眠 源码_关闭休眠代码

Linux电源管理之休眠

       当嵌入式设备依赖电池供电时,关闭电源管理变得至关重要。代码电源管理的休眠休眠目的是在不影响设备正常功能的前提下,最大程度地节省电能。源码mql5 源码这一概念在移动设备中尤为常见。关闭

       Linux内核提供了三种休眠模式:Freeze、代码Standby和STR(Suspend to RAM)。休眠休眠通过向“/sys/power/state”文件写入“freeze”、源码“standby”或“mem”,关闭可以在用户空间触发这些模式。代码

       如何进入Suspend模式呢?

       内核中与Suspend功能相关的休眠休眠android面试源码代码包括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过程概述图,有助于理解其工作原理。

       如果本文对你有所帮助,尖叫体源码请一键三连+关注。下篇文章将讲解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状态也是休眠状态,但进程在磁盘中休眠,网站源码集成以防止被中断。

       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.

       大概翻译过来意思就是

       当前线程休眠(暂时中止执行)指定数值(毫秒)的时长,当前线程仅仅是休眠,并不会释放临界资源锁(如果有的话)