第一章
操作系统的定义: 是一组管理计算机内的硬件和软件资源,同时提供用户接口,方便用户使用计算机资源的程序的集合。
操作系统三种类型:批处理系统、分时系统、实时系统。
操作系统的基本特性:并发、共享、虚拟、异步。
1、并发和共享是操作系统两个最基本的特征,他们相互依存。
并发是在同一时间段内发生; 多道程序就是并发执行。
并行是在同一时刻发生;
2、共享分为互斥共享(如打印机)和同时访问共享(磁盘);
3、虚拟是把实体变成逻辑上的对应。
4、异步性是cpu资源呈现“走走停停”的过程。
操作系统的五大功能是:存储器管理、处理机管理、文件管理、I/O设备管理和用户接口管理。
处理机管理包括:
进程管理(第二章) #处理机管理实际上是对进程的管理
- 进程的运行(定义、性质、状态、数据结构)
- 进程的控制(创建、删除、阻塞、唤醒)
- 进程的同步(信号量机制)
- 进程的通信 (类型、数据结构、实现)
处理机调度:第三章
包括:调度模型、调度算法、死锁。
存储器管理包括:
- 内存的分配与回收
- 地址的映射
- 内存的保护和共享
- 内存的扩充
设备管理包括:
- IO控制系统
- 设备分配
- 缓冲管理
- 虚拟设备
文件管理:(逻辑文件系统,面向用户)
- 文件的操作
- 文件的共享
- 文件的保护
- 目录与检索
还包括文件存储空间的管理(物理文件系统,面向磁盘)
- 空闲磁盘空间管理、文件磁盘块的组织、磁盘调度与性能
用户接口:
面向操作员:命令
- 字符接口:DOS
- 图形用户接口:Windows
- 多媒体接口:语音输入
面向程序员:系统调用
- API(Windows)
- C的库函数(Unix)
第二章
一、进程:(重点)
进程的定义:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度的一个独立单位。
进程的特征:
- 动态性:有生命周期
- 并发性:和其它进程并发执行
- 独立性:资源分配,系统调度的独立系统
- 异步性:独立的,不可预知的速度前进
- 结构特征(数据集合、程序段、PCB)
进程和程序的区别和联系:
程序 | 进程 |
指令的有序集合,是静态的,永久的长期存在 | 是一次执行过程,动态的,有生命周期,是暂时的 |
/ | 系统进行资源分配和处理机调度的独立单位 |
/ | 可以创建其他进程,可以并发执行 |
同一程序可以对应多个进程 | / |
进程的三种基本状态:
- 就绪状态(Ready
- 执行状态(Running
- 阻塞状态(Block
状态转换:
进入输入输出操作时,进程处于阻塞状态!
引起状态转换的原因:
就绪—运行:调度选择一个新进程运行
运行—就绪:运行进程用完了时间片、进程被更高优先级进程中断
运行—阻塞:等待某种事件
阻塞—就绪:等待的事件解决时
二、进程控制块PCB(重点)
PCB是进程组成中最关键的部分,是进程的唯一标识,是系统对进程进行控制和管理的依据。
目的是存放描述该进程的信息和控制进程运行所需要的全部信息。进程与PCB一一对应。
操作系统通过PCB对进程进行统一的管理和控制。
进程控制块PCB的组成:
- 进程的标识信息:包括内部标识符:系统赋予给进程的序号、唯一数字标识符。外部标识符:表示运行程序,描述进程的家族关系。
- 处理机的状态信息:存放由执行态转变为阻塞或就绪态时被中断的现场信息。包括通用寄存器、指令计数器、程序状态字PSW、用户栈指针。
- 进程的调度信息:当前的状态、优先级、调度队列指针。
- 进程的控制信息:拥有的资源、程序数据的地址、同步,通信机制、PCB链接指针、进程图
进程控制块的组织方式:
(1)按链接方式组织PCB (队列): 不同状态进程分别组成不同的队列,如运行队列、就绪队列、等待队列
(2)按索引方式组织PCB (表):对具有相同状态的进程,分别设置各自的PCB索引表,表明PCB在PCB表中的地址。也被称为以空间换时间
(3)按线性方式组织PCB (队列):实现简单,但每次都要遍历整张表,只适合进程不多的系统。这种组织方式不是重点,了解即可。
三、操作系统内核
1、进程控制:
对进程的生命周期进行控制,即进程创建、撤销、状态转换和进程通信等基本功能。由原语完成
原语是有若干机器指令组成已完成特定功能的一段程序。不可分割,不可中断、并发。
原语的特点:原子性,中断屏蔽性。
2、进程创建:
引起创建进程的事件 | 创建进程的主要步骤:原语Create() |
---|---|
用户登录 | 申请空白PCB |
作业调度 | 为新进程分配资源 |
提供服务 | 初始化PCB内容 |
应用请求 | 将新进程插入就绪队列 |
进程终止的过程:
- 根据撤销进程标识号,从相应队列中找到并移出它;
- 将该进程拥有的资源归还给父进程或操作系统;
- 若该进程拥有子进程,先撤销它的所有子进程,以防它们脱离控制;
- 回收PCB。
3、进程的阻塞和唤醒
引起阻塞的事件:
- 请求系统服务
- 启动某种操作
- 新数据未到达
- 无新工作可做
过程:原语block(),发现阻塞事件,调用阻塞原语把自己阻塞,停止进程的执行,修改PCB的状态信息,将其插入到相应的阻塞队列。最后转调度程序,将处理机分配给另一个就绪进程。
进程的阻塞是进程自身的主动行为!
唤醒:当阻塞的进程所等待的事件出现时(如所需数据已到达,或者等待的I/O操作已经完成),则由另外的与阻塞进程相关的进程(如完成I/O操作的进程)调用唤醒原语,将等待该事件的进程唤醒。阻塞进程不能唤醒自己。
进程唤醒步骤:原语wakeup() 从相应的等待队列中移出进程; 修改进程PCB的有关信息,如进程状态改为就绪态,并移入就绪队列。
4、进程的挂起和激活
挂起原语的功能:原语suspend() 自身挂起、挂起具有指定标识符的进程、将其进程及其全部或部分“子孙”挂起。
激活原语功能:原语active() 使处于静止状态的进程变为活动。
四、进程同步(重点)
进程同步的基本概念:在多道程序的环境中,系统中的多个进程可以并发执行,同时它们又要共享系统中的资源,这些资源有些是可共享使用的,如磁盘,有些是以独占方式使用的,如打印机。由此将会引起一系列的矛盾,产生错综复杂的相互制约的关系。
进程同步的主要目的:为了避免进程间的竞争和冲突,确保多个进程对共享资源的访问是按照一定的顺序和规则进行的,从而避免了资源的竞争和冲突。
产生制约关系的原因:资源共享、进程合作。
进程间的关系:竞争(间接制约)关系(进程互斥),协作(直接制约)关系(进程同步)
临界资源:是指一次仅允许一个进程使用的资源。(共享变量代表的资源)
临界区:最多只允许一个进程访问的程序段。(并发进程中与共享变量有关的程序段)
临界资源的访问过程:
- a. 进入区:检查可否进入临界区;可进入,设置响应的标志,阻止其他进程。(临界资源使用的前提条件——即申请临界资源)
- b. 临界区:进程中访问临界资源的一段代码。
- c. 退出区:将访问标志清除。(临界资源使用的结果——即释放临界资源)
- d. 剩余区:代码中的其余部分。
临界区(同步机制)的调度原则:
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
信号量机制:
1、整型信号量:表示资源数目
有两个标准原子操作wait(s)P操作和singnal(s)V操作,PV操作不可中断
P操作在进入区,执行申请资源。V操作在退出区,用于释放资源,他们是成对出现
存在问题:未遵循让权等待原则。引入记录型信号量
2、记录型信号量
记录型信号量机制采取“让权等待”策略,避免了整型信号量出现的“忙等”现象。
实现时需要一个用于代表资源数目的整型变量value(资源信号量):用一个少一个。一个用于链接所有阻塞进程的进程链表list :让权等待
3、AND型信号量
将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未分配给进程,其它所有可能为之分配的资源,也不分配给它。
实现时在wait操作中,增加一个“AND”条件,故称AND同步,或同时wait操作(Swait)。
4、信号量集
信号量集是指同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的信号量处理。 一般信号量集的基本思路就是在AND型信号量的基础上进行扩充,在一次原语操作中完成所有的资源申请
经典的进程同步问题
1、生产者—消费者问题
2、哲学家进餐问题
3、读者—写者问题
4、进程通信
进程通信是指进程之间的信息交换
低级通信:传递少量信息
高级通信:传递大量信息
- 共享存储器
- 消息通信
- 管道通信
第三章
1、处理机调度的三个层次
- 进程调度
- 作业调度
- 中级调度
进程调度:也叫低级调度,负责决定将cpu分配给谁使用。是最基本的调度。其主要用于多道批处理系统,而分时系统和实时系统没有高级调度。
进程调度可分为:抢占式和非抢占式进程调度。
抢占式遵循原则:
- 优先权原则
- 短进程优先原则
- 时间片原则
作业调度:也叫高级调度,负责将排队的哪个作业调入内存,
记录进入系统的各作业情况
- 建立对应JCB(作业控制快)
- 组成后背队列作业
- 作业完成时,撤销JCB
JCB的作用:作业调度和资源分配的依据。
中级调度:也叫内存调度,负责解决内存紧张问题,提高内存利用率
三种调度的共同目标:提高资源利用率,保证公平性、平衡性,策略强制执行。
周转时间 = 完成时间—到达时间(提交时间)
= 服务时间 + 等待时间
带权周转时间 = 周转时间/服务时间(运行时间)
=(服务时间+ 等待时间)/服务时间
=1+等待时间/服务时间
2、调度算法
先来先服务FCFS:可以用于进程、作业调度。
优点:有利于长作业长进程;实现简单,系统开销小。
缺点:不利于短作业或短进程。没考虑特殊作业
为了克服FCFS的缺点,引入SJF
短作业优先SJF:优先处理短作业
优点:利用短作业;利于提高调度算法的整体性能。
缺点:不利于长作业;只考虑运行时间,没考虑等待时间,导致长作业长期得不到调度;未考虑紧迫性;作业的长短只是预估,并不是真正的执行时间
优先级调度算法 PSA
分为抢占式和非抢占式
抢占式能更好地满足紧急作业的要求,常用于实时系统、以及对性能要求高的批处理和分时系统
静态优先级和动态优先级
静态优先级在进程创建时就已经确立,且保持不变。
动态优先级在等待时间越长时,会增加优先级
高响应比 优先级调度算法HRRN
介于FCFS和SJF之间的折中
给后备队列的作业计算相应比,响应比高的优先
缺点:每次都要计算响应比,增加系统开销
时间片轮转调度算法RR
先按照先来先服务排列,并设置一个时间间隔,由计时器发出中断请求,将它结束并送往就绪队尾,再把处理机分配给新的队首,依次循环。其实就是FCFS+时间片
缺点:策略单一
多级反馈队列调度算法MFQ
3、死锁
死锁的定义:在一个进程集合中的每个进程都在等待只能由该集合中的其他一个进程才能引发的事件,则称一组进程或系统此时发生了死锁。
死锁产生的原因:
1、资源有限,竞争资源(不可抢占性资源和可消耗资源)
2、并发进程间的推进顺序不当
死锁产生的必要条件:
- 互斥条件:涉及的资源是非共享的
- 不可抢占条件:不能强行剥夺进程拥有的资源
- 请求和保持条件:进程在等待一新资源时继续占有已分配的资源,也称为部分分配条件
- 循环等待条件:存在一种进程的循环链,链中的每一个进程已获得的资源同时被链中的下一个进程所请求。
前三个为必要条件,但不是充分条件
最后一个是前三个同时存在的结果,所以这些条件并不是相互独立的,防止死锁只要破坏其中之一的条件即可。
处理解决方法:
- 鸵鸟算法:像鸵鸟一样不理睬死锁。
- 预防死锁:指通过设置某些限制条件,去破坏死锁产生的四个必要条件中的一个或几个,来预防死锁的发生。
- 避免死锁:指在资源的动态分配过程中,用某些方法阻止系统进入不安全状态,从而避免死锁的发生。
- 检测死锁:允许系统在运行过程中发生死锁,但可以设置检测机构及时检测死锁的发生,并采取适当措施加以清除。
- 解除死锁:当检测出死锁以后,采取设当措施将进程从死锁状态中解脱出来。
预防死锁的思想:
破化互斥条件:不可行。因为互斥是计算机基本特性,不可改变。
破坏不可抢占条件:一个已经获得某些资源的进程,若又请求新的资源时不能得到满足,
则它必须释放出已获得的所有资源,以后需要资源时再请求。也即一个进程已获得的资源在运行过程中可被剥夺,从而破坏了该条件,预防死锁的发生。破坏请求和保持条件:可采用预先静态分配方法,即要求进程在运行之前一次申请它所需要
的全部资源,在它的资源未满足前,不把它投入运行。一旦运行后,这些资源全归其占有,同时它也不再提出其它资源要求,这样可以保证系统不会发生死锁。但是会造成资源的浪费破坏环路等待条件:可采用有序资源分配方法,即将系统中的所有资源都按类型赋予一个编号,要求每一个进程均严格按照编号递增的次序来请求资源,同类资源一次申请完。也就是,只要进程提出请求资源Ri,则在以后的请求中,只能请求Ri的资源,这样不会出现几个进程请求资源而形成环路。
死锁的检测与解除:
是对资源的分配不加以任何限制,也不采取死锁避免措施,但系统定时地运行一个“死锁检测”程序,判断系统内是否已出现死锁,如果检测到系统已发生了死锁,再采取措施解除它。
实际上是通过一个检测机构,及时检测出死锁的发生,并且能够确定与死锁有关的一组进程和资源
对资源分配图进行化简,如果可以化简则不会产生死锁。
下图就可以化简,使三个进程P1P2P3完全独立。
银行家算法
银行家算法的思想就是要设法保证系统在动态分配资源后不进入不安全的状态,以避免可能产生的死锁。每当进程提出资源请求,系统的资源能够满足请求时,系统京判断如果满足此次请求,系统状态是否安全。
前提条件:要求进程提供最大资源请求数量,来判断是否超过了系统资源总量
死锁的解除:
- 通过撤销进程解除:中止所有进程,实现简单,但代价高。
- 通过抢占资源解除 :抢占足够多的资源来满足死锁进程的需要,进而解除死锁。
第四章 存储器管理
1、存储器层次结构
2、 程序的装入和链接:
逻辑地址:表示程序中各字节对应位置的编号,从0开始。又称程序地址或作业地址
物理地址:内存单元的编号,又称内存地址或绝对地址;在内存中是固定的
地址映射:将逻辑地址转换为物理地址。也叫地址转换
装入方式:
- 绝对装入:逻辑地址与实际地址相同,只能装入事先指定的位置,只适用于单道程序
- 可重定位装入:就是地址映射,不允许在内存中移动位置
- 动态运行时装入:在执行过程中或访问内存前,再执行地址映射。虚拟存储器必用
程序的链接:
- 静态链接方式:一次链接多次使用
- 装入时动态链接:边装入边链接,每次装入内存时进行链接。便于修改更新
- 运行时动态链接:不装入所有模块,发现缺少时再装入
3、连续分配方式
动态分区分配算法:
(1)首次适应算法: 要求空闲区按首址递增的次序组织空闲区表(队列)。 申请:取最小可满足区域; 优点:尽量使用小空闲区, 保持大空闲区。缺点:可能形成碎片
(2)最佳适应算法: 要求按空闲区大小从小到大的次序组成空闲区表(队列)。 申请:取最小可满足区域; 优点:尽量使用小空闲区, 保持大空闲区。缺点:可能形成碎片
(3)最坏适应算法:要求空闲区按大小递减的顺序组织空闲区表(或队列)。 申请:取最大可满足区域; 优点:防止形成碎片。缺点:分割大空闲区域。 效率最高
4、分页管理方式
基本原理:把用户程序的地址空间划分成若干大小相等的区域,每个区域称作页面或页。每个页都有一个编号,叫做页号。页号一般从0开始编号,如0,1,2,…等。
把内存空间划分成若干和页大小相同的物理块,这些物理块叫“帧”(frame)或内存块。同样,每个物理块也有一个编号,块号从0开始依次顺序排列。
目的:解决利用率低和碎片的问题。
包括分页管理,分段管理,段页式管理
地址转换:
逻辑空间地址A,页面大小L,页号P,页内地址D
物理地址=页框号(页号)×页面大小+页内偏移
页号=逻辑地址÷页面大小 (整数为页号,然后去找相对应的块号。余数为页内偏移
地址转换例题:
二进制 | 十进制 | 十六进制 |
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |