1. 进程基础概念与Linux实现
在Linux系统中,进程是操作系统资源分配和调度的基本单位。理解进程的本质对于系统编程和性能优化至关重要。让我们从一个简单的C程序开始观察进程行为:
c复制#include <stdio.h>
#include <unistd.h>
int main() {
while(1) {
printf("Process running...\n");
sleep(1);
}
return 0;
}
编译并运行这个程序后,我们可以在另一个终端使用ps ajx命令查看进程信息:
bash复制$ ps ajx | head -1 && ps ajx | grep myprocess
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
31429 19742 19742 31429 pts/0 19742 S+ 1001 0:00 ./myprocess
1.1 进程的本质
进程不仅仅是运行中的程序,它实际上是以下三部分的组合体:
- 程序代码:存储在.text段的可执行指令
- 相关数据:包括.data段(已初始化全局变量)、.bss段(未初始化全局变量)、堆和栈
- 进程控制块(PCB):Linux中称为task_struct的内核数据结构
操作系统管理进程时,实际上是通过管理PCB链表来实现的。每个PCB包含进程的所有关键信息,操作系统通过遍历和操作这些PCB结构体来实施进程管理。
1.2 Linux中的PCB实现
在Linux内核中,PCB的具体实现是task_struct结构体,它包含了进程的所有属性信息。这个结构体定义在include/linux/sched.h中,部分关键字段包括:
c复制struct task_struct {
volatile long state; // 进程状态
void *stack; // 进程内核栈
unsigned int flags; // 进程标志位
// 进程标识
pid_t pid; // 进程ID
pid_t tgid; // 线程组ID
// 进程关系
struct task_struct __rcu *parent; // 父进程
struct list_head children; // 子进程链表
struct list_head sibling; // 兄弟进程链表
// 内存管理
struct mm_struct *mm; // 内存描述符
// 调度相关
int prio; // 动态优先级
int static_prio; // 静态优先级
struct list_head run_list; // 运行队列链表
// 文件系统
struct files_struct *files; // 打开的文件信息
// 信号处理
struct signal_struct *signal;
