操作系统-第一章操作系统和第二章进程(知识点学习/期末复习/笔试/面试/考研)
1.1 操作系统的目标和作用
操作系统的目标:
(1)方便性:使计算机更容易使用
(2)有效性:控制管理计算机软硬件资源,提高利用率
(3)可扩充性:便于扩充新功能
(4)开放性:遵循标准,彼此兼容
多道批系统
例子:
现有三道作业,第一道作业需要输入10s,运行20s,输出20s;第二道作业需要输入20s,运行20s,输出30s,然后再运行30s,输出10s;第三道作业需要输入20s,运行30s,输出30s
- 表示10s
- -- --
-- -- --- --- -
-- --- ---
共需要:(10+20+20)+30+(30+10)=120s
CPU利用率:[(20+20+30+30)/120]*100%=83.4%
输入设备利用率:[(10+20+20)/120]*100%=41.6%
输出设备利用率:[(20+30+10+30)/120]*100%=75%
三个利用率之和为200%
利用率要先算出所用的总时间
1.2 操作系统的发展过程
多道批处理系统优缺点
- 资源利用率高,包括CPU、内存、I/O设备。
- 系统吞吐量大。
- 平均周转时间长。
- 无交互能力。
特征:多道性,无序性,调度性
需要解决的问题: 处理机管理问题。 内存管理问题。 I/O设备管理问题。 文件管理问题。 作业管理问题。
处理机、内存、I/O设备、文件、作业
操作系统的定义:一组控制与管理计算机硬件和软件资源,合理地对各类作业进行调度,以及方便用户使用的程序的集合
1.3 操作系统的基本特性
并发(Concurrence)
- 并行与并发
- 进程、线程
共享(Sharing)
- 互斥共享、同时访问
虚拟(Virtual)
- 把一个物理实体变为若干个逻辑上的对应物
- 时分技术:虚拟处理机、虚拟设备
- 空分技术:虚拟信道、虚拟存储
异步性(Asynchronism)
- 以人们不可预知的速度向前推进,但只要运行环境相同,多次运行都会获得完全相同的结果
1.4 操作系统的主要功能
处理机管理
- 进程控制、进程同步、进程通信、CPU调度
存储器管理
- 内存分配、内存保护
- 地址映射、内存扩充
设备管理
- 缓冲管理、设备分配、设备处理、虚拟设备
文件管理
- 存储空间管理、目录管理
- 文件的读/写管理和保护
用户接口
- 命令接口、程序接口、图形接口
2.1 进程的基本概念
前趋图
前趋图(Precedence Graph)是一个有向无循环图,记为DAG(Directed Acyclic Graph)
描述进程之间执行的前后关系。
图中的每个结点于描述一个程序段、进程、语句
结点间的有向边“→”表示之间的偏序或前趋关系
- Pi→Pj,称Pi是Pj的直接前趋,而称Pj是Pi的直接后继。
- 在前趋图中,把没有前趋的结点称为初始结点(Initial Node),把没有后继的结点称为终止结点(Final Node)。
- 每个结点还具有一个重量(Weight),用于表示该结点所含有的程序量或结点的执行时间。
程序并发执行时的特征
- 间断性
- 失去封闭性
- 不可再现性
例子:两个循环程序A和B,共享一个变量N。
程序A每执行一次时,都要做N+1操作;
程序B每执行一次时, 都要执行Print(N)操作,然后再将N置成“0”。
程序A和B以不同的速度运行。
三个语句并发执行:N=N+1; Print(N); N=0 。引发多种结果
进程的定义
进程是程序的一次执行。
进程是一个程序及其数据在处理机上顺序执行时所发生的活动
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
进程的三种基本状态
就绪状态:已获得CPU以外所有资源,处于就绪队列
执行状态:获得CPU,处于执行过程
阻塞状态:发生某种事件暂时无法进行,放弃CPU处于暂停状态,如请求I/O,请求缓冲空间,处于阻塞队列
活动状态和静止状态的转换
活动→静止,原语suspend(挂起)
静止→活动,原语active(激活)
活动就绪→静止就绪,Readya →Readys(挂起)
活动阻塞→静止阻塞,Blockeda→ Blockeds(挂起)
静止就绪→活动就绪,Readys →Readya(激活)
静止阻塞→活动阻塞,Blockeds →Blockeda(激活)
PCB的作用
(1)进程存在的唯一标志
(2)记录进程的外部特征
(3)描述进程变化的过程
(4)记录进程和其他进程的联系
(5)OS通过PCB控制和管理进程
- OS调度进程进入执行态
- 进程间的通信
- 进程的挂起
进程控制块的组织方式
链接方式
索引方式
2.2 进程控制
父进程:由系统或用户首先创建的进程
子进程:父进程创建的进程
父子进程关系:
- 进程控制:子进程由父进程创建或撤销,子进程不能控制父进程
- 资源继承:子进程可以全部或部分共享父进程的资源
- 运行方式:可同时进行,可以控制先后
- PCB:在PCB中设置家族关系表项,标明自己的父进程和子进程
#include <unistd.h> #include <stdio.h> int main(int argc, char ** argv ) { int pid = fork(); if(pid == -1 ) { print("error!"); } else if( pid = =0 ) { print("This is the child process!"); getchar();} else { print("This is the parent process! child process id = %d", pid); getchar();} return 0; }
pid = fork();
如果pid == -1
,则创建子进程失败;
如果pid == 0
,则当前是子进程;
如果pid > 0
,则当前是父进程,pid 是子进程的进程ID。
进程阻塞过程
正执行过程中,当发现引发阻塞的事件,无法继续执行,进程调用阻塞原语block把自己阻塞。
阻塞是进程自身的一种主动行为
- 停止当前执行
- 修改状态,由执行改为阻塞
- 将PCB插入阻塞队列,若有因不同事件而划分的多个阻塞队列,阻塞进程插入相应队列
- 重新调度,将处理机分配给另一就绪进程
- CPU环境进行切换,保存被阻塞进程的CPU状态到PCB中,按新进程PCB的CPU状态设置CPU新环境
进程唤醒过程
被阻塞的事件已满足,如I/O完成或所需数据已到达,则由有关进程(比如,用完并释放了该I/O设备的进程)调用唤醒原语wakeup,将等待事件的进程唤醒
唤醒原语执行的过程
- 首先把被阻塞的进程从等待该事件的阻塞队列中移出
- 将其PCB中的现行状态由阻塞改为就绪
- 再将该PCB插入到就绪队列中
进程的挂起与激活
进程的挂起
出现引发挂起的事件(挂起的原因),系统将用原语suspend将指定进程挂起
挂起原语的执行过程
- 首先检查被挂起进程的状态,活动就绪改为静止就绪;活动阻塞改为静止阻塞
- 将PCB复制到指定的内存区域
- 数据复制到外存,释放内存
- 若被挂起的进程正在执行,则重新调度
进程的激活过程
当发生激活进程的事件,如父进程或用户进程请求激活,或当前内存有足够的空间,系统利用激活原语active将进程激活。
激活原语执行的过程
- 先将进程从外存调入内存
- 检查该进程的现行状态,静止就绪改为活动就绪;静止阻塞改为活动阻塞。
- 若是进入就绪队列,则重新调度,抢占式和非抢占式调度
2.3 进程同步
进程同步的基本概念
进程同步的任务:是使并发进行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性.
两种形式的制约关系
- 间接相互制约关系:申请I/O、CPU
- 直接相互制约关系:输入/输出、运算的前后顺序
(1)间接相互制约关系
进程之间通过“共享资源”而发生的等待关系,彼此并不直接通信或依赖结果。
什么叫“间接”?
因为不是两个进程“互相等待对方”,而是他们都在争夺一个资源。比如:
进程 A 想用打印机
打印机正被进程 B 占用
所以 A 等待 B 释放
间接,是因为它们之间的关系通过“资源”建立起来的,不是你等我、我等你
(2)直接相互制约关系
进程之间直接依赖对方的数据或操作结果,需要通过“同步机制”来协调。
为什么叫“直接”?
因为你必须等我干完,你才能动手,比如:
进程 A 从键盘接收输入
进程 B 要把 A 的输入结果拿去做运算
此时:
B 必须“直接等待”A 的输出完成
A 和 B 之间存在直接“逻辑依赖”
直接,是因为进程之间有“结果或状态的因果关系”,必须协调先后执行顺序。
临界资源:进程间共享的软硬件资源 【互斥型共享】
进程同步的典型例子:生产者-消费者问题
- 生产者进程生产产品,消费者进程消费产品
- 具有n个缓冲区的缓冲池
- 生产者进程每次放入一个产品,一个缓冲区满
- 消费者进程每次取走产品,一个缓冲区空
- 不允许生产者进程向满缓冲区放产品
- 不允许消费者进程从空缓冲区取产品
- 互斥共享了缓冲池,每个时刻只有一个进程可以对缓冲池做操作
同步机制应遵循的规则
(1)空闲让进
如果资源(比如临界区)是空闲的,应该立即允许进程进入使用,不要白白等待。
(2)忙则等待
如果资源正在被某个进程使用,其它想用的进程必须等待,不能同时进去。
(3)有限等待
每个想使用资源的进程,等待的时间不能无限长,要有保证最终能轮到它。
(4)让权等待:释放CPU、避免忙等
当一个进程申请资源失败(发现资源正忙),它不应一直死等占着 CPU,而应该主动让出 CPU 给别人用。
信号量机制
(1)整型信号量
使用一个代表资源数目的整型变量
除初始化外,仅两个标准原子操作能访问
- wait(S)和signal(S)
- 分别称为P、V操作
wait(S):while S≤0 do no-op
S∶= S-1;
signal(S):S∶=S+1;
缺点:While循环不能释放处理机,“忙等”,未遵循“让权等待”规则
(2)记录型信号量
不存在“忙等”现象,采取“让权等待”的策略
增加一个进程链表L ,用于链接所有等待进程
等待进程使用阻塞操作进入进程链表L
信号量S是一个结构体:
type semaphore=record
value:integer; //资源可用数量
L:list of process; //等待进程队列
end
PV操作描述
procedure wait(S)
var S: semaphore;
begin
S.value∶= S.value-1;
if S.value<0 then block(S,L) //S.value<0时,资源已分配完毕,进程调用block原语进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。
end
procedure signal(S)
var S: semaphore;
begin
S.value∶= S.value+1;
if S.value≤0 then wakeup(S,L); //若加1后S.value≤0,则表示链表中有等待该资源的进程被阻塞,调用wakeup原语,将S.L链表中的第一个等待进程唤醒
end
AND同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源,也不分配给他。 对若干个临界资源的分配,采取原子操作方式:要么全部分配到进程,要么一个也不分配。 由死锁理论可知,这样就可避免上述死锁情况的发生。为此,在wait操作中,增加了一个“AND”条件,故称为AND同步,或称为同时wait操作。包含操作Swait和Ssignal