操作系统复习
chap1操作系统引论
操作系统的目标和作用
OS定义
os是直接控制和管理计算机硬件、软件资源,合理地对各类作业进行调度,以方便用户使用的程序的集合
操作系统的地位
紧贴系统硬件之上,所有其他软件之下
OS的目标
- 方便性
- 有效性
- 可扩充性
- 开放性
OS的作用
- 作为用户和计算机之间的接口
- 作为计算机系统资源的管理者
- 用作扩充器(实现了对计算机资源的抽象,对计算机硬件的隐藏)
OS发展的主要动力
- 不断提高计算机资源的利用率
- 方便用户
- 器件的更新迭代
- 计算机体系结构不断发展
- 不断提出新的应用请求
操作系统的发展过程
- 程序均有CPU执行
- CPU只能执行机器语言的程序
- CPU执行的程序均在内存
无OS
-
人工操作方式
-
脱机I/O方式
优点:
- 减少了CPU的空闲时间
- 提高了I/O速度
OS分类
-
批处理系统
-
单道批处理系统
主要缺点:系统资源得不到充分利用
-
多道批处理系统
优缺点:
- 资源利用率高
- 系统吞吐量大
- 平均周转时间长
- 无交互能力
-
-
分时系统
目标:对用户的请求及时相应;尽量提高系统资源的利用率
特性:
- 多路性
- 独立性
- 及时性
- 交互性
-
实时系统
- 目标:提高系统的响应时间,对随机发生的外部事件做出及时响应对其进行处理
- 分类:实时控制系统,实时信息系统
- 基本特征:
- 快速响应时间
- 有限的交互能力
- 高可靠性
操作系统的基本特性
- 并发
- 共享
- 虚拟
- 异步性
操作系统的主要功能
- 处理机管理功能
- 存储器管理功能
- 设备管理功能
- 文件管理功能
- 用户接口
OS的主要任务
为多道程序的运行提供良好的运行环境,以保证多道程序能有条不紊、高效地运行,并能最大程度上地提高系统中各种资源的利用率和方便用户使用
OS结构设计
传统的操作系统结构
-
无结构操作系统
缺点:既庞大有杂乱,缺乏清晰的程序结构;程序错误多,调试难、阅读难、理解难、维护难
-
模块化OS结构
- 优点:
- 提高了OS设计的正确性、可靠性和可维护性
- 增强了OS的可使用性
- 加速了OS的开发过程
- 优点:
-
- 缺点:
- 模块及接口划分比较困难
- 从功能上划分模块,为区别共性资源和独占资源
- 由于管理的差异,是OS结构变得不够清晰
- 缺点:
-
分层式OS结构
- 优点:
-
- 每一步设计都建立在可靠的基础上,结构更清晰
- 调试和验证更容易,正确性更高
-
-
缺点:
系统效率低。只能是单向依赖。每执行一个功能,自底向上需要穿越很多层次
-
现代操作系统结构
- 微内核的OS结构
- 基本功能
-
- 进程管理
- 存储器管理
- 进程通信管理
- I/O设备管理
-
- 特点
-
- 小而精炼
- 系统灵活性和可扩充性好
- 系统的可靠性高
- 适用于分布式系统
chap2 进程管理
前趋图和程序执行
前趋图
前趋图是一个有向无环图(DAG),用于描述进程之间执行的前后关系
注意:前趋图中必须不存在循环
程序的顺序执行
I->C->P
特征:
- 顺序性
- 封闭性
- 可再现性
程序的并发执行
特征:
- 间断性
- 失去封闭性
- 不可再现性
进程的描述
进程的特征和定义
定义:
程序关于某个数据集合的一次执行过程
进程的特征:
-
结构特征
进程控制块(PCB)+程序+数据 = 进程实体
-
动态性 ——最基本特征
进程:进程实体的一次执行过程,有生命周期
程序:程序是一组有序指令的集合,是静态的概念
-
并发性
-
独立性
-
异步性
进程的三种基本状态
-
就绪状态
进程获得除CPU之外的所有必需资源,一旦得到CPU控制权,立即可以运行
-
运行状态
进程已获得运行所必须的资源,它的程序正在处理机上执行
-
阻塞状态
正在执行的进程由于发生某事件而暂时无法执行时,便放弃处理机而处于暂停状态,称该进程处于阻塞状态或等待状态
挂起状态
引起挂起状态的原因
- 终端用户的请求
- 父进程请求
- 负荷调节的需要
- 操作系统的需要
进程状态的转换
挂起、激活
进程控制块
PCB的作用
使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程
进一步阐述:
- 作为独立运行基本单位的标志
- 能实现间断性运行方式
- 提供进程管理所需要的信息
- 提供进程调度所需要的信息
- 实现与其他进程的同步与通信
PCB中的信息
- 进程标识符(外部标识符、内部标识符)唯一标识一个进程
- 处理机状态
- 进程调度信息
- 进程控制信息
PCB的组织方式
- 线性方式
- 链接方式
- 索引方式
进程控制
进程创建
进程图
引起进程创建的事件
- 用户登入
- 作业调度
- 提供服务
- 应用请求
进程的创建过程
creat()原语
申请空白PCB->为新进程分配资源->初始化进程控制块->将新进程插入到就绪队列
进程的终止
引起进程终止的事件
-
正常结束
-
异常结束
越界错误;非法指令
-
外界干预
操作员或操作系统干预
父进程的请求
父进程的终止
进程终止过程
找到被终止的PCB->若进程状态为运行态,置CPU调度标志为真->若其有子进程,终止其子进程并收回其资源->回收终止进程的资源->回收终止进程的PCB
进程的阻塞与唤醒
引起阻塞和唤醒的事件
- 请求系统服务
- 启动某种操作
- 新数据尚未到达
- 无新工作可做
进程的挂起和激活
进程同步
进程同步的主要任务:
是并发执行的诸进程之间能有效的共享资源相互合作;从而是使程序的执行具有可再线性
进程同步的基本概念
进程间两种形式的制约关系
- 间接相互制约关系 — 源于资源共享
- 直接相互制约关系 — 源于进程合作
临界资源
把一次仅允许一个进程访问的资源叫做临界资源
进程互斥
两个进程不能同时进入访问同一临界资源的临界区
进程同步
某进程为获得合作进程发来的消息之前该进程等待,消息到来之后方可继续执行合作关系
同步机构(同步机制)
系统用来实现进程之间同步与互斥的机构
同步机制应遵守的规则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
信号量机制
- 整型信号量
- 记录型信号量
- and型信号量
- 信号量集
信号量的应用
信号量机制实现进程互斥
semapore mutex = 1
begin
parbegin
p1:begin
repeat
wait(mutex)
critical section
signal(mutex)
remainder section
until false
end
p2:begin
repeat
wait(mutex)
critical section
signal(mutex)
remainder section
until false
end
parend
end
信号量机制实现前驱关系
semapore mutex = 0
begin
parbegin
p1:begin
repeat
critical section
signal(mutex)
remainder section
until false
end
p2:begin
repeat
wait(mutex)
critical section
remainder section
until false
end
parend
end
记记录型信号量实现同步
samaphore empty = 1 full = 0
begin
parbegin
p1:begin
repeat
wait(full)
print(x)
signal(empty)
until false
end
p2:begin
repeat
wait(empty)
print(x)
signal(full)
until false
end
parend
end
经典进程的同步问题
生产者-消费者
生产者往buffer数组中存放数据,消费者从buffer中取数据,生产者和消费者之间是异步的,但必须同步,先生产再消费。生产者在存放数据的时候是需要修改数组指针的,所以生产者之间是互斥的,消费者同理。
Pi -> □□□□ -> Ci
semaphore empty=n full=0 mutex=1
void producer(){
wait(empty)
wait(mutex)
buffer[in] = nextp
in = in+1%n
signal(mutex)
signal(full)
}
void consumer(){
wait(full)
wait(mutex)
nextc = buffer[out]
out = out+1%out
signal(mutex)
signal(empty)
}
哲学家进餐
semaphore chopstick[5]={1,1,1,1,1}
Phliosopher i(){
wait(chopstick[i])
wait(chopstick[i+1%5])
eat
signal(chopstick[i])
signal(chopstick[i+1%5])
}
这样是不可行的,当5个哲学家同时拿起筷子的时候,会引起死锁
解决方法:
- 至多允许4个哲学家同时拿筷子
semaphore chopstick[5]={1,1,1,1,1} num=4
Phliosopher i(){
wait(num)
wait(chopstick[i])
wait(chopstick[i+1%5])
eat
signal(chopstick[i])
signal(chopstick[i+1%5])
signal(num)
}
- 同时拿两个筷子,and信号量
semaphore chopstick = [1,1,1,1,1]
Philosopher i(){
swait(chopstick[i], chopstick[i+1%5])
eat
Ssignal(chopstick[i], chopstick[i+1%5])
}
- 都先拿偶数的筷子(第i个哲学家再第i个筷子和i+1%i个筷子中间)这样相邻的哲学家就只能先争夺
semaphore chopstick = [1,1,1,1,1]
Philosopher i(){
if i%2==0:{
wait(chopstick[i])
wait(chopstick[i+1%5])
}
else{
wait(chopstick[i+1%5])
wait(chopstick[i])
}
eat
signal(chopstick[i])
signal(chopstick[i+1%5])
}
读者-写者
- 记录型信号量
samaphore rmuter=1 wmutex=1
int readcount=0
#rmuter表示读者修改readcount时候的互斥,wmitex表示读者与写者、写者和写者之间的互斥
void read(){
wait(rmutex)
if(readcount==0){
wait(wmutex)
}
readcount++
sginal(rmutex)
read
wait(rmutex)
readcount--
if(readcount==0){
sginal(wmutex)
}
wait(sginal)
}
void write(){
wait(wmutex)
write
sginal(wmutex)
}
对写者不公平,只要用读者,写者就无法进行
- 信号量集
semaphore L=rn, mutex=1
#L表示允许读者的最大数量rn,mutex读写、写写互斥
void read(){
Swait(L,1,1; mutex,1,0)
read
Ssignal(L,1)
}
void write(){
Swite(L,rn,0; mutex,1,1)
write
Ssignal(mutex,1)
}
进程通信
进程通信:指进程之间的信息交换
-
低级通信:进程间仅交换一些状态和少量数据
进程之间的互斥和同步——低级通信
信号量机制的通信缺点:
- 效率低
- 通信对用户不透明
-
高级通信:进程间可交换大量数据。是指用户可直接利用操作系统所提供的一组通信命令,高效地传送大量数据的一种通信方式
操作系统隐藏了进程通信的细节,对用户透明,减少了通信程序编制上的复杂性。
进程通信的类型
-
共享存储器系统
相互通信的进程之间共享某些数据结构或共享存储区,通过这些空间进行通信
-
基于共享数据结构的通信方式
公用某些数据结构(是一个空间),比如消费者生产者的buffer
特点:低效、只适合传递相对少量的数据
-
基于共享存储区的通信方式
在存储器划分出一块共享存储区,从共享存储区中申请一块分区
-
-
消息传递系统
进程间的数据交换,以格式化的消息为单位
-
管道通信
管道:用于连接一个读进程和一个写进程以实现他们之间通信的一个打开的共享文件,又名pipe文件
管道
写进程-> ====== ->读进程
管道机制提供的协调能力:互斥、共享、确认对方是否存在
消息传递通信的实现方法
-
直接通信方式
通信原语:
send(receiver, message)
receive(sender, message)
-
间接通信方式——通过信箱通信
消息在信箱中可安全保存,只允许核准的目标用户随时读取
既可实时通信,又可非实时通信
一对一、多对一、一对多、多对多
原语:
-
信箱的创建和撤销
-
消息的发送和接受
send(mailbox, message)
receive(mailbox, message)
-
直接消息传递的系统实例
-
通信链路分类:
- 根据通信链路的建立方式:
- 显示连接
- 隐式连接
- 根据通信链路的建立方式:
-
- 根据通信链路的链接方法:
- 点-点连接通信链路
- 多点连接通信链路
- 根据通信链路的链接方法:
-
- 根据通信方式的不同:
- 单向通信链路
- 双向链路
- 根据通信方式的不同:
-
- 根据通信链路容量的不同:
- 无容量通信链路
- 有容量通信链路
- 根据通信链路容量的不同:
-
消息的格式
- 单机环境:环境相同,消息格式简单
- 计算机网络环境:环境不同,消息的传输距离很远,消息格式比较复杂
- 消息格式:
- 消息头:消息在传输的时所需要的控制信息
- 消息正文:发送进程实际上所发送的数据
-
- 从消息长度分类:
- 比较短的定长消息格式
- 变长的消息格式
- 从消息长度分类:
-
进程同步方式
在进程之间进行通信时,辅以进程同步机制,使诸进程间能协调通信
发送进程或接收进程在完成消息的发送或接收后,都存在两种可能性:进程或者继续发送(接收);阻塞。
- 发送进程阻塞、接收进程阻塞
- 发送进程不阻塞、接收进程阻塞
- 发送进程和接收进程均不阻塞