操作系统概述

一、核心主线

第一章可以抓住一句话:

操作系统是位于硬件之上、其他软件之下的系统软件,它负责管理计算机软硬件资源,并为用户和应用程序提供方便、安全、高效的服务。

也就是说,操作系统既是:

资源管理者:管理 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;
内存 + 外存 → 虚拟存储;
独占设备 → 虚拟设备。


十、操作系统的基本功能

课件最后归纳了四大功能:

功能内容
存储管理分配、共享、保护、扩充、地址映射
处理器管理进程控制、同步互斥、通信、调度
文件管理文件访问、组织、目录、读写、权限
设备管理设备分配、缓冲、驱动、独立性、虚拟设备、调度

这张表很适合背诵,后续章节基本就是围绕这几类功能展开。


十一、重点易考知识点

  1. 操作系统定义、地位和作用
    会答“OS 是什么”“为什么需要 OS”。
  2. 并发、共享、异步、虚拟四大特性
    尤其要区分并发和并行。
  3. 多道批处理、分时、实时系统的区别
    这是常见简答题和选择题。
  4. SPOOLing 技术
    要会解释输入井、输出井、虚拟设备、缓冲作用。
  5. 系统态和用户态
    要知道为什么要区分,以及如何转换。
  6. 特权指令和非特权指令
    要能举例说明。
  7. 中断机制
    中断是 OS 获得控制权、实现调度和系统调用的重要基础。
  8. 系统调用过程
    用户程序不能直接操作内核资源,必须通过系统调用进入内核。
  9. 通道和 DMA 的区别
    通道功能更强,有指令系统;DMA 更简单。
  10. 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. 为什么需要进程?

在多道程序系统中,程序不是从头到尾连续执行的,而是:

推进 → 暂停 → 推进 → 暂停 → ……

暂停的原因可能是:

  1. 自己主动等待资源,比如等待 I/O;
  2. 被操作系统剥夺 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. 进程的创建与撤销

进程创建过程

一般包括:

  1. 申请一个空闲 PCB;
  2. 分配唯一进程标识 pid;
  3. 为新进程分配资源;
  4. 初始化 PCB;
  5. 加载程序;
  6. 将 PCB 插入就绪队列。

引起进程创建的事件包括:

事件例子
用户登录登录系统后创建用户进程
作业调度批处理作业被调入内存
提供服务系统创建服务进程
应用请求程序主动创建子进程

进程撤销过程

一般包括:

  1. 找到被撤销进程的 PCB;
  2. 如果正在运行,立即停止;
  3. 设置重新调度标志;
  4. 撤销其子孙进程;
  5. 回收资源;
  6. 回收 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

问题是:

  1. 父子进程数据各自独立,不方便共享;
  2. 如果子进程马上 exec 新程序,那么刚刚复制的地址空间马上被覆盖,浪费时间和空间。

所以引入了 vfork:

比较forkvfork
是否复制地址空间复制不复制
父子进程地址空间独立共享
适合场景创建相似子进程子进程马上 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是否具备运行条件
运行态
就绪态没有
等待态没有否,正在等事件

考试高频知识点

  1. 进程的定义:进程是程序的一次执行。
  2. 进程和程序的区别:程序静态,进程动态;程序可长期保存,进程有生命周期。
  3. 三态模型:运行、就绪、等待,以及转换原因。
  4. PCB 的作用:PCB 是进程存在的唯一标志。
  5. 进程组成:PCB + 程序 + 数据/堆栈。
  6. 上下文切换:保存当前进程现场,恢复另一个进程现场,会产生系统开销。
  7. 进程创建与撤销过程
  8. fork、exec、wait、exit 的作用和返回值。
  9. 线程和进程区别:进程是资源分配单位,线程是执行单位。
  10. 用户级线程和核心级线程区别
  11. 作业、进程、线程关系

简答题模板

题目:简述进程和程序的区别。

程序是静态的,是一组指令和数据的集合;进程是动态的,是程序关于某个数据集合的一次执行活动。程序可以长期保存,而进程有生命周期,会被创建、运行、等待和撤销。一个程序可以对应多个进程,而一个进程在某一时刻通常执行一个程序。进程还具有 PCB,是操作系统进行资源分配和调度的基本对象。

题目:简述 PCB 的作用。

PCB 是进程控制块,是标志进程存在的数据结构。操作系统通过 PCB 保存和管理进程的全部信息,包括进程标识、状态、现场信息、调度参数、地址信息、打开文件和队列指针等。进程创建时建立 PCB,进程撤销时回收 PCB。因此 PCB 是操作系统感知和管理进程的依据。

题目:为什么要引入线程?

进程切换需要保存和恢复大量上下文信息,如地址空间、系统栈、打开文件表等,系统开销较大;同时进程之间地址空间相互独立,通信不够方便。线程是进程内部相对独立的执行流,同一进程内的线程共享代码段、数据段和地址空间,只需保存少量现场信息,因此切换速度快、通信方便、系统开销小,还能提高并发性和资源利用率。

题目:用户级线程和核心级线程有什么区别?

用户级线程由用户态线程库管理,操作系统不可见,创建、撤销和切换不需要进入内核,因此速度快、调度灵活,但不能充分利用多处理器,并且一个线程阻塞可能导致整个进程阻塞。核心级线程由操作系统内核管理,操作系统可见,线程是 CPU 调度单位,可以在多处理器上真正并行,一个线程阻塞不影响同进程其他线程,但创建和切换需要进入内核,系统开销较大。

复习主线

单道程序资源利用率低
        ↓
引入多道程序设计,提高 CPU 和设备利用率
        ↓
多道程序需要管理正在执行的程序
        ↓
引入进程
        ↓
进程需要 PCB、状态、队列、上下文切换
        ↓
进程切换开销大,进程间通信不方便
        ↓
引入线程
        ↓
线程轻量、切换快、共享进程资源
        ↓
用户提交的整体任务称为作业
        ↓
作业进入内存后通常对应一个或多个进程

本章概括:

作业是用户任务,进程是资源分配和管理单位,线程是 CPU 执行单位;多道程序设计通过进程和线程机制实现并发,提高系统资源利用率。

中断与处理器调度