导航:首页 > 操作系统 > linux进程休眠

linux进程休眠

发布时间:2023-07-08 19:23:33

linux进程的几种状态

Linux中进程分类

①交互进程:由一个shell启动的进程,交互进程既可以在前台运行,也可以在后台运行。

②批处理进程:这种进程和终端没有联系,是一个进程序列。

③监控进程:也称守护进程,是一个在后台运行且不受任何终端控制的特殊进程,用于执行特定的系统任务。

进程的状态

①可运行状态:此时进程正在运行或者正在运行队列中等待准备运行。

②等待状态:此时进程在等待一个事件的发生或某种系统资源。在Linux系统中等待状态又细分为两种等待状态:可中断的等待状态和不可中断的等待状态。

③暂停状态:处于暂停状态的进程被暂停运行。

④僵死状态:每个进程在运行结束后都会处于僵死状态,等待父进程调用进而释放系统资源,处于该状态的进程已经运行结束,但是它的父进程还没有释放其系统资源。

Ⅱ linux中程序处于停止态可以被唤醒吗

在Linux中,休眠主要分三个主要的步骤:
1) 冻结用户态进程和内核态任务
2) 调用注册的设备的suspend的回调函数, 顺序是按照注册顺序
3) 休眠核心设备和使CPU进入休眠态, 冻结进程是内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文.
当这些进程被解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行。
如何让Linux进入休眠呢?用户可以通过读写sys文件/sys /power/state 是实现控制系统进入休眠. 比如
# echo mem > /sys/power/state
命令系统进入休眠. 也可以使用

# cat /sys/power/state
来得到内核支持哪几种休眠方式.
1. 相关代码

• kernel/kernel/power/main.c
• kernel/arch/arm/mach-xxx/pm.c
• kernel/driver/base/power/main.c

接下来让我们详细的看一下Linux是怎么休眠/唤醒的:
用户对于/sys/power/state 的读写会调用到 kernel/kernel/power/main.c中的state_store(),
用户可以写入 const char * const pm_states[] 中定义的字符串, 比如"mem", "standby"。

const char *const pm_states[PM_SUSPEND_MAX] = {
#ifdef CONFIG_EARLYSUSPEND
[PM_SUSPEND_ON] = "on",
#endif
[PM_SUSPEND_STANDBY] = "standby",
[PM_SUSPEND_MEM] = "mem",
};
常见有standby(suspend to RAM)、mem(suspend to RAM)和disk(suspend to disk),只是standby耗电更多,返回到正常工作状态的时间更短。

然后state_store()会调用enter_state()<注:这是经典Linux调用流程, 在Android系统中,
Kernel将调用request_suspend_state,而不是enter_state>,它首先会检查一些状态参数,然后同步文件系统。

2. 准备, 冻结进程
当进入到suspend_prepare()中以后, 它会给suspend分配一个虚拟终端来输出信息, 然后广播一个系统要进入suspend的Notify,
关闭掉用户态的helper进程, 然后一次调用suspend_freeze_processes()冻结所有的进程, 这里会保存所有进程当前的状态,
也许有一些进程会拒绝进入冻结状态, 当有这样的进程存在的时候, 会导致冻结失败,此函数就会放弃冻结进程,并且解冻刚才冻结的所有进程。

3. 让外设进入休眠
现在, 所有的进程(也包括workqueue/kthread) 都已经停止了,内核态人物有可能在停止的时候握有一些信号量,
所以如果这时候在外设里面去解锁这个信号量有可能会发生死锁,所以在外设的suspend()函数里面作lock/unlock锁要非常小心,
这里建议设计的时候就不要在suspend()里面等待锁。而且因为suspend的时候,有一些Log是无法输出的,所以一旦出现问题,非常难调试。

然后kernel在这里会尝试释放一些内存。

最后会调用suspend_devices_and_enter()来把所有的外设休眠, 在这个函数中,
如果平台注册了suspend_ops(通常是在板级定义中定义和注册,在kernel/arch/arm/mach-xx/pm.c中调用suspend_set_ops),
这里就会调用 suspend_ops->begin(); 然后调用dpm_suspend_start,他们会依次调用驱动的suspend() 回调来休眠掉所有的设备。

当所有的设备休眠以后, suspend_ops->prepare()会被调用, 这个函数通常会作一些准备工作来让板机进入休眠。
接下来Linux,在多核的CPU中的非启动CPU会被关掉,通过注释看到是避免这些其他的CPU造成race condio,接下来的以后只有一个CPU在运行了。

suspend_ops 是板级的电源管理操作, 通常注册在文件 arch/arch/mach-xxx/pm.c 中.

接下来, suspend_enter()会被调用, 这个函数会关闭arch irq, 调用 device_power_down(), 它会调用suspend_late()函数,
这个函数是系统真正进入休眠最后调用的函数,通常会在这个函数中作最后的检查。 如果检查没问题, 接下来休眠所有的系统设备和总线,
并且调用 suspend_pos->enter() 来使CPU进入省电状态,这时就已经休眠了。代码的执行也就停在这里了。

三、Linux Resume流程

如果在休眠中系统被中断或者其他事件唤醒,接下来的代码就会开始执行,这个唤醒的顺序是和休眠的循序相反的,
所以系统设备和总线会首先唤醒,使能系统中断,使能休眠时候停止掉的非启动CPU, 以及调用suspend_ops->finish(),
而且在suspend_devices_and_enter()函数中也会继续唤醒每个设备,使能虚拟终端, 最后调用 suspend_ops->end()。

在返回到enter_state()函数中的,当 suspend_devices_and_enter() 返回以后,外设已经唤醒了,
但是进程和任务都还是冻结状态, 这里会调用suspend_finish()来解冻这些进程和任务, 而且发出Notify来表示系统已经从suspend状态退出, 唤醒终端。

到这里,所有的休眠和唤醒就已经完毕了,系统继续运行了。

Ⅲ linux系统c语言进程不想被sleep阻塞等待怎么解决

1、启动后台子任务,在执行命令后加&操作符,表示将命令放在子shell中异步执行。可以达到多线程效果。如下,sleep10#等待10秒,再继续下一操作sleep10&#当前shell不等待,后台子shell等待。
2、wait命令wait是用来阻塞当前进程的执行,直至指定的子进程执行结束后,才继续执行。使用wait可以在bash脚本“多进程”执行模式下,起到一些特殊控制的作用。

Ⅳ Linux为啥有很多sleeping进程呢

sleeping本身是正常的,是休眠的意思。对于单CPU系统来讲,某个时间点上只有一个running的进程,其他进程为休眠或就绪状态。关键是你的进程数量太多了,看看是哪些进程这么多。

阅读全文

与linux进程休眠相关的资料

热点内容
安卓手机怎么群发小费才不会被锁 浏览:741
相机文件夹设置 浏览:855
centos7php怎么用 浏览:119
查看linux操作系统版本的命令 浏览:382
收支预算法怎么做 浏览:875
模板如何上传到服务器 浏览:372
如何同步安卓信息到新ipad 浏览:364
腾讯云轻量服务器流量警告 浏览:503
u盘备份linux 浏览:120
高压缩比活塞 浏览:92
压缩弹簧标准件 浏览:25
linux统计个数命令 浏览:292
cad转pdf居中 浏览:8
编译型语言处理过程 浏览:325
手机创文件夹复制到电脑 浏览:984
有什么直播APP可以看那种 浏览:41
程序员叫什么人 浏览:378
python画地图等高线 浏览:751
epic永劫无间是什么服务器 浏览:444
网游服务器下载地址 浏览:107