1. 进程基础概念

进程的定义:进程是操作系统中的一次执行过程,它是操作系统进行资源分配和调度的最小单位。

进程的核心特征

1.动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的;

2.并发性:任何进程都可以同其他进程一起并发执行;

3.独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。

4.异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程各自独立、不可预知的速度向前执行。

进程的组成

进程是由三个部分组成的,分别为控制块(PCB)、文本段数据段

进程控制块:PCB是操作系统用于管理和控制进程的核心数据结构,每个进程在内存中都有唯一的PCB,他记录着进程的所有关键信息(进程识别信息、状态信息、内存管理信息、资源占用信息等),是操作系统感知进程存在的依据;

文本段:是进程中存储可执行指令的内存区域,即程序编译后生成的机器码;

数据段:是用于存储进程运行过程中需要的数据;根据数据“初始化状态”和“可修改性”,可分为初始化数据段、未初始化数据段、堆、栈。

虚拟地址和物理地址的映射关系

在计算机系统中,程序(进程)看到的地址是虚拟地址,而数据真正存放在内存条(RAM)上的地址是物理地址。它们之间的映射关系是由操作系统和CPU的内存管理单元(MMU)共同协作完成的。

进程的状态

运行态(R):正在cpu执行或者等待调度;

可中断睡眠态(S):等待事件(如I/O),可被信号唤醒;

不可中断睡眠态(D): 等待关键硬件操作,不能被信号中断;

停止态(T):收到SIGSTOP信号暂停;

僵尸态(Z):进程终止,但PCB未被父进程回收;

死亡态(X):资源已释放(瞬间状态)。

特殊进程PID

0号进程:系统启动的第一个进程,负责空闲CPU调度。

1号进程:负责系统初始化、启动服务、回收孤儿进程。

2号进程:负责内核线程调度。

2. 多进程核心函数

进程号获取

getpid() : 获取当前进程PID。

getppid(): 获取父进程PID。

进程终止

exit:标准库函数,会刷新缓冲区,执行清理函数,然后终止。

_exit: 系统调用,立即终止,不刷新缓冲区。

资源回收(解决僵尸进程)

wait(int*wstatus): 父进程阻塞等待任意一个子进程结束,并回收资源。

状态解析宏:

WIFEXITED(wstatus): 判断是否正常终止。

WEXITSATUS(wstatus): 获取退出码。

WIFSIGNALED(wstatus): 判断是否被信号杀死。

waitpid(pid_t pid,int*wstatus,int options): 更灵活的回收函数

pid>0:等待指定PID的子进程。

options = WNOHANG:非阻塞等待。

3. 特殊进程

1.孤儿进程

定义::父进程先于子进程终止,子进程被1号进程(init)收养。

产生原因:父进程意外崩溃、被强制终止(kill -9)或主动退出。

特点:正常运行,完成任务后能正常终止。

影响:无负面影响,是系统正常机制,避免了“无主进程”。

2.僵尸进程

1.定义: 子进程先终止,但父进程未调用 wait()/waitpid() 回收其 PCB,导致进程状态变为 Z

2.影响:PCB (包含 PID) 占用内存资源,大量僵尸进程会耗尽 PID 资源,导致无法创建新进程。

3.处理:<1>父进程调用 wait() 或 waitpid()

<2>kill -9 无法杀死僵尸(因为它已死)。只能终止父进程,让僵尸被 1 号进程收养,由 1 号进程自动回收。

3.守护进程

1.定义:运行在后台的特殊进程,独立于控制终端,用于提供系统服务或执行周期性任务

2.特点:父进程为1号进程

             无法控制终端

             运行目录通常为 /, 文件描述符重定向到/dev/null。

3.创建流程:

  1. 父进程 fork() 后退出,子进程成为孤儿进程(被 1 号收养)。
  2. 子进程调用 setsid() 创建新会话,脱离原终端。
  3. chdir("/") 改变工作目录。
  4. umask(0) 修改文件掩码。
  5. 关闭从父进程继承的文件描述符。
  6. 重定向标准输入/输出/错误到 /dev/null

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐