当前位置:首页>Linux>Linux系统进程控制与通信 知识大纲

Linux系统进程控制与通信 知识大纲

  • 2026-08-28 01:17:59
Linux系统进程控制与通信 知识大纲

一、进程基础概念

1.1 进程定义

  • 进程是Linux系统调度和资源管理的基本单位
  • 内核将进程存放在任务队列的双向循环链表中
  • 双向循环链表:可前进、可反向遍历

1.2 进程描述符(task_struct)

  • 包含一个具体进程的所有信息
  • 内核通过task_struct指针访问和管理进程
  • current宏:查找当前正在运行进程的进程描述符
  • 硬件体系结构差异:有的用专用寄存器存放指针,有的通过计算偏移间接查找

1.3 进程标识(PID)

  • PID是唯一的进程标识符,为int类型
  • 默认最大值32768(short int最大值),兼容旧版UNIX/Linux
  • 可通过/proc/sys/kernel/pid_max修改上限
  • PID最大值决定系统允许同时存在的进程最大数目

1.4 内存分配机制

  • slab分配器:预先分配和重复使用task_struct,避免动态分配的资源消耗

二、进程类型

2.1 用户进程

  • 由用户启动的应用程序(如浏览器、音乐播放器)

2.2 守护进程

  • 后台持续运行的服务程序
  • 不依赖用户交互,保证系统或服务正常工作

2.3 批处理进程

  • 无需用户实时干预,自动完成一系列任务
  • 如定时清理文件、备份数据的脚本

三、进程创建

3.1 创建步骤

  1. 初始化PCB,分配有效PID
  2. 设置进程优先级和CPU时间片
  3. 为进程分配内存空间
  4. 加载任务到内存,复制进程代码
  5. 设置进程状态为就绪态
  6. 将PCB放入进程队列

3.2 进程队列管理

  • 操作系统将PCB放入队列,新进程放队尾
  • 进程执行完后从队列中剔除

四、进程队列

4.1 运行队列

  • 可运行状态进程的双向循环链表
  • 内核从中选择进程在CPU上运行

4.2 等待队列

  • 睡眠状态进程放入等待队列
  • 基于双循环链表的数据结构
  • 用于实现核心的异步事件通知机制

五、进程状态

5.1 五种基本状态

状态
英文
说明
运行/就绪态
TASK_RUNNING
正在运行或等待调度
可中断睡眠态
TASK_INTERRUPTIBLE
等待事件,可被信号唤醒
不可中断睡眠态
TASK_UNINTERRUPTIBLE
等待硬件操作,不响应异步信号
僵尸态
TASK_ZOMBIE / TASK_DEAD
进程结束,等待父进程回收
停止/跟踪态
TASK_STOPPED / TASK_TRACED
进程被暂停,用于调试

5.2 状态转换流程

就绪态 → 运行态 → 睡眠态(可中断/不可中断)→ 就绪态 → 运行态 → 僵尸态 → 销毁

5.3 进程查看命令

  • ps -aux:查看进程状态
  • STAT字段含义:R(运行)、S(睡眠)、D(不可中断睡眠)、Z(僵尸)、T(停止)
  • 组合状态:S+(前台睡眠)、Sl(多线程睡眠)、Ss(会话首进程睡眠)等

六、进程调度

6.1 基本概念

  • 按一定调度策略让进程取得CPU执行权
  • 增加系统的实时性和交互性

6.2 时间片机制

  • 系统分配给每个进程的运行时间段
  • 定时器中断处理程序对时间片递减
  • 时间片用尽:进程挂起,调度新进程
  • 时间片结束前阻塞或结束:CPU当即切换

6.3 多任务模式

  • 抢占式多任务:由调度程序决定何时停止进程(Linux采用)
  • 非抢占式多任务:进程主动让出CPU

七、虚拟内存

7.1 基本概念

  • 将系统硬盘空间和实际内存联合供进程使用
  • 提供比物理内存大得多的虚拟空间(32位系统为4GB)

7.2 地址空间划分

  • 0~3GB:用户空间(用户态进程可直接访问)
  • 3~4GB:内核空间(仅内核态进程可直接访问)

7.3 地址映射机制

  • 段机制:逻辑地址 → 线性地址,隔离用户数据和系统数据
  • 页机制:线性地址 → 物理地址,页大小通常为4KB
  • 缺页中断:虚拟地址不在物理内存时,从硬盘调入数据

7.4 特权切换

  • 用户态进程通过系统调用和中断进入内核空间

八、进程控制编程

8.1 启动进程

  • system()函数:执行外部命令
  • exec函数族(6个):替换当前进程映像
    • execl、execv、execle、execve、execlp、execvp

8.2 创建进程

  • fork():创建子进程,复制父进程地址空间
  • vfork():共享父进程地址空间,节省资源
  • getpid() / getppid():获取当前进程ID / 父进程ID

8.3 等待进程

  • wait():等待任意子进程结束
  • waitpid():等待指定子进程结束
  • 回收子进程资源,获取退出状态

8.4 终止进程

  • 正常终止(5种):exit、_exit、return、被信号终止等
  • 异常终止(3种):SIGILL、SIGABRT、SIGSEGV、SIGBUS等

8.5 守护进程

  • 后台运行,独立于用户终端
  • 创建步骤:fork、setsid、重定向标准输入输出、关闭文件描述符

九、进程间同步机制

9.1 文件锁

  • 防止多个进程同时操作一个文件
  • 关闭描述符、进程终止时锁被释放
  • fork产生的子进程不继承父进程锁
  • exec后新程序继续执行原程序的文件锁

9.2 线程锁(细粒度控制)

锁类型
特点
使用场景
互斥锁(Mutex)
一次只有一个线程访问
保护临界资源
读写锁
多读单写
读多写少场景
条件变量
等待特定条件
协调执行顺序

9.3 锁的粒度

  • 细粒度:锁定具体数据,提高并发度
  • 粗粒度:锁定大范围,编程简单但性能低
  • 避免过度锁定,合理设计锁范围

十、进程间通信(IPC)

10.1 通信方式对比

方式
连接性
可靠性
消息类型
优先级
适用场景
管道(Pipe)
无连接
可靠
字节流
无
亲缘进程间单向通信
命名管道(FIFO)
无连接
可靠
字节流
无
任意进程间通信
消息队列
无连接
可靠
消息块
有
复杂消息传递
信号量
—
—
—
—
进程同步
共享内存
无连接
需同步
原始内存
无
大量数据高速交换
信号(Signal)
无连接
不可靠
信号值
无
事件通知
套接字(Socket)
可选
可选
字节流/数据报
无
本地/网络通信

10.2 管道

  • 无名管道(Anonymous Pipe):亲缘进程间,单向,先进先出
  • 命名管道(Named Pipe / FIFO):任意进程间,有文件名
  • 标准流管道(Standard Stream Pipe):基于标准输入输出

10.3 消息队列

  • 键值(key)唯一标识消息队列
  • API:msgget(创建)、msgsnd(发送)、msgrcv(接收)、msgctl(控制)

10.4 信号

  • 产生方式:用户输入、系统事件、程序发送、硬件异常
  • 处理方式:默认处理、忽略信号、捕捉信号(自定义处理函数)
  • 常用信号:SIGINT、SIGTERM、SIGKILL、SIGSEGV、SIGCHLD、SIGALRM等
  • 相关函数:signal()、sigaction()、kill()、raise()、alarm()、pause()、abort()

10.5 信号量

  • 操作:P操作(wait/等待)、V操作(signal/释放)
  • 控制信号量:初始化(sem_init)
  • 操作信号量:等待(sem_wait)、释放(sem_post)
  • 销毁信号量:sem_destroy

10.6 共享内存

  • 创建:shmget(生成key、创建内存段)
  • 连接:shmat(映射到进程地址空间)
  • 使用:直接读写内存
  • 解除连接:shmdt
  • 删除:shmctl(IPC_RMID)
  • 同步问题:需配合互斥锁、信号量等机制避免竞争冲突

十一、综合应用要点

  • 进程创建 → 调度执行 → 同步互斥 → 通信协作 → 终止回收
  • 不同IPC方式的选择依据:数据量、速度要求、进程关系、是否需要跨网络
  • 同步机制的核心目标:保证数据一致性,防止竞态条件

最新文章

随机文章