Linux进程初识
文章目录
- Linux 进程初识
- 一、进程基础概念
- 1. 进程定义
- 2. 进程标识
- 二、进程管理操作
- 1. 进程创建
- 2. 进程终止
- 3. 进程查看
- 三、进程状态详解
- 1. 主要进程状态
- 2. 特殊进程
- 3. 状态转换机制
- 四、进程调度机制
- 1. 上下文切换
- 2. 进程优先级
Linux 进程初识
一、进程基础概念
1. 进程定义
- 进程:程序执行的一个实例,包括代码、数据和执行上下文
- PCB(进程控制块):操作系统管理进程的核心数据结构(Linux中为
task_struct
) - 设计原理:“先描述后组织” - 通过
task_struct
结构体描述进程,再通过数据结构组织管理
// Linux中的进程控制块
struct task_struct {// 包含进程所有管理信息long state; // 进程状态pid_t pid; // 进程IDstruct files_struct *files; // 打开的文件信息// ... 其他重要字段
};
2. 进程标识
- PID(进程ID):唯一标识进程的无符号整数
- PPID(父进程ID):创建当前进程的父进程ID
// 获取进程标识的系统调用
#include <unistd.h>pid_t getpid(void); // 获取当前进程PID
pid_t getppid(void); // 获取父进程PID
二、进程管理操作
1. 进程创建
- fork():创建子进程的核心系统调用
- 特性:
- 子进程继承父进程的代码和数据
- 父子进程有独立的地址空间
- 调用一次返回两次(父进程返回子进程PID,子进程返回0)
#include <unistd.h>pid_t fork(void); // 返回值:// >0: 父进程,返回值为子进程PID// =0: 子进程// <0: 创建失败
2. 进程终止
- 正常终止:
exit()
系统调用 - 强制终止:
kill -9 PID
:强制终止指定进程Ctrl+C
:终止前台进程
3. 进程查看
-
命令行工具:
ps aux # 查看所有进程 top # 动态查看进程状态 ps -l # 查看当前终端进程
-
/proc文件系统:
- 虚拟文件系统,包含所有进程信息
- 重要目录:
/proc/PID/exe
:进程对应的可执行程序路径/proc/PID/cwd
:进程当前工作目录/proc/PID/status
:进程状态信息
// 更改进程工作目录
chdir("/new/path"); // 系统调用
三、进程状态详解
1. 主要进程状态
状态 | 符号 | 描述 |
---|---|---|
运行 | R | 正在CPU执行或等待调度 |
可中断睡眠 | S | 等待资源(可被信号唤醒) |
暂停/追踪 | T/t | 暂停状态(T:信号暂停,t:调试暂停) |
不可中断睡眠 | D | 深度睡眠(等待I/O,不可被kill) |
僵尸 | Z | 进程结束但资源未释放 |
死亡 | X | 进程终止,资源已释放 |
2. 特殊进程
- 僵尸进程(Z):
- 进程已结束但未被父进程回收
- 保留退出状态供父进程读取
- 危害:导致内存泄漏
- 解决方案:父进程调用
wait()
/waitpid()
- 孤儿进程:
- 父进程先于子进程终止
- 被1号init(PID=1,即操作系统)收养
- 自动回收,不会成为僵尸进程
3. 状态转换机制
-
进程运行:每一个cpu会维护一个运行队列 struct runqueue,进程只要在运行队列里,他的状态就是R。cpu会基于时间片进行轮转调度,让多个进程以切换的方式进行调度,在一个时间段内同时得以推进代码,就叫做并发。任何时刻有多个进程真的在同时运行,叫做并行。
-
阻塞状态:S,D,在等待硬件设备资源时,将该进程从cpu运行队列中剥离下来,放入某一设备的等待队列,因此该进程不会被调度,这就是阻塞状态,当该设备数据准备就绪后,会重新将该进程放入cpu运行队列(进入队列的是test_struct,这个过程也叫唤醒)
-
挂起状态:当内存特别不足时,有一些阻塞状态的进程,将他的代码和数据放入磁盘的swap分区内(唤出),可以清理出来一部分内存空间,此时就是挂起状态,当该进程的外设准备好数据,进程即将唤醒时,在将swap中的代码和数据拿出来(唤入),可以更合理的使用内存资源,具体也可以叫阻塞挂起态,还有其他挂起状态
-
对比总结:
概念 | 描述 | 特点 |
---|---|---|
并发 | 多个进程在单CPU上交替执行 | 宏观同时,微观交替 |
并行 | 多个进程在多CPU上同时执行 | 真正的同时执行 |
阻塞 vs 挂起 | 阻塞:等待资源 挂起:内存不足时移至磁盘 | 挂起是特殊的阻塞 |
四、进程调度机制
1. 上下文切换
- 上下文:CPU寄存器中的进程执行信息(当前执行位置,数据信息等)
- 切换过程:
- 保存当前进程上下文
- 加载新进程上下文
- 执行完新进程后,恢复旧进程上下文,继续执行
- 核心原则:保证进程执行的连续性,具体实现为上下文数据的保护和恢复
- 寄存器与寄存器信息:cpu内的寄存器,是硬件,只有一套,但是寄存器数据可以有很多套,有几个进程,就有几套和该进程对应的上下文数据,即 寄存器 != 寄存器数据
2. 进程优先级
-
优先级概念:
指进程获取某种资源的先后顺序。
在linux中是在task_struct 中的内部字段 int prio,Linux中优先级数字越小,优先级越高。
-
作用: 优先级高的进程有优先执行的权利,配置进城优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的cpu上,这样一来,把不重要的进程安排到某个cpu,可以大大改善系统整体性能。
-
Linux系统中优先级指标:
PRL:代表这个进程可被执行的优先级,其值越小越早执行。
NI:这个进程的nice值,即优先级的修正值,nice值不允许被任意修改,他的范围一般是[-20,19]。
进程优先级计算: 新的优先级 = 进程优先级(固定不变,初识优先级) + nice值。
-
补充概念:
竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
-
查看和修改优先级:
ps -l # 查看进程优先级 top # 动态查看并管理进程 nice -n 5 ./program # 启动时设置优先级 renice 10 -p PID # 修改运行中进程优先级