提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、Linux进程概念与PCB
前言
提示:以下是本篇文章正文内容,下面案例可供参考
什么是进程?
进程可以理解为"正在执行的程序",它是程序的一次动态执行过程。与静态的程序不同,进程具有生命周期,会经历创建、运行、等待和终止等不同阶段。
从内核角度看,进程是分配系统资源(CPU时间、内存等)的实体。操作系统通过进程来管理和调度程序的执行,使多个程序能够"同时"运行(并发执行)。
进程控制块(PCB)
操作系统要管理进程,首先需要描述进程。Linux内核通过一个称为进程控制块(Process Control Block, PCB)的数据结构来记录进程的所有信息。在Linux中,PCB的具体实现是task_struct
结构体。
task_struct结构体
task_struct
是Linux内核中非常复杂的一个数据结构,定义在include/linux/sched.h
头文件中。它包含了管理一个进程所需的全部信息,会被装载到内存(RAM)中。
task_struct
的主要内容包括:
-
标识符(PID):唯一标识进程的ID,用于区分不同进程
-
状态:记录进程当前状态(运行、睡眠、停止等)
-
优先级:进程调度的优先级
-
程序计数器:下一条要执行的指令地址
-
内存指针:指向程序代码和进程相关数据的指针
-
上下文数据:进程执行时CPU寄存器的数据
-
I/O状态信息:进程使用的I/O设备和文件列表
-
记账信息:CPU使用时间、时钟数等统计信息
进程的组织方式
Linux内核中所有运行的进程都以task_struct
链表的形式存在。内核维护着一个进程链表,每个task_struct
都包含指向链表前驱和后继的指针:
c
复制
下载
struct task_struct { //... struct list_head tasks; // 进程链表 //... };
这种组织方式使得内核能够高效地遍历和管理所有进程。此外,Linux还使用红黑树等数据结构来加速进程查找。
进程状态
在Linux内核中,进程可能处于以下几种主要状态:
-
R (Running):进程正在运行或在运行队列中等待
-
S (Sleeping):可中断的睡眠状态,等待事件完成
-
D (Disk sleep):不可中断的睡眠状态,通常等待I/O操作
-
T (Stopped):进程被信号暂停执行
-
Z (Zombie):僵尸进程,已终止但未被父进程回收
-
X (Dead):进程完全终止,等待被清除
这些状态定义在内核源代码的task_state_array
数组中:
c
复制
下载
static const char *const task_state_array[] = { "R (running)", /* 0 */ "S (sleeping)", /* 1 */ "D (disk sleep)", /* 2 */ "T (stopped)", /* 4 */ "t (tracing stop)", /* 8 */ "X (dead)", /* 16 */ "Z (zombie)", /* 32 */ };