文章目录
- 一、进程的定义
- 二、 描述进程-PCB
- task_ struct内容分类
- 三、 进程状态
一、进程的定义
- 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
- 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
二、 描述进程-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。称之为PCB(process control block),Linux操作系统下的PCB是 task_struct
task_ struct内容分类
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
大体图
三、 进程状态
在Linux系统中,进程的状态可以通过多种方式来查看,最常见的方式是使用ps
命令和top
命令。以下是一些常见的进程状态及其解释:
-
R (运行状态):
- 进程正在运行或在运行队列中等待。
-
S (可中断的睡眠状态):
- 进程正在等待某个事件完成,可以被信号中断。例如,等待用户输入或等待资源变得可用。
-
D (不可中断的睡眠状态):
- 进程处于睡眠状态,但不可被信号(signal)中断。这通常表示进程正在等待I/O操作(如磁盘操作)完成。
使用htop命令查看
-
T (停止状态):
- 进程已被停止(通常是通过信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU)。
使用 19) SIGSTOP 号信号停止正在运行的进程
kill -19 pid
-
t (跟踪或停止状态):
- 进程被跟踪,通常是由调试器停止的。
使用gdb调试时查看进程状态
- 进程被跟踪,通常是由调试器停止的。
-
Z (僵尸状态):
- 进程已经结束,但其父进程尚未通过
wait()
系统调用来回收其资源。此时,进程仍保留在进程表中,但不再占用系统资源(除了进程表项)。 - 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
代码如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // 包含 sleep 和 getpid 函数所需的头文件
#include <sys/types.h> // 包含 pid_t 所需的头文件
int main() {
pid_t id = fork();
if (id < 0) {
perror("fork");
return 1;
} else if (id > 0) { // 父进程
printf("parent[%d] is sleeping...\n", getpid());
sleep(30); // 父进程休眠30秒
} else { // 子进程
printf("child[%d] is beginning Z...\n", getpid());
sleep(5); // 子进程休眠5秒
exit(EXIT_SUCCESS); // 子进程正常退出
}
return 0;
}
如下图
僵尸进程危害
僵尸进程(Zombie Process)在Linux操作系统中是一种特有的进程状态,这种状态的进程不再占用CPU或内存资源(除了进程表中的一个槽位),但它们仍然会对系统产生一些潜在的危害。
-
资源浪费:
- 僵尸进程虽然不再执行任何代码或占用CPU时间,但它们仍然占用系统进程表中的一个槽位。在进程表资源有限的情况下,如果僵尸进程数量过多,可能会导致进程表溢出,进而影响到系统的正常运行。
- 此外,由于父进程需要维护对子进程的引用,这也会占用一定的系统资源。
-
进程号枯竭:
- 系统中的进程号是有限的。如果僵尸进程过多,它们会占用大量的进程号,导致系统无法分配新的进程号给新创建的进程。这可能会影响到系统的并发性能和任务调度能力。
-
父进程信息泄漏:
- 僵尸进程仍然保留有关其父进程的一些信息,如父进程的PID(进程标识符)。在某些安全敏感的应用程序中,这可能会导致敏感信息的泄漏。