从源码分析 PCB(以 Linux 内核为例)
在操作系统中,PCB(进程控制块) 是描述进程状态和资源的核心数据结构。不同系统的实现有差异,本文以 Linux 5.15 内核为例,分析其 PCB 实现——task_struct(位于 include/linux/sched.h)。
1. 核心结构体:task_struct
Linux 的 PCB 是一个 2000+ 行的复杂结构体,涵盖进程的所有信息。以下列举关键字段:
(1) 进程状态
volatile long state; // 进程状态(如运行、就绪、阻塞等)
int exit_state; // 退出状态
状态常量定义在 include/linux/sched.h:
#define TASK_RUNNING 0x0000
#define TASK_INTERRUPTIBLE 0x0001
#define TASK_UNINTERRUPTIBLE 0x0002
#define __TASK_STOPPED 0x0004
#define __TASK_TRACED 0x0008
/* ... */
(2) 进程标识
pid_t pid; // 进程 ID
pid_t tgid; // 线程组 ID(主线程 PID)
struct task_struct *parent; // 父进程指针
struct list_head children; // 子进程链表
struct list_head sibling; // 兄弟进程链表
(3) 调度信息
int prio; // 动态优先级
int static_prio; // 静态优先级
const struct sched_class *sched_class; // 调度器类(CFS、RT 等)
struct sched_entity se; // 调度实体(用于 CFS)
struct sched_rt_entity rt; // 实时调度实体
unsigned int policy; // 调度策略(SCHED_NORMAL、SCHED_FIFO 等)
(4) 内存管理
struct mm_struct *mm; // 进程内存描述符(地址空间、页表等)
struct vm_area_struct *mmap; // 虚拟内存区域链表
(5) 文件系统
struct files_struct *files; // 打开的文件描述符表
struct fs_struct *fs; // 工作目录等信息
(6) 信号处理
struct signal_struct *signal; // 信号处理函数指针
sigset_t blocked; // 阻塞的信号掩码
struct sigpending pending; // 待处理信号队列
(7) 计时与统计
u64 utime, stime; // 用户态/内核态 CPU 时间
unsigned long nvcsw, nivcsw; // 自愿/非自愿上下文切换计数
struct timespec64 start_time;// 进程启动时间戳
2. 关键工作机制
(1) 进程创建(fork() 源码路径)
- 入口:
kernel/fork.c→_do_fork() - 核心步骤:
- 调用
copy_process()复制父进程的task_struct。 - 为新进程分配新的内核栈(
alloc_thread_stack_node())。 - 复制资源(文件描述符、信号处理、内存映射等)。
- 将新进程加入调度队列(
wake_up_new_task())。
- 调用
(2) 状态转换示例
- 睡眠 → 就绪:当进程等待 I/O 时:
// 进入睡眠(例如等待键盘输入) set_current_state(TASK_INTERRUPTIBLE); schedule(); // 主动让出 CPU - 输入到达后,内核通过
wake_up_process(task)将其状态改为TASK_RUNNING。
3. 典型操作
查找进程(通过 PID):
struct task_struct *find_task_by_vpid(pid_t pid) {
return pid ? find_task_by_pid_ns(pid, task_active_pid_ns(current)) : NULL;
}
获取当前进程:
内核通过 current 宏(通常用 Per-CPU 变量或 寄存器缓存)快速访问当前进程的 task_struct:
// x86 实现(通过栈偏移定位)
#define current get_current()
static __always_inline struct task_struct *get_current(void) {
return this_cpu_read_stable(pcpu_hot.current_task);
}
4. 设计特点
- 统一线程模型:
线程与进程共用task_struct,线程通过共享mm_struct(内存空间)和files_struct(文件句柄)实现轻量化。 - 高效访问:
current宏通过硬件特性(如 x86 的%gs寄存器)实现纳秒级访问当前 PCB。 - 模块化组织:
资源通过指针分离(如mm_struct、files_struct),便于共享和写时复制(Copy-On-Write)。
总结
- Linux 的 PCB 实现为
task_struct,涵盖进程所有关键信息。 - 通过 统一线程模型 和 资源指针分离 实现高效管理。
- 进程状态转换、调度、资源分配等功能均围绕
task_struct展开。
提示:深入源码可参考 Linux Kernel Source 搜索
task_struct。
PCB线路板溯源镭雕机,电路板追溯码机
1970-01-01 08:00:00 至 1970-01-01 08:00:00
源码分析从 import axios from 'axios' 的执行过程-1
这两篇文章我们看一下 axios 的相关知识。从 import axios from 'axios' 再到 axios 的内部源码,带大家看一下经典库的运行流程。
2023-03-01 10:01:44
Linux内核源码之我见——内核源码的分析方法
的代码高手。透过阅读Linux内核代码的方式,我们学习到的不光是内核相关的知识,在我看来更具价值的是学习和体会它们的编程技巧以及对计算机的理解。我也是通过一个项目接触了Linux内核源码的分析,
2020-05-11 07:00:00
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机