操作系统最核心的概念就是
进程
第一节 进程的描述
一. 程序的并发执行
- 程序的顺序执行
顺序性
: 处理机的操作, 严格按照程序所规定的程序执行.封闭性
: 程序是在封闭的环境下运行的. 即程序在运行时独占全机资源, 因而各资源的状态只有本程序才能改变. 程序一旦开始运行,结果不受外界因素影响.可再现性
:只要程序执行时的环境和初始条件相同, 当程序多次重复执行时, 其执行结果相同.
- 程序的并发执行
程序的并发执行是在同一时间间隔内运行多个程序. 一个程序执行结束之前, 可以运行其他程序.
特点如下:
- 间断性: 资源的有限性使并发执行的程序呈现执行过程的间断性.
- 失去封闭性: 比如售票系统, 余票数时时刻刻在变化.
- 不可再现性: 程序在并发执行时, 由于失去了封闭性, 也将导致其失去执行结果的可再现性.比如: 这次买票还余10张, 再运行一下, 结果就会变成8张等.
二. 进程的概念
1.进程的定义:
定义1: 进程是允许并发执行的程序在某个数据集合上的运行过程
定义2: 进程是由正文段
, 用户数据段
及进程控制块
共同组成的执行环境. 正文段存放被执行的机器指令
, 用户数据段
存放进程在执行时直接进行操作的用户数据
. 进程控制块
存放程序的运行环境
, 操作系统通过这些数据描述和管理进程.
进程代表了程序的执行过程, 是一个动态的实体,它随着程序中指令的执行而不断变化, 在某个特定时刻的进程内容被称为进程映像
2. 进程的特征
进程是操作系统管理的实体, 对应了程序的执行过程. 有以下几个特征.
并发性
. 是进程和现代操作系统的重要特征动态性
.进程被创建后还有进程状态的变化独立性
.进程是独立运行和资源调度的基本单位.异步性
.是指进程的执行时断时续, 什么时候执行, 什么时候暂停,都无法预知, 呈现随机的特性.结构特征
. 进程实体包括: 正文段, 用户数据段和进程控制块
- 进程与程序的比较
(1) 区别:程序是静态的, 进程是动态的
.
程序是永久的, 进程是暂时存在的.
程序与进程的存在实体不同
. 程序是指令的集合, 而进程包含了三部分
(2)联系:
进程是程序的一次执行, 进程总是对应至少一个特定的程序, 执行程序的代码.
一个程序可以对应多个进程.同一个程序可以在不同的数据集合上运行, 因而构成不同的进程. 几个进程可以并发的执行相同的代码, 而同一个进程能顺序的执行几个程序.
三. 进程控制块
进程实体存在的标志
是操作系统管理进程所使用的数据结构----进程控制块
- 什么是进程控制块(Process Control Block,
PCB
)
进程控制块是进程实体的一部分, 是操作系统中最重要的数据结构. 进程控制块中记录了操作系统所需要的, 用于描述进程情况及控制进程运行所需的全部信息.
每个进程都有唯一的进程控制块
, 是操作系统感知进程存在的唯一标志.
- 进程控制块中的信息
(1). 进程标识符信息.
用于唯一标识一个进程.除了本进程的标识符外, 还存放其父进程和子进程的标识符.
(2) 处理机状态信息, 包括以下几个:- 通用寄存器: 用户程序可以访问的寄存器, 用于暂存信息.
- 指令计数器: 其中存放了CPU要访问的下一条指令的地址.
- 程序状态字: PSW: 其中包含: 状态信息, 如条件码, 执行方式和中断屏蔽标志等
- 用户栈指针.每个用户进程都有一个与之相关的系统栈, 用于存放过程和系统调用参数及调用地址, 栈指针指向该栈的栈顶.
- 进程调度信息: 进程状态信息, 进程优先级和进程调度所需的其他信息.
- 进程控制信息:包括:程序和数据地址, 进程同步和通信机制, 资源清单以及链接指针.
进程控制块是复杂类型的变量.
四. 进程的状态
进程控制块的状态字段描述进程当前所处的状态., 它由一组标志组成, 每个标志描述一种可能的进程状态.
- 进程的3中基本状态:
就绪态
: 进程一旦获得CPU就可以投入运行的状态执行态
: 进程获得CPU正在运行的状态阻塞态
:进程由于等待资源或某个事件的发生而暂停执行的状态, 系统不会为处于阻塞状态的进程分配 CPU.阻塞态的进程在获得其等待的资源或其等待的事件发生之后, 转变为就绪态.
- 进程状态的转换
进程状态由阻塞态变为就绪态的过程称为唤醒过程,
由执行态变为阻塞态的过程称为阻塞过程
五. 进程的组织
- 链接方式
- 索引方式
- 进程队列
第二节 进程的控制
一. 进程的创建
创建新进程包括为进程分配必要的资源, 建立操作系统用于管理进程的数据结构等操作.以下情况下需要创建新进程
- 用户登录
- 作业调度
- 提供服务
- 应用请求
调用 创建新进程的系统调用 用来创建进程的一般步骤如下:
1). 申请空白PCB
2). 为新进程分配资源
3). 初始化进程控制块
4). 将新进程插入就绪队列
二. 进程的阻塞
下列情况下, 可能进行进程的阻塞和唤醒操作.
1). 请求系统服务.如打印服务
2). 启动某种操作, 如启动打印机命令, 在等待启动完成时, 处于阻塞态
3). 新数据尚未到达.
4). 无新工作可做.发送消息后等待响应时.
简化过程如下:
- 将进程的状态改为阻塞态
- 将进程插入相应的阻塞队列中
- 转进程调度程序, 从就绪队列中选择进程为其分配 CPU
三.进程的唤醒
过程如下:
- 将进程阻塞队列中移出
- 将进程状态由阻塞态改为就绪态.
- 将进程插入就绪队列
四. 进程的终止
进程的终止也称为进程的撤销, 下列情况下, 进程会被终止.
- 进程正常执行完毕, 调用终止进程的系统调用, 请求操作系统删除该进程.
- 一个进程调用适当的系统调用, 终止另外一个进程. 通常, 操作系统规定只允许父进程通过这种方终止其子进程
一般过程如下:
1). 从进程PCB中读进程状态
2). 若进程正在执行, 则终止进程的执行.
3). 若进程有子孙进程, 在大多数情况下需要终止子孙进程.
4). 释放资源
5). 将终止进程的PCB移出
第三节 操作系统内核
操作系统内核是计算机硬件的第一次扩充, 内核执行操作系统与硬件关系密切,执行频率高的模块, 常驻内存.具有以下功能:
支撑功能
: 包括中断处理
,时钟管理
和原语操作
, 原语操作也称为原子操作, 是一组在执行过程中不能被中断的操作.资源管理功能
: 包括:进程管理
,存储器管理
和设备管理
一. 中断
- 什么是中断
- 中断是改变处理器执行指令顺序的一种事件, 这样的事件与CPU芯片内外部硬件电路产生的电信号相对应.
- 为什么需要中断
- 引入中断机制后, 使CPU可以与其他设备并行工作, 能有效提高CPU的利用率, 改善系统性能, 支持系统的异步性.
- 中断的类型
- 同步中断(也称内部中断或异常),当指令执行时由CPU控制单元产生, 之所以称为同步, 是因为只有在一条指令终止执行后CPU才会发出中断, 如除法出错, 调试, 溢出等 TODO: 此处存疑, 待解决.
- 异步中断(也称外部中断), 是由其它硬件随机产生的.
- 引起中断的原因
1). 人为设置中断
2). 程序性事故
3). 硬件故障
4). IO设备
5). 外部事件 - 中断响应
1). 响应中断的条件:对于可屏蔽中断, 开中断是响应中断的前提
2). 响应中断的时机: 对于外部中断, CPU每执行完一条指令都会检测是否有外部中断信号的到来, 若有则转中断处理 - 单重中断的处理过程
1). 系统关闭中断, 保护断点, 把当前要执行的下一条指令的地址保存的内存中, 以便中断时返回, 能把这个地址恢复到程序计数器中, 使被中断的程序从断点开始继续执行.
2). 转中断处理程序.
3). 保护完现场后, 要根据中断向量到中断向量表中找到与中断处理子进程入口地址相关的信息.
4), 恢复现场, 开中断, CPU返回断点处继续执行被中断的程序. - 如何找到中断服务子程序
1). 中断向量: 是对不同中断源到来信号进行编号, 该编号是一个符号整数, 称为中断向量.
不可屏蔽中断的向量和异常的向量是固定的, 类似访问网站, 服务器错误就是固定的500, 这样的.
2). 中断描述符表(IDT), 是一个系统表, 每个中断或异常与向量相联系.每个向量在表中有唯一对应的表项.
二. 时钟管理
- 时钟的重要性
- 时钟是计算机系统的脉搏.
- 计算机系统中的时钟(实时时钟和OS时钟)
实时时钟(Real Timer Closeker RTC), RTC时钟也称为CMOS时间
, 是一块时钟芯片, 靠电池供电, 为计算机提供计时标准, 是原始, 最底层的数据.OS时钟
, 产生于PC主板上的定时/计数芯片, 在开机时有效, 由操作系统控制.
- 操作系统的时钟机制
操作系统内核需要完成两种主要的定时测量, 一是保存当前的日期和时间, 以便能通过系统调用把它们返回给用户程序, 让用户程序获得当前的日期和时间, 二是维护定时器, 这种机制能够告诉内核或用户程序某一时间间隔已经过去了.
操作系统依靠时钟硬件(可编程间隔定时器 PIT)
和时钟驱动程序
完成上述两种定时测量功能.
(1)OS时钟管理硬件
主要由3部分构成: 晶振, 计数器和保持寄存器
晶振能够产生固定频率的脉冲, 每产生一次脉冲, 计数器减1, 当计数器的值减为0时, 产生一次时钟中断信息, 保持寄存器的值再次送达计数器.
(2)时钟软件-- 时钟驱动程序
时钟驱动程序也称为时钟中断处理程序, 每产生一次时钟中断信号, 操作系统内核就要执行时钟驱动程序, 主要完成以下功能:
1). 维护日期和时间.
2). 递减当前进程在一个时间片内的剩余执行时间, 并检查是否为零, 防止进程运行超时.
3). 对CPU使用情况计账
4). 递减报警计数器
三. 系统调用
- 什么是系统调用?
系统调用是一群预先定义好的模块, 它们提供一条管道让应用程序或一般用户能由此得到核心程序的服务.
系统调用
是系统程序与用户程序
之间的接口. - 系统调用与一般函数之间的区别
- 用户态执行
用户空间是指用户进程所处的地址空间, 一个用户进程不能访问其他进程的用户空间, 只能系统程序才能访问其他用户空间. 当CPU执行用户空间的代码时, 称为该进程在用户态执行. - 系统态执行
系统空间是指含有一切系统核心代码的地址空间, 当CPU执行系统核心代码时, 称为该进程在系统态执行
区别如下:
1). 系统调用运行在系统态(核心态), 而一般函数运行在用户态
2). 系统调用与一般函数的调用的执行过程不同.
3). 系统调用要进行"中断处理", 比一般函数调用多了一些系统开销
- 系统调用的类型
1). 进程控制类系统调用.
2). 文件操纵类系统调用
3). 设备管理类系统调用.
4). 通信类系统调用.
5). 信息维护类系统调用. - 操作系统提供系统调用的优点
1). 使编程更加容易, 把用户从学习硬件设备的低级编程特性中解放出来
2). 极大地提高了系统的安全性.
第四节. 进程同步
一. 进程同步的基本概念
临界资源是必须以互斥方式访问的共享资源…
二. 同步机制应遵循的原则
- 空闲让进.
- 忙则等待
- 有限等待
- 让权等待: 当进程申请不到共享资源的访问权时, 应立即释放处理机, 以免进程陷入"忙等"状态, 浪费CPU资源.
三. 信号量机制
在信号量机制中, 用某种类型的变量, 即信号量的取值来表示资源的使用状况, 或某种事件是否发生,以此为基础实现进程的同步.
1. 整型信号量机制
整型信号量是表示共享资源状态且只能由特殊的原子操作改变的整型量.
整型信号量的wait
和signal
操作
1). wait用于申请资源操作, signal用于释放资源操作
var s int;
wait(s){
while (s<=0){
do no-op; // 当小于等于0时, 循环执行空操作
}
s = s-1;
}
signal(s){
s = s+1;
}
2). 用整型信号量实现进程互斥
互斥信号量:mutex
2. 记录型信号量机制
(1). 数据类型:
typedef struct semaphore {
Value: int; // 资源数量
L: list of process; // 阻塞队列
}
(2). wait操作和signal操作
procedure wait(s){
var s: semaphore;
begin
s.Value = s.Value-1;
if s.Value<0 then block(s.L);
end.
}
procedure signal(s){
var s: semphore;
begin
s.Value = s.Value+1;
if s.Value <=0 then wakeup(s.L);
end
}
记录型信号量机制的优点是不存在"忙等", 采取了"让权等待"的策略
3. AND型信号量机制
AND信号量机制的基本思想是: 将进程在整个运行过程中所需要的所有资源一次性全部分配给进程, 待该进程使用完后再一起释放, 只要还有一个资源不能分配给该进程, 其他所有可能为之分配的资源也不能分配给它.
4. 经典的进程同步问题:
- 生产者-消费者问题的描述
用记录型信号量机制解决生产者-消费者问题, 对具有相互合作关系的进程, 提供了解决问题的模型.
5. 管程
信号量机制的缺陷是每个访问共享资源的进程都必须自备同步操作wait和signal, 这就使大量的同步操作分散在各个进程中, 管理麻烦, 同步不当导致系统出错.因此引入管程.
- 管程的基本概念:
管程是描述共享资源的数据结构和在数据结构上的共享资源管理程序的集合.
管程是可供程序员调用的软件包.
管程是一个由过程, 变量及数据结构等组成的集合, 它们组成一个特殊的模块或软件包.
第五节 进程通信
操作系统提供进程通信功能, 以支持进程之间的信息交换. 进程之间的高级进程机制分为共享存储器系统, 消息传递系统和管道通信系统.
- 共享存储器系统
- 消息传递系统
- 管道通信
- 消息缓冲队列
第六节 线程
在传统的操作系统中, 进程是进行资源分配和独立执行的基本单位, 为了进一步提高程序的并发性, 减少系统开销, 引入了线程
由于进程即是独立执行的基本单位, 又是资源拥有者, 在进程创建, 撤销和切换时需要较大的时空开销, 所以,系统中所设置的进程数和进程切换的频率都受到了限制, 影响了操作系统并发程度的提高, 引入线程作为独立调度和分派的单位, 不独立拥有资源, 而与其他线程共享同一进程的资源, 减小了系统开销.
线程的实质就是把进程的任务划分成更小, 具有独立功能的单位, 以线程的形式来并发执行,以提高程序并发执行的程度.
一.线程的基本概念
1. 线程的描述
线程是进程中的一个实体, 是被系统独立调度和分派的基本单位.
线程的实现可以分为两类: 用户级线程和内核级线程
内核级线程与用户级线程的比较:
- 线程的调度与切换速度
- 内核级线程切换慢, 用户级线程切换快.
- 系统调用
- 内核级线程进行系统调用, 只阻塞该线程, 用户级线程的系统调用, 要阻塞线程所属的进程.
- 线程执行时间的分配
内核级线程的CPU时间以线程为单位分配, 每个线程都可以独享一个CPU时间片. 用户级线程的CPU时间以进程为单位, 同一个进程的多个线程共享一个CPU时间片.
2 线程控制块(Thread Control Block, TCB)
3. 线程与进程的关系
- 资源和调度: 线程是程序执行的基本单位, 进程是拥有资源的基本单位
- 地址空间资源: 不同进程的地址空间是相互独立的, 而同一进程中的各线程共享同一地址空间
- 通信关系 : 进程间通信依赖操作系统, 同一进程的线程间通信可以通过读写全局变量实现, 甚至无需要操作系统的参与
- 并发性, 多个进程之间可以并发执行, 多线程之间也可以并发执行, 而且同一个进程中的多个线程之间也可以并发执行.
- 系统开销. 由于创建或撤销进程时, 系统都要为之分配或回收资源, 系统开销较大. 线程进行上下文切换时,只需要保留和设置少量的寄存器内容, 系统开销较小.