活动介绍
file-type

Linux内核源代码分析:僵死状态与进程状态转换

PDF文件

下载需积分: 50 | 3.66MB | 更新于2024-08-09 | 107 浏览量 | 61 下载量 举报 收藏
download 立即下载
"深入分析Linux内核源代码 陈莉君 编著 人民邮电出版社" 在计算机编程领域,特别是操作系统的设计与实现中,进程的状态是至关重要的概念。标题提到的"僵死状态"是进程生命周期的一个阶段,而描述则详细介绍了等待、暂停和僵死这三种状态。 1. 等待状态: - 进程在等待某个事件或资源时会进入等待状态。Linux中的等待状态分为可中断等待和不可中断等待。 - 可中断等待的进程可以响应信号,一旦收到信号,它可以切换到可运行状态并加入运行队列等待调度。 - 不可中断等待的进程通常因为硬件限制而无法被中断,只能通过特定方法(如唤醒函数`wake_up()`)唤醒。 2. 暂停状态: - 暂停状态的进程通常是因为收到特定信号(如SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU)而停止运行,如进行调试的进程。 - 在这个状态下,进程不会响应除特定信号之外的其他信号,直到收到允许继续执行的信号。 3. 僵死状态: - 僵死状态的进程已经完成其任务,但其父进程尚未对其结束状态进行处理。这会导致进程资源未被释放,形成僵尸进程。 - 正常情况下,父进程应该调用`wait()`或`waitpid()`函数来回收子进程的资源并获取其退出状态,从而结束僵死状态。 深入分析Linux内核源代码的书籍,如陈莉君所著的这本书,将帮助读者理解这些状态如何在内核级别得以实现,以及如何通过源代码理解和控制进程行为。书中的内容可能涵盖进程管理、信号处理、内存管理、调度算法等多个方面,对于操作系统开发者或高级系统管理员来说是宝贵的参考资料。通过学习,读者可以掌握如何跟踪和解决与进程状态相关的各种问题,提高系统效率和稳定性。

相关推荐

filetype

任务描述 通过上一个实训的学习,我们学会了使用fork和vfork创建子进程,在使用fork创建子进程的时候,子进程和父进程的执行顺序是无法预知的。本关我们将介绍如何使得fork创建出来的子进程先执行,随后父进程再执行。 本关任务:学会在多进程中,学会进程的等待处理。 相关知识 在上一个实训的学习,我们知道使用fork可以创建一个进程,并且创建的子进程其执行顺序可能在父进程前,也可能在父进程后。因此,这是由于fork创建的进程是由操作系统调度器来决定执行顺序的。如果,当子进程在父进程前结束,则内核会把子进程设置为一个特殊的状态。这种状态的进程叫做僵死进程(zombie)。尽管子进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存。但是仍然保留了一些信息(如进程号pid退出状态 运行时间等)。只有父进程获取了子进程的这些信息后,子进程才会彻底的被销毁,否则一直保持僵死状态。如果系统中产生大量的僵尸进程,将导致系统没有可用的进程号,从而导致系统不能创建新的进程。 Linux处理僵死进程的方法之一是使用进程等待的系统调用wait和waitpid来使得父进程获取子进程的终止信息。 wait函数和waitpid函数是系统调用函数,因此使用man 2 函数名来查看其使用方法。 wait函数使用方法 wait函数的具体的说明如下: 需要的头文件如下: #include <sys/types.h> #include <sys/wait.h> wait函数格式如下: pid_t wait(int *status); 参数说明: 参数status是一个整数指针,当子进程结束时,将子进程的结束状态字存放在该指针指向的缓存区。利用这个状态字,需要时可以使用一些由 Linux 系统定义的宏来了解子程序结束的原因。这些宏的定义与作用如下: 宏定义 含义 WIFEXITED(status) 子进程正常结束时,返回值为真(非零值) WEXITSTATUS(status) 当WIFEXITED为真时,此宏才可以使用。返回进程退出的代码 WIFSIGNALED(status) 子进程接收到信号结束时,返回值为真。但如果进程接收到信号时调用exit函数结束,则返回值为假 WTERMSIG(status) 当 WIFSIGNALED 为真时,将获得终止该进程的信号 函数返回值说明: 调用成功时,返回值为被置于等待状态的进程的 pid;执行失败返回-1并设置错误代码errno。 案例演示1: 编写一个程序,使用fork函数与wait函数结合创建一个新进程,使得新创建的子进程在父进程前执行。详细代码如下所示: #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> int main() { pid_t pid; pid = fork(); if(pid == -1) { //创建进程失败 printf("创建进程失败(%s)!\n", strerror(errno)); return -1; } else if(pid == 0) { //子进程 sleep(2); printf("This is child process\n"); exit(1); } else { //父进程 int status; if(wait(&status) != -1) { if(WIFEXITED(status)) printf("子进程正常退出,退出代码:%d\n", WEXITSTATUS(status)); } printf("This is parent process\n"); exit(0); } } 将以上代码保存为waitProcess.c文件,编译执行。可以看到执行waitProcess程序后,尽管子进程使用sleep睡眠了2秒,还是子进程先执行,然后父进程才执行。这就是wait的作用,使得父进程一直等待子进程执行结束后才继续执行。 waitpid函数使用方法 waitpid函数的具体的说明如下: 需要的头文件如下:

张_伟_杰
  • 粉丝: 74
上传资源 快速赚钱