个人Linux操作系统学习笔记8 - 进程状态与僵尸进程

发布时间:2026/7/14 5:31:46
个人Linux操作系统学习笔记8 - 进程状态与僵尸进程 进程状态操作系统教材中的状态的说明运行阻塞挂起structtask_struct{intstate;}具体操作系统的状态(Linux)一个CPU一个调度队列1.什么叫运行状态2.什么叫阻塞状态#includestdio.hintmain(){inta0;scanf(%d,a);printf(a %d\n,a);return0;}在这个进程运行时如果不输入内容scanf就会一直卡住进程进程无法继续运行这就是阻塞状态。那么scanf在等什么在等键盘输入即——在等硬件就绪硬件是否就绪哪个软件会最先知道操作系统因为操作系统是硬件的管理者。操作系统如何管理硬件先描述再组织structdevice{// 硬件的所有属性structdevice*next;structtask_struct*wait_queue;}使用类似于task_struct一样的链表结构挂起磁盘中有swap分区操作系统在内存不足时会把阻塞状态的进程放到磁盘的swap分区中数据和代码进入磁盘swap分区叫swap out数据和代码进入内存叫swap intask_struct依旧在内存中因为内存资源不足导致进程对应的数据或代码被交换到swap分区(磁盘)这个状态叫挂起将阻塞状态的进程挂起叫阻塞挂起将运行状态的进程挂起叫运行挂起举Linux系统为例$psajxPPIDPID PGID SID TTY TPGID STATUIDTIME COMMAND在查看进程时STAT显示的是查询时进程的状态带IO的程序很容易查出SR: Running运行状态运行状态S: Sleeping阻塞状态休眠状态可被中断休眠(浅度睡眠)可以使用kill命令杀掉进程kill-9[pid]-9表示信号前台进程当一个进程在运行时无论输入什么shell都不再做解释意味着这是一个前台进程前台进程的STAT状态后面有一个号后台进程使用运行后台进程./myprocess此时会发现STAT没有号后台进程无法使用Ctrl C杀掉只能使用发送kill的方式杀掉D: disk sleepLinux特有的状态不可被中断的休眠状态(深度睡眠)当一个进程在访问磁盘IO时不能被OS中断T: Stopped暂停状态使用kill命令中断进程# 中断kill-19[pid]# 继续kill-18[pid]补充kill命令发出的不同信号$kill-l1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR213)SIGPIPE14)SIGALRM15)SIGTERM16)SIGSTKFLT17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP21)SIGTTIN22)SIGTTOU23)SIGURG24)SIGXCPU25)SIGXFSZ26)SIGVTALRM27)SIGPROF28)SIGWINCH29)SIGIO30)SIGPWR31)SIGSYS34)SIGRTMIN35)SIGRTMIN136)SIGRTMIN237)SIGRTMIN338)SIGRTMIN439)SIGRTMIN540)SIGRTMIN641)SIGRTMIN742)SIGRTMIN843)SIGRTMIN944)SIGRTMIN1045)SIGRTMIN1146)SIGRTMIN1247)SIGRTMIN1348)SIGRTMIN1449)SIGRTMIN1550)SIGRTMAX-1451)SIGRTMAX-1352)SIGRTMAX-1253)SIGRTMAX-1154)SIGRTMAX-1055)SIGRTMAX-956)SIGRTMAX-857)SIGRTMAX-758)SIGRTMAX-659)SIGRTMAX-560)SIGRTMAX-461)SIGRTMAX-362)SIGRTMAX-263)SIGRTMAX-164)SIGRTMAX前后台进程的最大区别是前台进程可以获取键盘输入如果后台进程试图从键盘中获取输入就会被暂停t: tracing stop追踪暂停使用gdb进行调试的本质就是启动一个子进程$ gdb myprocess GNU gdb(GDB)Red Hat Enterprise Linux7.6.1-120.el7 Copyright(C)2013Free Software Foundation, Inc. License GPLv3: GNU GPL version3or laterhttp://gnu.org/licenses/gpl.htmlThis isfreesoftware: you arefreeto change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Typeshow copyingandshow warrantyfordetails. This GDB was configured asx86_64-redhat-linux-gnu.For bug reporting instructions, please see:http://www.gnu.org/software/gdb/bugs/... Reading symbols from /home/code/myprocess...done.(gdb)l1#include stdio.h2#include unistd.h3#include sys/types.h45int main()6{7while(1)8{9printf(process: %d\n, getpid());10sleep(1);(gdb)b8Breakpoint1at 0x4005b1:filemyprocess.c, line8.(gdb)r Starting program: /home/code/myprocess Breakpoint1, main()at myprocess.c:99printf(process: %d\n, getpid());Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.3.x86_64其中在b 8后r这个子进程就处于t状态所以gdb的本质就是不断发送-18和-19信号调控进程的运行与暂停X: dead死亡状态进程会被操作系统释放掉Z: zombie僵尸状态指的是只保留进程的task_struct用于让父进程或OS获取子进程的退出数据的状态在X状态之前会先处于Z状态进程要释放时会先处于僵尸状态让操作系统采集信息随后再设置为死亡状态被操作系统清除#includestdio.h#includeunistd.h#includesys/types.hintmain(){// 使用kill命令杀死子进程并让父进程一直死循环即可观察到僵尸状态printf(father process: %d\n,getpid());sleep(3);pid_tidfork();if(id0){// childwhile(1){printf(child process: %d, father is %d\n,getpid(),getppid());sleep(1);}}else{// fatherwhile(1){printf(father process: %d\n,getpid());sleep(1);}}return0;}可以使用以下命令持续性观察while:;dopsajx|head-1psajx|grepmyprocess;sleep1;done1.进程退出了退出信息是什么main函数的返回值或者进程运行时收到的信号值2.进程退出了退出信息保存在哪里保存在进程自己的task_struct结构体中longexit_state;intexit_code,exit_signal;3.检测Z状态进程回收Z状态进程本质是在做什么本质是在检查获取问题2中的数据4.具体怎么回收谁来回收(简单提一下)一般由父进程回收通过系统调用来回收使用waitpid进程等待#includesys/types.h#includesys/wait.hpid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);如果父进程一直不回收呢那么这个进程永远处于Z状态一直维持它的pcbtask_struct不会释放这块内存永远被占用引发内存泄漏如果对应的进程结束了内存泄漏问题还在吗不在。进程结束后代码的泄露的内存会被OS回收。但是常驻进程一定要注意内存泄露

相关新闻