操作系统概述
一、核心主线
第一章可以抓住一句话:
操作系统是位于硬件之上、其他软件之下的系统软件,它负责管理计算机软硬件资源,并为用户和应用程序提供方便、安全、高效的服务。
也就是说,操作系统既是:
资源管理者:管理 CPU、内存、设备、文件等资源。
用户接口:提供命令行、图形界面、系统调用等使用方式。
虚拟机:把复杂硬件包装成更易用的逻辑资源,比如虚拟 CPU、虚拟内存、虚拟设备。
控制程序:通过中断、调度、保护机制控制程序运行。
二、操作系统的概念
1. 操作系统的地位
课件中强调:操作系统位于 硬件层 HAL 之上,位于 其他系统软件和应用软件之下。
可以理解成:
应用软件
系统软件 / 系统库
操作系统
硬件 / HAL应用程序通常不会直接操作硬件,而是通过 库函数 或 系统调用 请求操作系统完成底层工作。
例如:
printf("Hello");表面上是 C 语言函数,实际上最终要通过操作系统完成显示设备或终端输出。
2. 操作系统的作用
主要有两类:
第一,管理资源:
| 资源 | 操作系统做什么 |
|---|---|
| CPU | 调度多个程序运行 |
| 内存 | 分配、保护、共享、扩充 |
| 设备 | 分配设备、驱动设备、管理 I/O |
| 文件 | 组织文件系统,支持读写、目录、权限 |
第二,提供服务接口:
包括 API、GUI、命令行、作业控制语言 JCL 等。
3. 操作系统定义
课件中的定义可以背下来:
操作系统是位于硬件层之上、所有其他软件层之下的系统软件,通过它管理系统中各种软硬件资源,使它们被充分利用,并方便用户使用计算机系统。
考试中如果问“什么是操作系统”,答这个定义基本够用。
三、操作系统的发展历史
这一部分容易考“发展阶段”和“各阶段特点”。
1. 手工操作阶段
时间大约是 20 世纪 40 年代,无操作系统。
特点:
程序员手工操作机器;
使用纸带、卡片、开关、接线板;
CPU 经常等待人操作,效率极低;
资源被一个作业独占。
重点理解:机器越来越快后,人工操作时间反而成了主要瓶颈。
2. 批处理阶段
为了解决人工干预太多的问题,出现批处理。
分为:
联机批处理:作业从读卡机进入计算机,按批处理执行。优点是减少人工干预,缺点是 I/O 慢,主机等待时间长。
脱机批处理:使用卫星机完成输入输出转换,主机专心计算。优点是减少主机等待 I/O,缺点是需要人工搬磁带和额外设备。
3. 执行系统阶段
出现了 通道 和 中断 技术。
通道可以理解为专门负责 I/O 的处理机,它接受 CPU 委托执行 I/O 操作。这样 CPU 和 I/O 可以并行工作。
这一阶段出现了 SPOOLing 假脱机技术。
4. 多道批处理系统
这是操作系统走向成熟的重要标志。
核心思想:
内存中同时放入多个作业,当一个作业等待 I/O 时,CPU 可以去执行另一个作业。
优点:
提高 CPU 利用率;
提高系统吞吐量;
适合大型科学计算任务。
但它也带来了一系列新问题:
互斥、同步、通信、死锁、饥饿等。
这些正是后面几章重点内容。
5. 分时系统
分时系统面向交互式用户。
特点:
多用户通过终端连接主机;
系统轮流给每个用户分配 CPU 时间片;
用户感觉自己独占一台机器。
典型系统:CTSS、Multics、UNIX。
6. 实时系统
实时系统强调 及时响应 和 高可靠性。
应用场景:
工业控制、军事控制、医疗控制、航班订票、联机检索等。
重点:实时系统不是单纯追求“快”,而是要求 在规定时间内完成响应。
7. 通用操作系统
通用操作系统把批处理、分时、实时等功能结合起来。
常见模式:
前台分时 + 后台批处理;
前台实时 + 后台批处理。
四、操作系统的四大特性
这部分非常重要,常考简答题。
1. 并发性
多个程序在宏观上同时向前推进。
注意区分:
| 概念 | 含义 |
|---|---|
| 并发 | 宏观同时,微观交替 |
| 并行 | 真正同时,需要多个处理器或多个核心 |
单 CPU 上可以有并发,但不能真正并行执行多个程序。
2. 共享性
多个程序共同使用系统资源。
例如:
多个程序共享 CPU;
多个进程共享内存中的某些区域;
多个用户共享打印机;
多个进程共享文件。
共享必须由操作系统协调,否则会产生冲突。
3. 异步性
程序推进速度不可预知。
原因是:
多个程序交替运行;
中断随机发生;
调度时机不确定。
所以程序执行顺序并不完全由程序员控制,而受中断、调度、资源状态影响。
4. 虚拟性
通过某种技术把一个物理实体变成多个逻辑实体。
例子:
| 物理实体 | 虚拟效果 |
|---|---|
| 一个 CPU | 多个虚拟 CPU |
| 内存 + 外存 | 更大的虚拟存储空间 |
| 独占设备 | 可共享的虚拟设备 |
这一点非常重要,后面虚拟存储、虚拟设备都会继续展开。
五、操作系统的主要类型
1. 多道批处理系统
关键词:多道、成批、吞吐量、资源利用率。
适合非交互、大批量计算任务。
重点概念:SPOOLing。
SPOOLing 又叫假脱机技术或排队转储技术,由输入井、输出井和常驻 I/O 进程组成。它可以把独占设备改造成共享设备,实现虚拟设备功能。
2. 分时操作系统
关键词:多路性、交互性、独占性。
多路性:一个主机连接多个终端。
交互性:用户可以和系统对话。
独占性:每个用户感觉自己独占一台虚拟机。
3. 实时操作系统
关键词:响应及时、可靠性高。
实时控制系统中,课件用 t2 - t1 表示响应时间。
4. 网络操作系统
网络操作系统用于实现网络通信和网络资源管理。
目标:
相互通信;
资源共享;
提供网络服务,如数据库服务、FTP、邮件、Telnet 等。
注意:网络操作系统通常没有完全透明的统一视图。
5. 分布式操作系统
分布式操作系统强调多个计算机在统一操作系统管理下协同工作。
特点:
统一操作系统;
资源进一步共享;
可靠性高;
透明性强。
目标:
资源共享、负载均衡、计算加速。
常见技术:作业迁移、进程迁移。
6. 多处理机操作系统
面向具有公共内存的多 CPU 系统。
重点概念:
SMP,对称多处理机系统;
多个 CPU 没有主从关系;
进程和 CPU 是多对多关系。
新问题:
调度问题;
并发控制问题。
7. 嵌入式操作系统
应用于掌上设备、车载系统、通信设备、信息家电等。
特点:
微内核结构;
核心小;
可裁剪性好;
可移植性好;
可扩展性好;
可靠性高,但效率可能较低。
六、操作系统运行环境
这一节讲“操作系统为什么能控制程序”。
1. 定时装置
分为:
绝对时钟:记录实际时间,一般不发中断。
间隔时钟:定期发中断,是实现多道程序的重要基础。
考试重点:
间隔时钟保证操作系统能定期获得 CPU 控制权。
如果没有时钟中断,一个死循环程序可能一直占用 CPU。
2. 堆和栈
每个运行程序通常有:
一个堆;
一个用户栈;
一个系统栈。
| 结构 | 作用 |
|---|---|
| 堆 | 保存动态变量,如动态分配的对象 |
| 用户栈 | 保存用户函数调用信息、参数、局部变量 |
| 系统栈 / 核心栈 | 保存中断现场、内核调用信息 |
注意:
用户栈属于用户空间;
系统栈属于操作系统空间;
进程切换时,系统栈也要切换。
3. 寄存器
程序切换时,需要保存和恢复寄存器内容。
重要寄存器包括:
PSW 程序状态字;
PC 指令计数器;
SP 栈指针;
通用寄存器;
浮点寄存器;
地址映射寄存器。
4. 特权指令与非特权指令
特权指令:只能在系统态执行,会影响系统状态。
例如:开关中断、设置 PSW、停机、I/O 指令等。
非特权指令:用户态和系统态都可以执行。
例如:取数、四则运算等。
5. 处理机状态
有两种基本状态:
| 状态 | 又称 | 运行什么 |
|---|---|---|
| 系统态 | 管态、核态 | 操作系统内核 |
| 用户态 | 目态、常态 | 普通应用程序 |
状态转换:
系统态 → 用户态:通过设置 PSW 等特权指令。
用户态 → 系统态:通过中断、trap、系统调用。
6. 地址映射与存储保护
地址映射:
逻辑地址 → 物理地址逻辑地址是程序中产生的地址;
物理地址是真实内存地址。
存储保护用于防止:
应用程序侵犯操作系统空间;
应用程序侵犯其他用户空间;
非法访问共享区域。
主要检查:
越界检查;
越权检查。
7. 中断装置
中断是操作系统获得控制权的关键机制。
发生中断时,大致过程是:
保存当前 PSW 和 PC;
根据中断向量找到处理程序入口;
转入操作系统执行中断处理程序。
8. 通道与 DMA
二者都能实现 I/O 设备和内存之间的数据直传。
区别:
| 项目 | 通道 | DMA |
|---|---|---|
| 是否有独立指令系统 | 有 | 没有 |
| 控制能力 | 强 | 较弱 |
| 控制设备数量 | 可控制多台不同设备 | 通常控制一台或少数同类设备 |
| 是否可编程 | 可编程 | 不可编程或能力有限 |
七、操作系统的界面形式
1. 命令行接口
例如 UNIX shell:
rm -i *.c其中:
rm 是命令名; -i 是选项; *.c 是参数。
Shell 的优点:
缩小操作系统核心;
不同用户可以选择不同界面;
Shell 本身通常是用户态进程。
2. GUI 图形用户界面
由窗口、图标、菜单、按钮、鼠标等组成。
本质上仍然是交互式接口,只是从命令输入变成图形操作。
3. 作业控制语言 JCL
主要用于批处理系统。
用户通过 JCL 告诉操作系统:
需要什么资源;
如何控制作业执行;
作业如何输入输出。
4. 系统调用 OS API
系统调用是应用程序请求操作系统内核服务的方式。
常见系统调用类型:
文件相关;
进程相关;
进程通信相关;
资源管理相关。
系统调用过程可以概括为:
用户程序执行系统调用;
通过陷入指令进入内核;
保存现场;
查系统调用入口表;
执行对应内核服务;
返回用户程序。
八、操作系统运行机理
课件中用“程序 1、程序 2、中断、程序切换”说明 OS 的运行机制。
核心过程:
程序正常运行;
发生中断;
CPU 转入操作系统;
操作系统保存当前程序现场;
选择另一个程序运行;
恢复新程序现场;
返回用户态继续执行。
这就是进程切换、调度、中断机制的基础。
九、研究操作系统的三种观点
1. 进程观点
把操作系统看成:
若干可以独立运行的程序;
一个协调这些程序的核心。
重点问题:
互斥;
同步;
通信;
死锁;
饥饿。
2. 资源管理观点
操作系统是资源管理者。
它要做三件事:
描述资源状态;
决定资源分配策略;
提供申请和释放资源的机制。
3. 虚拟机观点
操作系统把硬件包装成更容易使用的虚拟机器。
例如:
单个 CPU → 多个虚拟 CPU;
内存 + 外存 → 虚拟存储;
独占设备 → 虚拟设备。
十、操作系统的基本功能
课件最后归纳了四大功能:
| 功能 | 内容 |
|---|---|
| 存储管理 | 分配、共享、保护、扩充、地址映射 |
| 处理器管理 | 进程控制、同步互斥、通信、调度 |
| 文件管理 | 文件访问、组织、目录、读写、权限 |
| 设备管理 | 设备分配、缓冲、驱动、独立性、虚拟设备、调度 |
这张表很适合背诵,后续章节基本就是围绕这几类功能展开。
十一、重点易考知识点
- 操作系统定义、地位和作用
会答“OS 是什么”“为什么需要 OS”。 - 并发、共享、异步、虚拟四大特性
尤其要区分并发和并行。 - 多道批处理、分时、实时系统的区别
这是常见简答题和选择题。 - SPOOLing 技术
要会解释输入井、输出井、虚拟设备、缓冲作用。 - 系统态和用户态
要知道为什么要区分,以及如何转换。 - 特权指令和非特权指令
要能举例说明。 - 中断机制
中断是 OS 获得控制权、实现调度和系统调用的重要基础。 - 系统调用过程
用户程序不能直接操作内核资源,必须通过系统调用进入内核。 - 通道和 DMA 的区别
通道功能更强,有指令系统;DMA 更简单。 - OS 的四大管理功能
存储管理、处理器管理、文件管理、设备管理。
十二、用课件中的 Hello 程序理解整章
课件最后用 Hello 程序提问,非常适合串联整章:
main()
{
char *H = "Hello";
printf("%s", H);
while(TRUE)
{
int i = 100;
}
}可以这样理解:
Hello.exe 如何存放?
由文件系统负责,涉及文件管理。
Hello.exe 如何启动?
由操作系统装入程序、创建进程、分配资源。
如何分配内存?
由存储管理负责,涉及地址映射、内存分配、保护。
printf 如何输出字符串?
通过库函数进一步调用系统调用,由设备管理和 I/O 系统完成输出。
while 死循环会不会独占 CPU?
正常不会。因为间隔时钟会周期性中断,操作系统重新获得控制权并进行调度。
程序结束如何退出系统?
通过系统调用通知操作系统回收资源、关闭文件、释放内存。
这道题本质上考的是:一个应用程序从存储、装入、运行、输出、调度到退出,全程都离不开操作系统。
十三、备考建议
可以按下面顺序复习:
第一遍:背操作系统定义、作用、四大特性。
第二遍:整理各类操作系统的区别,尤其是批处理、分时、实时。
第三遍:理解运行环境,包括中断、用户态/系统态、特权指令、系统调用。
第四遍:用 Hello 程序把文件管理、内存管理、处理器管理、设备管理串起来。
总结:
第一章是操作系统全书的地图。后面章节只是把 CPU、内存、文件、设备、进程这些模块展开讲。
进程、线程与作业
下面我按“考试复习笔记 + 讲解”的方式总结这份《第二章 进程、线程与作业》。本章主线是:多道程序设计为什么需要进程 → 进程如何管理 → 为什么又引入线程 → 作业、进程、线程三者关系。
总体框架
这一章主要讲四部分:
| 部分 | 核心问题 |
|---|---|
| 2.1 多道程序设计 | 为什么一个系统要同时放多个程序运行? |
| 2.2 进程的引入 | 操作系统如何描述、管理、切换正在运行的程序? |
| 2.3 线程与轻进程 | 为什么进程还不够轻便?线程解决了什么问题? |
| 2.4 作业 | 用户提交的任务如何被系统组织和执行? |
你可以把它们理解成三个层次:
作业:用户要求计算机完成的一整套任务
↓
进程:作业进入内存后,程序的一次执行活动
↓
线程:进程内部更小的执行单位2.1 多道程序设计
1. 单道程序设计的缺点
单道程序设计指系统中一次只允许一个程序运行。
它最大的问题是:
资源利用率低。
因为程序运行时并不是一直使用 CPU。很多时候程序在等待磁盘、打印机、磁带等 I/O 设备。
例如:
程序A:
CPU计算 → 等待设备1 → CPU计算 → 等待设备2 → CPU计算当程序 A 等待 I/O 时,CPU 可能空闲;当 CPU 工作时,设备可能空闲。
所以单道程序设计会造成:
CPU等设备,设备等CPU,大家都不能充分利用。2. 多道程序设计的提出
多道程序设计是指:
多个程序同时进入系统,并发地投入执行。
注意这里的“同时”不一定是真正同时。单 CPU 下通常是:
程序A运行一会儿 → 程序B运行一会儿 → 程序A继续运行 → 程序C运行……这叫并发执行。
多道程序设计能提高:
| 资源 | 效果 |
|---|---|
| CPU | 程序 A 等 I/O 时,让程序 B 使用 CPU |
| I/O 设备 | CPU 执行程序 B 时,设备可以为程序 A 工作 |
| 内存 | 同时保存多个程序,提高系统吞吐量 |
本章中给出的例子说明:
单道方式下 CPU 利用率为 50%,多道方式下 CPU 利用率可提高到 89%。
计算公式是:
CPU利用率 = CPU实际占用时间 / 程序总运行时间考试里常考这种题:给出多个程序的 CPU、I/O 时间段,让你画时序图并计算 CPU 利用率。
3. 多道程序设计的问题
多道程序设计虽然提高效率,但也带来管理问题。
主要有三类:
| 问题 | 具体内容 |
|---|---|
| 处理器管理 | 程序数量多于 CPU 数量,CPU 分给谁? |
| 存储管理 | 多个程序如何共享内存?地址空间如何隔离? |
| 设备管理 | 多个程序同时请求同一设备,如何分配? |
所以,多道程序设计引出了一个重要概念:
操作系统必须有一种机制来描述和管理正在执行的程序,这就是进程。
2.2 进程的引入
1. 为什么需要进程?
在多道程序系统中,程序不是从头到尾连续执行的,而是:
推进 → 暂停 → 推进 → 暂停 → ……暂停的原因可能是:
- 自己主动等待资源,比如等待 I/O;
- 被操作系统剥夺 CPU,让其他程序运行。
因此,操作系统必须能做到:
暂停时:保存现场
继续时:恢复现场所谓“现场”,主要包括:
| 内容 | 含义 |
|---|---|
| PC | 程序计数器,记录下一条要执行的指令 |
| PSW | 程序状态字 |
| 寄存器 | 保存当前运算状态 |
| 栈指针 SP | 指向当前栈位置 |
为了保存和管理这些信息,操作系统引入了进程。
2. 进程的概念
本章给出多个定义,本质上都指向一句话:
进程是程序的一次执行过程。
也可以说:
进程是具有一定独立功能的程序,关于某个数据集合的一次运行活动。
考试中最重要的是抓住两个关键词:
| 关键词 | 含义 |
|---|---|
| 动态性 | 进程是正在执行的程序 |
| 并发性 | 进程可以和其他进程交替执行 |
所以:
程序 = 静态的代码
进程 = 程序运行起来之后的动态活动比如:
QQ.exe 是程序
打开一个 QQ 后产生的运行实例是进程
同时打开两个 QQ,可能对应两个进程3. 进程的三种基本状态
进程有三种基本状态:
| 状态 | 英文 | 含义 |
|---|---|---|
| 运行态 | Running | 正在占用 CPU 执行 |
| 就绪态 | Ready | 已经具备运行条件,但还没获得 CPU |
| 等待态 | Waiting / Blocked | 等待某个事件发生,暂时不能运行 |
状态转换关系非常重要:
就绪态 --获得CPU--> 运行态
运行态 --时间片用完/被剥夺CPU--> 就绪态
运行态 --等待I/O或资源--> 等待态
等待态 --事件发生--> 就绪态注意:
等待态不能直接变成运行态。
它必须先变成就绪态,再等待调度。
考试常考判断题:
某进程等待的事件发生后,它一定立即运行吗?
答案:不一定。
事件发生后,它只是从等待态进入就绪态,是否运行还要看 CPU 调度。
4. 进程控制块 PCB
PCB 是本章最重要概念之一。
PCB,Process Control Block,进程控制块。
定义:
PCB 是标志进程存在的数据结构,其中保存操作系统管理进程所需的全部信息。
可以记成一句话:
PCB 是进程在操作系统中的“身份证 + 档案袋”。PCB 中通常包括:
| 内容 | 作用 |
|---|---|
| 进程标识 pid | 唯一标识进程 |
| 进程状态 | 运行、就绪、等待等 |
| 现场信息 | PC、PSW、寄存器等 |
| 调度参数 | 优先级、时间片等 |
| 用户标识 uid | 属于哪个用户 |
| 地址信息 | 程序和数据在内存中的位置 |
| 打开文件 | 进程正在使用的文件 |
| 队列指针 | 挂入就绪队列或等待队列 |
重点结论:
系统创建进程时创建 PCB,撤销进程时撤销 PCB。
所以也可以说:
PCB 是进程存在的唯一标志。5. 进程的组成
一个进程通常由三部分组成:
进程 = PCB + 程序代码 + 数据/堆栈具体来说:
| 部分 | 内容 |
|---|---|
| PCB | 操作系统管理进程所需的信息 |
| 程序代码 | 实现功能的指令 |
| 数据 | 静态数据、堆、栈 |
其中:
| 区域 | 作用 |
|---|---|
| 栈 stack | 保存函数参数、返回地址、局部变量等 |
| 堆 heap | 保存动态分配的变量 |
本章还提到:
进程的程序代码和数据称为进程影像 Process Image。
6. 进程上下文与上下文切换
进程上下文可以理解为:
让一个进程能够继续运行所需的全部环境。
包括:
PCB + 程序代码 + 数据 + 地址空间 + 系统栈 + 打开文件表等上下文切换是指:
CPU 从一个进程切换到另一个进程时,保存当前进程现场,恢复另一个进程现场。
上下文切换是有成本的。
这个成本叫:
系统开销 system overhead
所以多道程序并不是越多越好。
程序太少,资源利用率低;程序太多,上下文切换和管理开销增加,响应速度下降。
7. 进程队列
操作系统通常用 PCB 组成各种队列。
主要有三类:
| 队列 | 含义 |
|---|---|
| 就绪队列 | 所有等待 CPU 的进程 |
| 等待队列 | 等待某个事件或资源的进程 |
| 运行队列 | 每个处理器上正在运行的进程 |
一个很重要的模型是:
创建 → 就绪队列 → CPU运行 → 完成
↓
等待事件
↓
等待队列
↓
事件发生
↓
回到就绪队列这个图是考试高频内容。
8. 进程的类型与特征
进程分为:
| 类型 | 含义 |
|---|---|
| 系统进程 | 执行操作系统程序,完成系统管理功能 |
| 用户进程 | 执行用户程序,为用户服务 |
进程的特征有六个:
| 特征 | 含义 |
|---|---|
| 并发性 | 可以与其他进程一起推进 |
| 动态性 | 有创建、运行、等待、结束等变化 |
| 独立性 | 是可以被调度的基本单位 |
| 交互性 | 进程之间可能相互影响 |
| 异步性 | 各进程以不可预知的速度推进 |
| 结构性 | 每个进程都有 PCB |
这里容易考选择题或简答题。
9. 进程间关系与相互作用
进程之间有两种关系:
| 类型 | 含义 |
|---|---|
| 相关进程 | 有逻辑关系,如父子进程、合作进程 |
| 无关进程 | 没有逻辑关系,但可能竞争资源 |
进程间相互作用分为:
| 类型 | 含义 |
|---|---|
| 直接相互作用 | 相关进程之间直接通信、同步 |
| 间接相互作用 | 通过资源竞争产生影响 |
典型问题有:
互斥、同步、死锁、饥饿这些内容通常会在后续章节继续展开。
10. 进程的创建与撤销
进程创建过程
一般包括:
- 申请一个空闲 PCB;
- 分配唯一进程标识 pid;
- 为新进程分配资源;
- 初始化 PCB;
- 加载程序;
- 将 PCB 插入就绪队列。
引起进程创建的事件包括:
| 事件 | 例子 |
|---|---|
| 用户登录 | 登录系统后创建用户进程 |
| 作业调度 | 批处理作业被调入内存 |
| 提供服务 | 系统创建服务进程 |
| 应用请求 | 程序主动创建子进程 |
进程撤销过程
一般包括:
- 找到被撤销进程的 PCB;
- 如果正在运行,立即停止;
- 设置重新调度标志;
- 撤销其子孙进程;
- 回收资源;
- 回收 PCB。
引起进程撤销的事件:
| 类型 | 含义 |
|---|---|
| 正常结束 | 程序执行完毕 |
| 异常结束 | 越界、非法指令等错误 |
| 外界干预 | 被用户或父进程 kill |
11. 进程等待与唤醒
进程等待
当运行进程不能继续执行时,会进入等待态。
过程是:
停止当前进程执行
保存现场到 PCB
状态改为等待态
进入等待队列引起等待的原因包括:
| 原因 | 例子 |
|---|---|
| 请求系统服务 | 资源暂时无法满足 |
| 启动 I/O 操作 | 等待读写完成 |
| 新数据尚未到达 | 生产者-消费者问题 |
| 无新工作可做 | 系统服务进程等待任务 |
进程唤醒
等待事件发生后,操作系统会唤醒进程。
过程是:
从等待队列移出
状态改为就绪态
插入就绪队列注意:
唤醒 ≠ 立即运行唤醒只是进入就绪态。
12. 父进程创建子进程 vs 主程序调用子程序
这是一个很容易考的比较题。
| 比较 | 父进程创建子进程 | 主程序调用子程序 |
|---|---|---|
| 执行关系 | 父子进程可并发执行 | 主程序暂停,子程序执行 |
| 是否独立 | 子进程是独立进程 | 子程序不是独立进程 |
| 是否有 PCB | 子进程有自己的 PCB | 子程序没有 PCB |
| 返回关系 | 父子进程可独立结束 | 子程序返回后主程序继续 |
一句话:
创建子进程是并发关系,调用子程序是顺序关系。13. UNIX 进程相关系统调用
本章重点讲了几个 UNIX 系统调用:
| 系统调用 | 作用 |
|---|---|
| fork() | 创建子进程 |
| execl() | 装入并执行新程序 |
| exit() | 进程自我终止 |
| wait() | 父进程等待子进程结束 |
| kill | 外部终止进程 |
fork()
pid = fork();返回值很重要:
| 返回位置 | 返回值 |
|---|---|
| 父进程 | 子进程的 pid,正整数 |
| 子进程 | 0 |
| 出错 | -1 |
典型代码:
pid = fork();
if (pid == 0) {
// 子进程执行
} else {
// 父进程执行
}execl()
execl("P", 0);作用是:
用新程序 P 覆盖原来的程序,从 P 的第一条指令开始执行。wait()
父进程等待子进程结束:
pid = wait(&status);exit()
子进程自我终止:
exit(status);14. fork 的问题与 vfork
fork 的功能:
复制地址空间 code + data + stack
复制控制结构 proc + user问题是:
- 父子进程数据各自独立,不方便共享;
- 如果子进程马上 exec 新程序,那么刚刚复制的地址空间马上被覆盖,浪费时间和空间。
所以引入了 vfork:
| 比较 | fork | vfork |
|---|---|---|
| 是否复制地址空间 | 复制 | 不复制 |
| 父子进程地址空间 | 独立 | 共享 |
| 适合场景 | 创建相似子进程 | 子进程马上 exec |
15. 进程与程序的联系和区别
这是考试必背内容。
| 比较 | 程序 | 进程 |
|---|---|---|
| 本质 | 静态代码 | 程序的一次执行 |
| 状态 | 静态 | 动态 |
| 生命周期 | 可长期保存 | 有创建和终止 |
| 并发性 | 本身不能并发 | 可以并发执行 |
| 组成 | 代码和数据 | PCB + 代码 + 数据 + 堆栈 |
| 对应关系 | 一个程序可对应多个进程 | 一个进程通常执行一个程序 |
一句话记忆:
程序是菜谱,进程是按菜谱做菜的过程。2.3 线程与轻进程
1. 为什么引入线程?
进程虽然解决了多道程序管理问题,但进程切换开销大。
因为进程上下文包括:
PCB + 地址空间 + 系统栈 + 打开文件表 + 程序代码 + 数据切换一个进程,需要保存和恢复大量信息。
而且相关进程之间共享数据不方便,因为它们通常拥有独立地址空间。
所以引入线程。
2. 线程的概念
线程是:
进程中一个相对独立的执行流。
核心区别:
进程是资源分配单位
线程是执行单位也就是说:
| 概念 | 作用 |
|---|---|
| 进程 | 拥有资源,如地址空间、文件、数据区 |
| 线程 | 使用 CPU 执行指令 |
一个进程至少有一个线程,也可以有多个线程。
3. 多线程的优点
多线程的优点包括:
| 优点 | 原因 |
|---|---|
| 切换速度快 | 同一进程内线程共享地址空间 |
| 系统开销小 | 不需要切换整个进程环境 |
| 通信方便 | 线程共享进程的数据空间 |
| 并发性好 | 一个线程等待,其他线程可以继续执行 |
| 适合多处理器 | 多线程可真正并行运行 |
比如 Word 可以有多个线程:
线程1:编辑输入
线程2:拼写检查
线程3:自动保存在线视频播放器也可以有多个线程:
线程1:视频解码
线程2:音频解码
线程3:网络接收
线程4:界面控制4. 线程结构
多线程进程中,线程共享:
代码段
数据段
堆
打开文件
地址空间每个线程独有:
线程 ID
寄存器
PC
栈
线程状态可以记成:
同一进程的线程:共享资源,各自执行。5. 线程控制块 TCB
TCB 是 Thread Control Block,线程控制块。
它类似于 PCB,但更轻量。
TCB 通常包括:
| 内容 | 作用 |
|---|---|
| 线程标识 | 标识线程 |
| 线程状态 | 运行、就绪、等待等 |
| 调度参数 | 优先级等 |
| 现场信息 | 寄存器、PC、SP |
| 链接指针 | 加入线程队列 |
存放位置取决于线程类型:
| 线程类型 | TCB 位置 |
|---|---|
| 用户级线程 | 用户空间 |
| 核心级线程 | 系统空间 |
6. 用户级线程
用户级线程的特点:
线程管理由用户态线程库完成,操作系统不知道这些线程的存在。
优点:
| 优点 | 说明 |
|---|---|
| 不依赖操作系统 | 可以由语言库实现 |
| 切换快 | 不需要进入内核 |
| 调度灵活 | 应用程序可以自定义调度 |
缺点:
| 缺点 | 说明 |
|---|---|
| 不能真正并行 | 操作系统只看到一个进程 |
| 一个线程阻塞,整个进程可能阻塞 | 因为内核不知道进程内部还有其他线程 |
重点:
用户级线程:OS 不可见,切换快,但并行能力差。7. 核心级线程
核心级线程的特点:
线程由操作系统内核创建、撤销和调度,操作系统知道线程的存在。
优点:
| 优点 | 说明 |
|---|---|
| 可以真正并行 | 多 CPU 上多个线程可同时运行 |
| 一个线程阻塞,不影响同进程其他线程 | 内核可以调度其他线程 |
缺点:
| 缺点 | 说明 |
|---|---|
| 开销大 | 创建、切换要进入内核 |
| 灵活性较低 | 调度由操作系统控制 |
重点:
核心级线程:OS 可见,可以真正并行,但系统开销大。8. 用户级线程 vs 核心级线程
这是考试高频比较题。
| 比较项 | 用户级线程 | 核心级线程 |
|---|---|---|
| OS 是否可见 | 不可见 | 可见 |
| 管理由谁完成 | 用户线程库 | 操作系统内核 |
| 创建/撤销/调度 | 不需要内核支持 | 需要内核支持 |
| 切换速度 | 快 | 较慢 |
| 能否多 CPU 并行 | 通常不能 | 可以 |
| 一个线程阻塞影响 | 可能阻塞整个进程 | 只阻塞该线程 |
| 调度单位 | 进程 | 线程 |
| TCB 位置 | 用户空间 | 系统空间 |
9. 混合线程与轻进程 LWP
混合线程试图结合两者优点。
以 Solaris 为例,有三层:
用户级线程
↓
轻量级进程 LWP
↓
核心级线程
↓
CPU本章强调:
| 概念 | 说明 |
|---|---|
| 用户级线程 | 由库支持 |
| LWP | 轻量级进程,对操作系统可见 |
| 核心级线程 | 由内核支持 |
| CPU | 最终执行核心级线程 |
多个用户级线程可以通过 LWP 映射到核心级线程。
10. 线程和进程的比较
这也是必背内容。
| 比较 | 进程 | 线程 |
|---|---|---|
| 基本角色 | 资源分配单位 | CPU 调度和执行单位 |
| 地址空间 | 进程之间通常独立 | 同进程线程共享 |
| 通信 | 较复杂,需要 IPC | 较方便,共享数据 |
| 切换开销 | 大 | 小 |
| 独立性 | 强 | 弱 |
| 安全性 | 较高 | 较低,线程间容易相互影响 |
| 崩溃影响 | 一个进程崩溃通常不影响其他进程 | 一个线程出错可能影响整个进程 |
一句话:
进程更安全但更重,线程更高效但更容易相互影响。11. 多任务与多线程的区别
| 概念 | 针对对象 | 含义 |
|---|---|---|
| 多任务 | 操作系统 | 系统能同时执行多个程序 |
| 多线程 | 一个进程 | 一个进程内部有多个执行流 |
例如:
一边开浏览器,一边开音乐播放器:多任务
浏览器内部一个线程加载网页,一个线程渲染页面:多线程2.4 作业
1. 作业的概念
作业是:
用户要求计算机系统为其完成的计算任务集合。
作业比进程更偏向“用户任务”的概念。
一个作业可以包含多个作业步。
2. 作业步
作业步是:
作业处理过程中一个相对独立的步骤。
通常:
一个作业步可由一个进程完成
某些作业步之间可以并行例如一个编程作业可能包含:
编辑源程序 → 编译 → 链接 → 执行 → 输出结果其中每一步都可以看作一个作业步。
3. 作业分类
作业分为两类:
| 类型 | 特点 |
|---|---|
| 批处理作业 | 用户提交后由系统自动处理 |
| 交互式作业 | 用户通过终端与系统交互 |
4. 作业控制块 JCB
JCB 是 Job Control Block,作业控制块。
它类似于 PCB,但管理对象是作业。
JCB 中通常包括:
| 内容 |
|---|
| 作业名称 |
| 作业状态 |
| 调度参数 |
| 资源请求 |
| 相关进程 |
| 作业长度 |
| 输入井、输出井位置 |
| 记账信息 |
可以这样记:
PCB 管进程,TCB 管线程,JCB 管作业。5. 批处理作业
批处理作业常用 JCL,即作业控制语言。
JCL 用来描述作业执行步骤。
例如:
$JOB J1
$FORTN …
$LINK …
$EXEC …
$ENDJOB批处理作业的大致过程:
作业进入输入井
↓
作业调度选中作业进入内存
↓
创建作业控制进程
↓
解释作业说明书
↓
为每个作业步创建相应进程
↓
输出结果
↓
作业结束6. 交互式作业
交互式作业强调用户登录、输入命令、系统响应。
以 UNIX shell 为例:
显示提示符 $
读取用户命令
分析命令
如果是内部命令,直接处理
如果是外部命令,创建子进程执行
如果是后台命令,输出子进程号后继续
如果是 logout,注销并记账这里和前面的 fork、exec、wait 联系很紧密:
shell 读入命令
fork 创建子进程
子进程 exec 执行程序
父进程 wait 等待子进程结束本章最重要的几组对比
1. 程序、进程、线程、作业
| 概念 | 含义 | 重点 |
|---|---|---|
| 程序 | 静态代码 | 存在于磁盘或内存中 |
| 进程 | 程序的一次执行 | 资源分配单位 |
| 线程 | 进程中的执行流 | CPU 执行单位 |
| 作业 | 用户提交的任务集合 | 可包含多个进程 |
2. PCB、TCB、JCB
| 控制块 | 管理对象 | 作用 |
|---|---|---|
| PCB | 进程 | 标志进程存在 |
| TCB | 线程 | 标志线程存在 |
| JCB | 作业 | 标志作业存在 |
3. 就绪态、运行态、等待态
| 状态 | 是否有 CPU | 是否具备运行条件 |
|---|---|---|
| 运行态 | 有 | 是 |
| 就绪态 | 没有 | 是 |
| 等待态 | 没有 | 否,正在等事件 |
考试高频知识点
- 进程的定义:进程是程序的一次执行。
- 进程和程序的区别:程序静态,进程动态;程序可长期保存,进程有生命周期。
- 三态模型:运行、就绪、等待,以及转换原因。
- PCB 的作用:PCB 是进程存在的唯一标志。
- 进程组成:PCB + 程序 + 数据/堆栈。
- 上下文切换:保存当前进程现场,恢复另一个进程现场,会产生系统开销。
- 进程创建与撤销过程。
- fork、exec、wait、exit 的作用和返回值。
- 线程和进程区别:进程是资源分配单位,线程是执行单位。
- 用户级线程和核心级线程区别。
- 作业、进程、线程关系。
简答题模板
题目:简述进程和程序的区别。
程序是静态的,是一组指令和数据的集合;进程是动态的,是程序关于某个数据集合的一次执行活动。程序可以长期保存,而进程有生命周期,会被创建、运行、等待和撤销。一个程序可以对应多个进程,而一个进程在某一时刻通常执行一个程序。进程还具有 PCB,是操作系统进行资源分配和调度的基本对象。
题目:简述 PCB 的作用。
PCB 是进程控制块,是标志进程存在的数据结构。操作系统通过 PCB 保存和管理进程的全部信息,包括进程标识、状态、现场信息、调度参数、地址信息、打开文件和队列指针等。进程创建时建立 PCB,进程撤销时回收 PCB。因此 PCB 是操作系统感知和管理进程的依据。
题目:为什么要引入线程?
进程切换需要保存和恢复大量上下文信息,如地址空间、系统栈、打开文件表等,系统开销较大;同时进程之间地址空间相互独立,通信不够方便。线程是进程内部相对独立的执行流,同一进程内的线程共享代码段、数据段和地址空间,只需保存少量现场信息,因此切换速度快、通信方便、系统开销小,还能提高并发性和资源利用率。
题目:用户级线程和核心级线程有什么区别?
用户级线程由用户态线程库管理,操作系统不可见,创建、撤销和切换不需要进入内核,因此速度快、调度灵活,但不能充分利用多处理器,并且一个线程阻塞可能导致整个进程阻塞。核心级线程由操作系统内核管理,操作系统可见,线程是 CPU 调度单位,可以在多处理器上真正并行,一个线程阻塞不影响同进程其他线程,但创建和切换需要进入内核,系统开销较大。
复习主线
单道程序资源利用率低
↓
引入多道程序设计,提高 CPU 和设备利用率
↓
多道程序需要管理正在执行的程序
↓
引入进程
↓
进程需要 PCB、状态、队列、上下文切换
↓
进程切换开销大,进程间通信不方便
↓
引入线程
↓
线程轻量、切换快、共享进程资源
↓
用户提交的整体任务称为作业
↓
作业进入内存后通常对应一个或多个进程本章概括:
作业是用户任务,进程是资源分配和管理单位,线程是 CPU 执行单位;多道程序设计通过进程和线程机制实现并发,提高系统资源利用率。