深入剖析进程控制块(PCB)、进程状态转换、内存布局、线程结构、文件描述符、调度队列及进程间通信机制
操作系统内核代码运行区域,拥有最高权限。包含系统调用、驱动程序、内核数据结构等。
后进先出(LIFO)数据结构,存储函数调用栈帧、局部变量、函数参数、返回地址。栈向低地址增长,由编译器自动管理。
用于内存映射文件、动态链接库等。可用于匿名映射实现进程间共享内存。
动态内存分配区域,通过 malloc/new 手动申请,free/delete 释放。堆向高地址增长,由程序员手动管理。
存放未初始化的全局变量和静态变量。程序加载时此区域被操作系统初始化为0。节省磁盘空间。
存放已初始化的全局变量和静态变量。可读可写,程序加载时从可执行文件中读取初始值。
存放可执行程序的机器指令。只读区域,防止程序意外修改自身代码。多个进程可共享同一份代码段。
PID: 1234
独立地址空间
资源拥有者
一个非负整数(int),内核用 fd 来追踪进程打开的文件。每个进程有自己的文件描述符表,指向内核中的文件表项。
进程 fd 表 → 内核文件表 → VFS inode
同一文件可被多次打开,每次获得不同的 fd,但共享相同的文件表项(文件偏移量)。
fork() 子进程继承父进程的文件描述符。exec() 保持继承的 fd,除非设置 close-on-exec 标志。
open(), close(), read(), write(), dup(), dup2(), pipe(), socket(), accept()
半双工通信,分为匿名管道(亲缘进程)和命名管道(FIFO)。数据流动,单向传输。
网络通信基础,支持本地(Unix Domain)和网络(TCP/UDP)。全双工通信,可跨主机。
最快 IPC 方式,多进程映射同一块物理内存。需要信号量同步。
内核维护的消息链表,发送/接收格式化消息。异步通信,有边界。
软件中断机制,用于通知进程异步事件。如 SIGINT, SIGKILL, SIGSEGV。
将文件或设备映射到进程虚拟地址空间,也可用作进程间共享内存。
父进程调用 fork(),内核创建子进程。复制父进程的 PCB(PID 除外)、用户空间(写时复制 Copy-On-Write)、文件描述符表等。
内核为新进程分配唯一的进程标识符(PID)。查找 PID 表,确保不重复。PID 通常递增,达到上限后回绕。
复制父进程的资源:页表、文件描述符(共享同一文件表项)、信号处理表、调度信息。根据 clone() 标志决定共享或复制。
初始化进程控制块:设置进程状态为 READY、优先级、父子关系(PPID)、用户/组ID、统计信息等。
将新进程的 PCB 加入就绪队列,等待调度器选中。返回两次:父进程返回子进程 PID,子进程返回 0。
如果需要执行新程序,子进程调用 exec() 替换自己的地址空间为新程序的代码段、数据段等。
进程的上下文 = 进程执行时的状态快照,包括: