第一章 操作系统引论
操作系统的目标
- 方便性:操作系统使计算机更易于使用。
- 有效性:操作系统允许以更有效的方式使用计算机系统资源。
- 提高系统资源利用率
- 提高系统的吞吐量
- 可扩展性:在操作系统中,允许有效地开发、测试和引进新的系统功能。
- 开放性:实现应用程序的可移植性和互操作性,要求具有统一的开放的环境。
操作系统的主要功能
操作系统应具有五个方面的功能
-
处理机管理(CPU)
-
存储器管理
-
设备管理
-
文件管理
-
方便用户使用的用户接口——
-
为了让用户方便、快捷、可靠的操作计算机硬件并执行自己的程序,操作系统提供了用户接口
-
操作系统提供的接口分为两类:
命令接口和程序接口
-
命令接口
:用户可以直接
使用的,利用这些操作命令来组织和控制作业的执行 -
程序接口
:用户通过程序间接
使用的,编程人员可以使用它们来请求操作系统服务
-
-
第二章 进程调度
进程控制
进程的创建
当子进程被撤消时,应将其从父进程那里获得的资源归还给父进程。
在撤消父进程时,也必须同时撤消其所有的子进程。
调用进程创建原语Creat ( )按下述步骤创建一个新进程:
-
申请空白PCB。
-
为新进程分配资源。
-
初始化进程控制块。包括:
①初始化标识信息。
②初始化处理机状态信息。
③初始化处理机控制信息。
-
将新进程插入就绪队列。
进程的阻塞
引起进程阻塞的事件:
-
请求系统服务:提出I/O服务时,并不立即满足该进程的要求时,转变为阻塞状态来等待
-
启动某种操作:当进程启动某种操作后,在该操作完成之后才能继续执行。
-
新数据尚未到达:对于相互合作的进程而言。
-
无新工作可做。如发送进程。
进程同步
信号量机制
整型信号量
定义为一个整型量,仅能通过两个标准的原子操作wait(S)和signal (S)来访问。又称为P、V操作。
AND型信号量
AND同步机制的基本思想:将进程在整个运行过程中需要的所有资源,一次性全都地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源,也不分配给他。
信号量集
Swait(Sn,tn,dn)
Sn:空闲资源 tn:资源下限量(Sn >= tn 才分配) dn:需求量
应用
经典进程同步问题
生产者、消费者问题
生产者与消费者是一个广义的概念,可以代表一类具有相同属性的进程。
生产者和消费者进程共享一个大小固定的缓冲池。生产者生产数据,并将生产的数据存入缓冲池;消费者从缓冲池中取数据
mutex:使诸进程互斥地访问缓冲区(n个缓冲区)
empty、full:空、满缓冲区数量
哲学家进餐问题
读者、写者问题
读进程可共享同一对象
写进程不可共享同一对象
记录型信号量解决
信号量集解决
处理机调度
1.高级调度
-
调度对象:作业
-
又称作业调度、长程调度、接纳调度
-
实现:作业管理程序
-
将外存作业调入内存,创建PCB等,插入就绪队列。
-
主要用于批处理系统
2.中级调度
- 又称内存调度
- 对象︰挂起的进程
- 功能:把外存上那些已经具备运行条件的就绪进程重新载入内存。从静止就绪到活动就绪。
- 实现:内存管理中的对换进程
- 应用范围:具有对换功能的操作系统
3.低级调度
- 又称进程调度或短程调度
- 对象:就绪进程(或内核线程)
- 功能:决定就绪队列中的那个进程应获得处理机,并将处理机分配给选中的进程。
- 实现者∶分派程序(dispatcher)
- 应用范围:主要用于交互式系统
调度算法
-
先来先服务—FCFS
-
短作业优先—SJF
-
高响应比优先—HRRN
以上既可用于作业调度也可用于进程调度
-
时间片轮转—RR
-
分时系统的需求
每个进程仅运行一个时间片即被抢占CPU
-
轮转算法原理:
FCFS策略+时钟中断+时间片原则
-
进程切换时机
时间片内进程结束,进程结束事件激活进程调度,新进程可运行一个时间片。
时间片用完,时钟中断激活调度,旧进程到就绪队列尾,队头进程投入运行一个时间片。
-
-
优先级调度算法
- 抢占式
- 非抢占式
-
多级反馈队列调度算法
调度机制:
设置多个就绪队列,并为各个队列赋予不同的优先级。
优先级愈高的队列的进程的执行时间片就愈小。
新进程首先进入最高优先级的队列。每个队列采用FCFS算法。队列中的进程运行一个时间片后未结束则降级排到下一个队列的末尾。最低优先权队列中的进程则按轮转(RR)方式运行。
按队列优先级调度。只有比本队列的优先级高的队列均空时,才运行该队列中的进程。
未执行完时间片的进程被抢占后如何处理?
不降级,到队列末尾,且下一次运行时仍然是一个完整时间片(该队列对应的)
死锁
预防死锁
互斥条件
这是是必要条件,因为它是由硬件设备的固有属性所决定的,不仅不能改变,还应加以保证。
破坏“请求和保持”条件
·系统规定所有进程在开始运行之前,都必须一次性申请其在整个运行过程所需的全部资源。
但资源被严重浪费使进程延迟运行
摒弃“不可抢占”条件
当一个已经保持了某些资源的进程,再提出新的资源请求而不能立即得到满足时,必须释放它已经保持了的所有资源。待以后需要时再重新申请。从而摒弃了“不剥夺”条件。
缺点:
一个资源在使用一段时间后,它的被迫释放可能会造成前段工作的失效。
会使进程前后两次运行的信息不连续。
因反复地申请和释放资源,致使进程执行被无限推迟,延长进程周转时间、增加系统开销、降低吞吐量
摒弃“环路等待”条件
这种方法中规定,系统将所有资源按类型进行线性排队,并赋予不同的序号。所有进程对资源的请求必须严格按照资源序号递增的次序提出,这样,在所形成的资源分配图中,不可能再出现环路,因而摒弃了“环路等待”条件。
避免死锁
第三章 内存管理
程序的装入和链接
程序的链接
源程序经过编译后,可得到一组目标模块,再利用链接程序将这组目标模块链接形成装入模块。
根据链接时间的不同,可把链接分成如下三种
静态链接方式
在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块(又称执行模块),以后不再拆开
将每个模块中所用的外部调用符号也都变换为相对地址。例如将call B 变换为JSR “L”
装入时动态链接
装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存
有以下优点:
(1)便于修改和更新
(2)便于实现对目标模块的共享
运行时动态链接
这是指对某些目标模块的链接,是在程序执行中需要该目标模块时,由OS去找到该模块并将之装入内存并把它链接到调用者模块上
程序的装入
绝对装入方式
装入模块被装入内存后,由于程序中的逻辑地址与实际内存地址完全相同,故不需对程序和数据的地址进行修改
只适合单道程序环境
可重定位装入方式
目标模块的起始地址通常是从0开始的,程序中的其它地址也都是相对于起始地址计算的
把在装入时对目标程序中指令和数据的变换过程称为重定位。
因为地址变换是在装入时一次完成的,以后不再改变,故称为静态重定位
动态运行时装入方式
装入程序将目标模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址
而是把**这种地址转换推迟到程序执行时进行**,在硬件地址变换机构的支持下,随着对每条指令或数据的访问自动进行地址变换,故称为动态重定位。
连续分配方式
连续分配方式,是指为一个用户程序分配一个连续的内存空间
单一连续分配
仅适用于单用户,单任务的OS
把内存分为系统区和用户区两部分
固定分区分配
固定分区分配:将内存用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业
用户空间分为几个,就允许有几道作业并发运行
动态分区分配
分区分配中的数据结构
空闲分区表
每个空闲分区占有一个表目,表目中包括分区序号,分区始址以及分区大小等
空闲分区链
为了实现对空闲分区的分配和链接,设置前向指针和后向指针,通过前、后向链接指针将所有的空闲分区链接成一个双向链
分区分配算法
首次适应算法FF
从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止
- 为大作业分配大的内存空间创造了条件。
- 低址部分不断被划分,会留下许多难以利用的、很小的空闲分区。增加查找可用空闲分区的开销
循环首次适应算法
不从链首开始,从上次找到的空闲分区的下一个空闲分区开始查找,找到为止
能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销,但这样会缺乏大的空闲分区
最佳适应算法
最佳:
指每次为作业分配内存时,把满足要求又是最小的空闲分区分配给作业
- 为大作业分配大的内存空间创造了条件
- 每次分配后所切割下来的剩余部分总是最小的,在存储器中会留下许多难以利用的小空闲区
分区回收
当进程运行完毕释放内存时,需合并相邻的空闲分区,形成大的分区,称为合并技术
分页存储管理方式
分页存储管理原理:
将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框,在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。
地址结构
地址长度32位,0~11位为页内地址,即每页大小为4 KB,12~31位为页号,地址空间最多允许有1 M页
地址变换机构
该机构的基本任务是实现从逻辑地址到物理地址的转换
快表
为了提高地址变换速度,可在地址变换机构中,增设一个具有并行查寻能力的特殊高速缓冲寄存器
访问内存的有效时间
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需花费的总时间
分段存储管理方式
- 在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息
- 每个段都从0开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等
分段存储能满足以下需求:
- 方便编程:每个段都有段名
- 信息共享:在实现对程序和数据的共享时,是以信息的逻辑单位为基础的
- 信息保护
- 动态增长
- 动态链接:在作业运行之前,并不把几个目标程序段链接起来。当运行过程中需要调用段时,才将该段调入内存并进行链接
地址变换机构
每个段在表中占有一个表项,其中记录了该段在内存中的起始地址(又称为“基址”)和的长度
分页分段主要区别
分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址
分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
段页式存储方式
先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
虚拟存储器概述
基于局部性原理,应用程序在运行之前,没有必要全部装入内存,仅须将那些当前要运行的部分页面或段先装入内存便可运行,其余部分暂留在盘上
局部性原理
(1)时间局限性:
产生时间局限性的典型原因,是由于在程序中存在着大量的循环操作。
(2)空间局限性:
程序在一段时间内所访问的地址,可能集中在一定的范围之内,其典型情况便是程序的顺序执行、数组等
实现方法
请求分页系统
- 允许只装入部分页面的程序(及数据),便启动运行
- 通过调页功能及页面置换功能,陆续地把即将要运行的页面调入内存,同时把暂不运行的页面换出到外存上
硬件支持
页表机制
在此前的基础上要加上若干项。作为请求分页的数据结构
(1) 状态位P : 指示该页是否调入内存,供程序访问时参考。
(2) 访问字段A: 记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供选择换出页面时参考。
(3) 修改位M: 该页在调入内存后是否被修改过,供置换页面时参考,决定是否修改外存的该页面副本。
(4) 外存地址: 用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。
缺页中断机构
和一般中断有着两个明显的区别
(1)在指令执行期间产生和处理中断信号。
(2) 一条指令在执行期间,可能产生多次缺页中断。
地址变换机构
内存分配策略
固定分配局部置换
为每个进程分配一定数目的物理块,在整个运行期间都不再改变
发现缺页,则只能从该进程在内存的n个页面中选出一页换出,然后再调入一页,保证分配给进程的内存空间不变
为每个进程分配多少个物理块难以确定
可变分配全局置换
先为系统中的每个进程分配一定数目的物理块,而OS自身也保持一个空闲物理块队列
当某进程缺页时,由系统从空闲物理块队列中,取出一个物理块分配给该进程,并将欲调入的(缺)页装入其中。这样,凡产生缺页(中断)的进程,都将获得新的物理块。
可变分配局部置换
如果进程在运行中频繁地发生缺页中断,则系统须再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止
若一个进程在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数
页面置换算法
最佳(Optlmal)置换算法
最佳置换算法是所选择被淘汰的页面,将是以后永不使用的,或许是在最长时间内不再被访问的页面
最近最久未使用(LRU)置换算法
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。
Clock置换算法(NRU)
当采用简单clock算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。
当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,而给该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。
置换时是将未使用过的页面换出去,故又把该算法称为最近未用算法NRU(Not Recently Used)
改进型Clock置换算法
考虑置换代价。选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。
步骤:
(访问位A和修改位M)
(1)从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A。
(2)如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0.
(3)如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能栈到被湘汰的页
请求分段存储管理方式
共享段表
为了实现分段共享,可在系统中配置一张共享段表,所有各共享段都在共享段表中占有一表项
(1)共享进程计数count:记录有多少个进程需要共享该分段;
(2)存取控制字段:读、写等的控制;
(3)段号:不同的进程可以各用不同的段号去共享该段。
分段保护
在该机制中规定:
低编号的环具有高优先权。OS核心处于0环内;
某些重要的实用程序和操作系统服务,占居中间环;
一般的应用程序,则被安排在外环上,在环系统中,程序的访问和调用应遵循以下规则:
(1)一个程序可以访问驻留在相同环或较低特权环中的数据。
(2)一个程序可以调用驻留在相同环或较高特权环中的服务。
第四章 文件系统
文件的定义
文件是由创建者所定义的、具有文件名的一组相关元素的集合。
文件可分为有结构文件和无结构文件两种
无结构文件将数据按顺序组织成记录并积累保存,它是有序相关信息项的集合,以字节(Byte)为单位。但字符流的无结构文件管理简单,用户可以方便地对其进行操作。所以,那些对基本信息单位操作不多的文件较适于采用字符流的无结构方式,如源程序文件、目标代码文件等。
文件的物理结构
存储空间的管理
连续分配
把逻辑文件中的数据顺序地存储到物理上邻接的各个数据块中,这样形成的物理文件可以进行顺序存取
文件目录中为每个文件建立一个表项,其中记载文件的第一个数据块地址及文件长度
链接分配
通过在每个盘块上的链接指针,将同属于一个文件的多个离散的盘块链接成一个链表
隐式链接
在文件目录的每个目录项中,都须含有指向链接文件第一个盘块和最后一个盘块的指针。每个盘块中都含有一个指向下一个盘块的指针
显式链接
这是指把用于链接文件各物理块的指针,显式地存放在内存的一张链接表中整个磁盘仅设置一张文件分配表(FAT)
链接分配方式虽然解决了连续分配方式所存在的问题,但又出现了另外两个问题:
(1)不能支持高效的直接存取。要对一个较大的文件进行直接存取,须首先在FAT中顺序地查找许多盘块号。
(2)FAT需占用较大的内存空间。由于一个文件所占用盘块的盘块号是随机地分布在FAT中的,因而只有将整个FAT 调入内存,才能保证在FAT中找到一个文件的所有盘块号。
索引分配
为每个文件分配一个索引块(表),再把分配给该文件的所有盘块号都记录在该索引块中,因而该索引块本身就是一个含有许多盘块号的数组
在建立一个文件时,只需在为之建立的目录项中填上指向该索引块的指针
两级索引分配
当文件较大时,单级索引分配的一级索引块太多,索引效率较低
文件存储空间的管理
除了空闲分区表和空闲链表法外,还有位示图法
利用二进制位0、1表示存储空间中存储块的使用状态。——空闲分区:0,已分配分区:1(或者相反)
文件目录
文件目录管理
对目录管理的要求如下:
- “按名存取”
- 提高对目录的检索速度。
- 文件共享。
- 允许文件重名。
文件控制块(FCB):
用于描述和控制文件的数据结构
- 基本信息: 文件名、文件类型等;
- 地址信息: 卷(存储文件的设备)、起始地址(起始物理地址)、文件长度(以字节、字或块为单位)等。
- 访问控制信息: 文件所有者、访问信息(用户名和口令等)、合法操作等;
- 使用信息: 创建时间、创建者身份、当前状态、最近修改时间、最近访问时间等。
文件的索引节点
文件被打开使用时,将文件的i节点从磁盘调入内存。内存i节点除了包含磁盘i节点的所有内容外,还包含文件当前的状态信息:是否上锁、修改标志、访问计数等。
文件使用完毕后,将该文件在内存中的i节点写回到磁盘上保存。
目录的结构
**文件目录:**文件控制块的有序集合
目录项的两种组织方式:
FCB存储全部目录内容
存储部分目录信息,如文件名、索引节点指针等,其余部分保存在索引节点(i节点)。打开文件时将索引节点从磁盘读到内存中。
文件共享和访问控制
文件共享的控制
允许多个用户同时读文件内容,但不允许同时修改,或同时读且修改文件内容
文件共享的实现
实现文件共享的实质就是可以从不同地方打开同一个文件
打开文件的首要步骤就是找到文件的目录项,读取文件在外存的起始地址
链接目录项实现文件共享
文件目录项中设置一个链接指针,用于指向被共享文件的目录项
访问文件时,根据链接指针内容找到共享文件的目录项,读取该目录项中文件起始位置等信息,操作该文件
链接索引节点实现文件共享(硬链接、普通链接)
文件的物理地址及其它的文件属性等信息,不再是放在目录项中,而是放在索引结点中。在文件目录项中只设置文件名及指向相应索引结点的指针
由任何用户在不同目录下对文件进行任何操作或修改,所引起的相应结点内容的改变,其他用户在不同目录项都是可见的
链接文件名实现文件共享(软链接、符号链接)
为使B能共享C的一个文件F,可以由系统创建一个LINK类型的新文件,也取名为F并将F写入B的目录中,以实现B的目录与文件F的链接;在新文件中只包含被创文件F的路径名(字符串)。这样的链接方法被称为符号链接.
文件主才拥有指向其索引结点的指针,而共享该文件的其它用户,则只有该文件的路径名,并不拥有指向其索引结点的指针
第五章 设备管理
I/O 系统
IO系统的基本功能
1)设备分配
2)设备映射
3)设备驱动
4)I/〇缓冲区的管理
中断处理程序
设备驱动程序
使用轮询的可编程I/O方式
处理机向控制器发出一条I/O指令启动输入设备输入数据时,同时把busy置为1,并不断循环测试busy
使用中断的可编程I/O方式
引入中断机制。由于I/O设备速度很慢,因此在CPU发出读/写命令后,可将等待I/O的进程阻塞,先切换到别的进程执行。当I/O完成后,控制器会向CPU发出一个中断信号,CPU检测到中断信号后,会保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。处理中断的过程中,CPU从I/O控制器读一个字的数据传送到CPU寄存器,再写入主存。接着,CPU恢复等待I/O的进程(或其他进程)的运行环境,然后继续执行。
直接存储器访问方式(DMA方式)
- 数据传输的基本单位是数据块,即在CPU与I/O设备之间,每次传送至少一个数据块;
- 所传送的数据是从设备直接送入内存的,或者相反;
- 仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在设备控制器的控制下完成的。
IO通道控制方式
I/O通道方式是DMA方式的发展,它可进一步减少CPU的干预减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。
磁盘系统与磁盘调度
磁盘的访问时间
寻道时间Ts:
这是指把磁臂(磁头)移动到指定磁道上所经历的时间
T
s
=
m
∗
n
+
s
T_s = m * n + s
Ts=m∗n+s
s:启动磁臂的时间
n:磁头移动n条磁道
m:移动每一条磁道所花费的时间
旋转延迟时间Tτ
这是指定扇区移动到磁头下面所经历的时间
软盘旋转速度为300 r/min或600 r/min,这样,平均Tτ为50~100 ms。 (60 / 300 = 0.2 但平均时间为T/2就为100ms)
硬盘旋转速度为15 000 r/min,每转需时4 ms,平均旋转延迟时间Tτ为2 ms;
传输时间Tt
指把数据从磁盘读出或向磁盘写入数据所经历的时间
就是一转的时间乘以字节所占比例
磁盘调度
先来先服务FCFS
最短寻道时间优先SSTF
其要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但却可能导致某个进程发生“饥饿”现象。
扫描(SCAN)算法 (电梯调度算法)
SCAN算法优先考虑的是磁头当前的移动方向。例如磁头自里向外移动,并同时自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向自外向里移动。
循环扫描(CSCAN)算法
CSCAN算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。
线程
线程的基本概念
进程的引入
实现单处理机环境下多程序并发的功能。
线程的引入
提高多处理机环境下程序的并发程度
线程的状态
多线程操作系统中的进程
1、作为系统资源分配的单位
进程为线程提供资源和运行环境,线程只能在进程的环境下运行。
2、可包括多个线程
所有的线程都只能属于某一个特定进程3、进程不是一个可执行的实体
进程中的线程才是可执行的实体。此时进程的“运行”态实际上是指进程中的某个线程正在运行。