【系统编程】进程初识
文章目录
- 一、进程和程序
- 1.1 程序
- 1.2 进程
- 1.3 一对多关系
- 二、并发和并行
- 2.1 定义
- 2.2 单道程序设计
- 2.3 多道程序设计
- 三、MMU
- 3.1 作用
- 3.2 工作流程
- 四、PCB(进程控制块)
- 五、进程状态
一、进程和程序
1.1 程序
- 是 存储在磁盘上的可执行文件(如
.out
、.exe
等)。 - 是 静态的,不占用 CPU、内存等系统资源,只占 磁盘空间。
- 是还没有被执行的代码集合,比如编译生成的 ELF 文件。
程序就像是一份 剧本,写好了但还没演出。
1.2 进程
-
是 程序运行后的实例,是程序被加载进内存、被操作系统调度执行的过程。
-
是 动态的,会占用系统资源:
- 内存空间
- CPU 占用
- 打开的文件描述符(I/O)
- 环境变量、用户信息、当前目录等
-
每个进程有自己独立的 运行环境 与 资源上下文。
-
进程生命周期:创建 ➜ 就绪 ➜ 运行 ➜ 阻塞(等待)➜ 终止
进程就像是 剧本正在舞台上被演员表演,需要演员、道具、灯光等各种资源。
-
操作系统通过“进程”来管理和调度一切任务:
- 打开终端、运行程序、看视频、浏览网页本质上都是启动了不同的进程。
-
进程是 系统资源分配和调度的基本单位,对操作系统来说,一切任务都以进程的形式存在。
1.3 一对多关系
一个程序可以创建出多个进程:
- 多次运行同一个程序 ➜ 会产生多个互不影响的进程
- 父子进程或线程池中也是同一程序产生多个进程/线程的常见场景
二、并发和并行
2.1 定义
概念 | 并发(Concurrency) | 并行(Parallelism) |
---|---|---|
本质 | 多个任务交替执行,但同一时刻只运行一个 | 多个任务同时执行,每个任务由独立处理器处理 |
依赖条件 | 不需要多个 CPU,单核也可以实现 | 需要多个 CPU 核或处理器 |
类比 | 一个厨师轮流炒几个菜,快速切换 | 多个厨师同时炒多个菜 |
实现方式 | 分时操作系统 + 快速切换线程或进程 | 多核处理器 + 多个线程或进程并发执行 |
感官效果 | 看上去“同时运行”但本质是快速切换 | 真正的“同时运行” |
- 并发注重 任务管理,并行注重 资源调度
2.2 单道程序设计
- 系统一次只能运行一个程序/任务,其他程序必须等当前程序执行完后再运行。
- 如果该程序阻塞(如等待输入),CPU 就会空闲浪费。
- 效率极低,资源利用率低。
- 只存在于计算机发展的早期,已被淘汰。
2.3 多道程序设计
-
系统同时装入多个程序(多道程序),
-
让多个程序轮流使用 CPU、交替执行,从而提高 CPU 利用率。
-
利用了分时系统 + 中断机制,是现代操作系统的基础。
-
时钟中断:
- 是硬件定时器触发的中断,每隔一段时间通知操作系统中断当前程序。
- 由硬件实现,程序不能拒绝。
-
作用:
- 强制打断当前进程
- 触发操作系统进行 进程调度
- 保证每个进程有“公平”的运行机会
-
总结
- 多个程序在 内存中共存
- CPU 资源 轮流分配(分时复用)
- 使用 中断机制 实现自动切换任务
- 即使某个程序阻塞,CPU 也不会闲着,马上调度别的任务运行
三、MMU
- 英文全称:Memory Management Unit
- 中文名:内存管理单元
- 作用:位于 CPU 内部,负责管理内存访问。
- 实现 Linux 中的虚拟内存(如页式管理、段页式管理等)
- 保护操作系统内核与用户程序的内存空间不互相干扰
- 提高内存管理的灵活性(如动态加载、按需分配)
3.1 作用
-
地址转换
- 将 CPU 生成的虚拟地址(Virtual Address)转换为物理地址(Physical Address)
- 这是虚拟内存机制的核心功能
-
访问权限控制
- 不同进程或用户访问内存时,MMU 检查是否有权限
- 防止非法访问,增强系统安全性
-
支持多进程、多用户操作系统
- 每个进程有独立的虚拟地址空间
- MMU 实现地址空间隔离,提高系统稳定性和安全性
3.2 工作流程
-
CPU 产生虚拟地址
- 程序代码中使用的是虚拟地址(如指针、数组访问等)
-
MMU 进行地址映射
- 将虚拟地址映射为实际的物理地址
- 依据页表、段表等数据结构完成转换
-
访问主存
- MMU 将物理地址送到内存控制器,从主存中读写数据
-
数据送回 CPU
- CPU 最终拿到对应的数据,继续执行程序
四、PCB(进程控制块)
- 结构体名称:
struct task_struct
- 作用:操作系统用于描述和管理一个进程的全部信息。
- 查看结构体实际定义:
vim /usr/src/linux-headers-$(uname -r)/include/linux/sched.h
核心字段:
- 进程ID(pid):唯一标识进程
- 字段类型:
pid_t
- 作用:每个进程的唯一标识,是一个非负整数
- 字段类型:
- 进程状态:初始、就绪、运行、挂起(阻塞)、终止等
- CPU寄存器信息:进程切换时保存/恢复
- 保存进程切换时的 CPU 寄存器内容(比如 PC、SP、通用寄存器等
- 保证进程恢复运行时从上次中断的地方继续执行
- 虚拟地址空间:描述进程使用的内存布局
- 文件描述符表:管理进程打开的所有文件
- 用户ID / 组ID:权限控制
- 信号信息:处理异步事件(如中断)
- 当前工作目录:进程所在的目录
- umask掩码:新建文件默认权限控制
- 会话和进程组:用于终端控制与作业管理
- 资源上限:如最大文件数、内存限制等
五、进程状态
- 创建态(New):进程刚被创建,还未投入运行。
- 就绪态(Ready):进程已经准备好执行,但还未被调度到 CPU,等待CPU划分时间片。
- 运行态(Running):进程正在使用 CPU 执行。
- 阻塞/挂起态(Blocked):进程正在等待某个事件或资源,主动放弃CPU使用权,暂时不能运行。
- 终止态(Exit):进程执行完毕或被终止,进入清理阶段。