新网站建设平台站长工具是什么意思
news/
2025/9/23 0:33:09/
文章来源:
新网站建设平台,站长工具是什么意思,微网站制作平台哪个好,羽毛球赛事在哪看[Linux]进程状态 文章目录 [Linux]进程状态进程状态的概念阻塞状态挂起状态Linux下的进程状态孤儿进程 进程状态的概念
了解进程状态前#xff0c;首先要知道一个正在运行的进程不是无时无刻都在CPU上进行运算的#xff0c;而是在操作系统的管理下#xff0c;和其他正在运行…[Linux]进程状态 文章目录 [Linux]进程状态进程状态的概念阻塞状态挂起状态Linux下的进程状态孤儿进程 进程状态的概念
了解进程状态前首先要知道一个正在运行的进程不是无时无刻都在CPU上进行运算的而是在操作系统的管理下和其他正在运行的进程轮流循环使用CPU而操作系统管理进程是否需要放到CPU上进行计算所依据的就是进程状态。
阻塞状态
阻塞状态是进程因为等待某种资源就绪而导致的一种不推进的状态。
阻塞状态从主观上给人的感觉就是进程“卡”住了比如进程在下载某一个软件过程中网络断了进程下载软件的过程就会卡住进程需要等待网络这种资源就绪才能继续推进。因此进程处于阻塞状态时一定是在等待某种资源。进程进入阻塞状态是想要通过等待的方式等具体的资源被别人使用完后给自身使用。
由于操作系统要管理各种各样的硬件因此操作系统需要用某种结构的描述硬件然后为了方便管理要将这些结构组织起来描述这些硬件时会有一个描述信息就是等待队列这个队列会记录正在等待当前硬件资源的进程的PCB操作系统就是通过这样的大致原理实现的让进程进入阻塞状态: 挂起状态
挂起状态是进程等待某种资源就绪时操作系统系统将进程在内存中的代码和数据释放的状态。
挂起状态下进程的PCB还在硬件的等待队列上操作系统认为进程等待的资源需要很长时间才会准备就绪时就会释放进程在内存中的代码和数据让多出来的内存空间用于做其他的事情提高内存的利用率当进程等待的资源准备就绪后操作系统就会把进程的代码和数据再加载到内存中将进程启动起来。
Linux下的进程状态
Linux系统下在kernel源代码里定义了如下进程状态
/*
* The task state array is a strange bitmap of
* reasons to sleep. Thus running is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] {
R (running), /* 0 */
S (sleeping), /* 1 */
D (disk sleep), /* 2 */
T (stopped), /* 4 */
t (tracing stop), /* 8 */
X (dead), /* 16 */
Z (zombie), /* 32 */
};说明: Linux下的进程会在task_struct设置一个变量来记录进程状态。 R状态 R状态就是运行状态说明进程的task_struct在操作系统中的运行状态等待队列之中在操作系统轮循执行处于运行状态的进程的代码的过程中被执行。
注意 运行状态的进程不代表一直都在CPU上执行而是和其他处于运行状态的进程一样轮循的被执行。
为了验证R状态编写如下代码
#include stdio.hint main()
{while(1){}return 0;
}在Linux系统下运行程序并查看进程状态 由于这段代码的执行不需要任何资源不会进入阻塞状态因此会一直保持运行状态。 S状态 S状态是可中断休眠状态可中断休眠状态是Linux系统中阻塞状态的一种。
为了验证S状态编写如下代码
#include stdio.hint main()
{while(1){printf(hello world\n);}return 0;
}在Linux系统下运行程序并查看进程状态 在这段代码中虽然程序是一个死循环操作但是由于循环结构的代码运行很快而将数据打印到屏幕上很慢因此造成了程序运行时大部分的时候都是在等待打印屏幕的资源因此查询状态时大部分时间查询到的都是S状态。另外可中断休眠状态下的进程可以选择输入ctrlz终止进程。 D状态 D状态是不可中断休眠状态不可中断休眠状态是Linux系统中阻塞状态的一种。
D状态是在进程将数据从内存传输到磁盘时磁盘的压力过大导致传输数据的速度很慢进程必须等待数据传输完成处于休眠状态为了避免操作系统将这个处于休眠状态的进程杀死因此将进程设置成不可中断休眠状态。D状态不是一种常见的状态如果进程处于D状态一般说明计算机磁盘压力过大。 T状态 T状态是暂停状态暂停状态下进程不再继续运行。
为了验证T状态编写如下代码
#include stdio.h
#include unistd.hint main()
{int i 1;while(1){printf(hello world %d\n, i);i;sleep(1); //Linux系统提供的休眠函数头文件是unistd.h}return 0;
}在Linux系统下运行程序使用kill -19 进程id暂停进程并查看进程状态 输入kill -18 进程id可以重启进程: 补充: Linux下进程状态后面的的含义是这是一个前台进程: 进程状态中没有的是后台进程: 在Linux下前台进程运行时,bash是失效的而在后台进程运行时bash是可用的另外后台进程可以使用kill -9 进程id来关闭。 t状态 t状态是追踪式暂停状态是T状态的一种特例。
为了验证t状态,可以借用gdb工具,使用gdb开启调试一个程序: Z状态 Z状态被称作僵尸状态僵尸状态下进程已经完全停止了但是保留了进程的task_struct和部分数据。进程进入僵尸状态是为了了解进程的运行结果是否出现问题因为保留的数据中包含退出码等信息而退出码是用于判断进程运行结果是否出现问题的数据。进程终止后都会进入僵尸状态等待父进程的回收处理。
为了验证T状态编写如下代码
#include stdio.h
#include unistd.hint main()
{pid_t id fork();if (id 0){//子进程while(1){printf(我是子进程我的pid:%d,我的ppid:%d\n, getpid(), getppid());sleep(1);}}else if (id 0){while(1){printf(我是父进程我的pid:%d,我的ppid:%d\n, getpid(), getppid());sleep(1);}}return 0;
}在Linux系统下运行程序使用kill -9 进程id杀死子进程并查看进程状态 僵尸进程的危害 由于僵尸状态下进程的task_struct和数据得到保留因此会占用内存空间如果创建多个子进程不回收就会造成大量的空间被占用造成严重的内存泄露问题。 X状态 X状态被称作死亡状态死亡状态下进程完成停止了并且操作系统会很快将进程的task_struct和代码和数据回收释放。
孤儿进程
孤儿进程是在进程运行时父进程停止父进程转为操作系统(1号进程)被操作系统管理的进程。
为了验证孤儿进程编写如下代码:
#include stdio.h
#include unistd.hint main()
{pid_t id fork();if (id 0){//子进程while(1){printf(我是子进程我的pid:%d, 我的ppid:%d\n, getpid(), getppid());sleep(1);}}else if (id 0){//父进程int cnt 5;while(1){printf(我是父进程我的pid:%d, 我的ppid:%d\n, getpid(), getppid());sleep(1);if (--cnt 0) break;}}return 0;
}为了方便编译编写如下makefile文件:
myproc:myproc.cgcc -o $ $^
.PHONY:clean
clean:rm -f myproc准备好代码和makefile文件后编译得到程序然后运行程序并使用while :; do ps axj | head -1 ps axj | grep myproc | grep -v grep; sleep 1; done指令来每隔一秒查询一次进程状态: 进程myproc中的父进程的父进程是bash它停止后进入僵尸状态后bash作为其父进程会进行回收操作因此无法看到其僵尸状态进程myproc中的子进程仍在进行但是原有父进程停止了需要有新的父进程来回收它否则会造成其停止后僵尸状态无法回收的情况。
变成孤儿进程后就变成了后台进程可以选择使用killall 进程名指令杀死同一进程名的所有进程。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910885.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!