第一章 计算机系统概述
1.1 OS基本概念
·操作系统Opearting System:
控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合,是计算机系统中最基本的软件
·OS的特征:并发、共享、虚拟和异步
并发:通过分时使计算机系统中同时运行多个程序(需要相关硬件的支持)
共享:资源共享,分为互斥共享(临界资源)和同时访问方式(磁盘)
虚拟:虚拟处理器/内存/外部设备,从逻辑上扩充存储器的容量,时分复用技术
异步:程序的执行以不可预知的速度相亲推进
·OS的目标和功能
1、计算机系统资源的管理者:处理机/存储器/设备/文件管理
(1)在多道程序环境下,对进程(线程)的管理(处理机分配和运行)
进程的创建、撤销、冲突避免、同步、通信、死锁处理、处理机调度
(2)内存的分配与回收、地址映射、内存保护与共享、内存扩充
(3)文件存储空间/目录/文件读写的管理(文件系统)
(4)缓冲管理、设备分配、设备处理、虚拟设备(IO)
2、作为计算机用户与计算机硬件系统之间的接口
(1)命令接口:用户利用这些操作命令来组织和控制作业的执行
方式:联机/交互式:适用于分时或实时系统
脱机/批处理:适用于批处理系统,用户不能直接干预作业运行
(2)程序接口:编程人员使用来请求系统服务
由一组系统调用(广义指令)组成(
系统调用:为应用程序使用内核功能所提供的接口,只能通过用户程序简间接使用
GUI用户图形界面(图形接口):通过调用程序接口实现,用户通过鼠标键盘在图形界面上进行操作来与计算机交互
3、对计算机资源的扩充
裸机:没有任何软件支撑的计算机
虚拟机/扩充机器:覆盖了软件的机器

·多道程序:失去了程序的封闭性与顺序性,具有制约性、间断性、共享性
·单处理机中,可并行的有:处理机与设备、处理机与通道、设备与设备(进程和进程只能并发)
·计算机开机后,操作系统最终被加载到RAM中(内存中的系统区)
·库函数与系统调用的区别:
(1)库函数属于语言或程序应用;系统调用属于操作系统
(2)库函数常使用系统调用来实现功能

1.2 OS发展历程
1、手工操作
2、批处理
(1)单道:内存中始终保持一道作业;自动性、顺序性、单道性
(2)多道:允许多道程序进入内存并在CPU中交替运行,共享资源
3、分时操作系统(交互)
分时技术:将处理机的运行时间划分为很短的时间片,轮流分配给每道作业(时间片轮转)
多用户通过终端同时共享一台主机,实现人机交互;同时性/多路性、交互性、独立性、及时性
4、实时操作系统(时效)
为了能在一个时间限制范围内完成某些任务,分为软实时和硬实时;及时性和可靠性
5、(1)网络操作系统(集中控制)
实现各台计算机之间数据的互相传送;资源共享和计算机通信
(2)分布式计算机系统
分布性和并行性,与网络计算机系统的区别:分布式是若干计算机相互协同完成同一工作
6、个人计算机操作系统(最广泛)

·对操作系统的优先级+非抢占式调度算法进行改进能改善分时系统的响应时间
·中断技术使得多道批处理系统的IO设备可与CPU并行工作
·与单道相比多道的优势:CPU利用率高、系统吞吐量大、IO设备利用率高
·多任务操作系统:可在同一时间内运行多个应用程序,具有并发和并行的特点

1.3 OS运行环境
·操作系统内核程序(能执行特权指令);用户自编程序(不能)
·特权指令:
是指仅供内核程序使用的指令,如修改程序状态字、开关中断、修改地址映射寄存器、启动I/O指令、清空内存、设置时钟、 停机等。
特权指令只允许操作系统使用,不允许一般用户使用。写指令寄存器不属于特权指令
·非特权指令:用户直接使用,不能直接访问系统中的软硬件资源,仅限于访问用户地址空间,为了防止用户程序对系统造成破坏
·CPU运行模式:用户态(目态)、核心态(管态、内核态)
·现代操作系统的分层式结构:按与软硬件的关联程度将各项功能置于不同的层次
最低层:时钟管理、中断处理、设备驱动
较上层:进程管理、存储器管理、设备管理
·内核
1、时钟管理:计时;实现进程切换;控制作业运行时间
2、中断机制:鼠标键盘的输入、进程管理调度、系统功能调用、设备驱动、文件访问
属于内核的功能:保护和恢复中断现场的信息,转移控制权
3、原语:处于最底层(最靠近硬件)可被公共调用的公用小程序
特点:原子性、运行时间短调用频繁、不可分割性
例,设备驱动、CPU切换、进程通信的部分功能
4、系统控制的数据结构及处理
用于登记状态的数据结构:作业/进程/设备控制块、链表、队列、缓冲区、空闲区、内存分配表

·中断和异常(计算机组成原理更为详细)
通过硬件实现用户态与核心态之间的切换
中断分为:内部异常(内中断,来自CPU,不能屏蔽)和外部中断(外中断,来自外部事件)
异常:故障Fault、自陷Trap、终止Abort(前两个是软件中断,后一个是硬件中断)
中断:可屏蔽中断INTR(通过改变屏蔽字实现多重中断)、不可屏蔽中断NMI

·系统调用(操作系统向用户程序提供的接口)
(1)分类:设备管理、文件管理、进程控制、进程通信、内存管理
(2)过程:传递系统调用参数,用户使用陷入指令(访管指令/trap指令)发起系统调用,请求操作系统服务,CPU从用户态切换为核心态(由硬件完成可能涉及堆栈的切换 ), 操作系统执行响应服务程序,返回用户态
(3)目的:用户程序不能直接执行涉及系统资源管理之类的操作,防止用户程序随意更改或访问重要的系统资源
(4)用户态转为核心态的例子:
系统调用、一次中断、用户程序错误状态、用户程序企图执行特权指令、
从核心态转为用户态(特权指令,一般为中断返回指令)

·发生中断后,进入中断处理的程序属于操作系统程序
·中断处理会保存而调用子程序不需要的是:程序状态字寄存器
·外部中断处理中:
中断隐指令(硬件):PC的值(中断点)
操作系统:保存通用寄存器中的内容、提供中断服务、初始化中断向量表、保存中断屏蔽字、PSW
·通道:一种控制一台或多台外部设备的硬件机构

1.4 OS系统结构
1、分层法:0层硬件,N层用户接口;单向调用低一层的功能和服务;结构清晰,便于调试
2、模块化:将OS按功能划分模块;要求高内聚,低耦合
3、宏内核/单内核/大内核
系统的主要功能模块作为整体运行在核心态,各管理模块共享信息,有性能优势
4、微内核
将一些非核心的功能(如,文件服务系统)移到用户空间,便于扩展系统;
将OS划分为微内核和多个服务器,只有微内核运行在核心态,服务器间的通信借助于微内核
基本功能:进程/线程管理、低级存储器管理、中断和陷入处理
特点:扩展性和灵活性、可靠性和安全性、可移植性、分布式计算;
足够小的内核、基于B/S模式、应用机制与策略分离原理、采用面向对象技术
主要问题:系统不够高效
5、外核:对机器进行分区;减少了映射层

1.5 OS引导
操作系统是一种程序,以数据的形式存放在硬盘中
引导过程:
(1)激活CPU:激活的CPU读取ROM中的boot程序,将指令寄存器置为BIOS(基本输入/输出系统)的第一条指令,开始执行
(BIOS指令:在内存最开始的空间构建中断向量表及对应的服务程序)
(2)硬件自检POST(power-on-self test)
(3)加载带有操作系统的硬盘
BIOS开始读取BootSequence,把控制器交给启动顺序排在第一位的存储设备,然后CPU将该存储设备引导扇区的内容加载到内存中
(4)加载主引导记录MBR:硬盘根据特定标识符区分
(MBR的作用是告诉CPU去硬盘哪个分区去找操作系统)
(5)扫描硬盘分区表,并加载硬盘活动分区
(6)加载分区引导记录PBR
(7)加载启动管理器
(8)加载操作系统(内核部分,其余仅在用时调入)
CPU、硬件、硬盘、主引导记录、分区表、分区引导、管理器、操作系统

1.6虚拟机
两种虚拟化方法
(1)在裸机上运行并且具备多道程序功能,运行在虚拟内核态
(2)在宿主操作系统上建立,如VMware Workstation

第二章 进程与线程

2.1进程与线程
·是系统进行资源分配和调度(引入线程后,变为线程)的单位
·实体进程/进程映像=程序段+相关数据段+PCB
·特征:动态性、并发性、独立性、异步性
·状态与转换:运行态、就绪态、阻塞态、创建态、结束态

·进程控制块PCB(process control block)
描述进程的基本情况和运行状态,创建后常驻内存,是进程存在的唯一标志
包含:进程描述信息(唯一标识符)、进程控制和管理信息(如,优先级、状态)、资源分配清单(指针,设备)、处理机相关信息(寄存器、状态字)

·进程控制(称为原语,不可分割)
1、创建:分配唯一标识符、申请空白PCB、分配资源、初始化PCB、插入就绪队列
2、终止:(1)正常结束(2)异常结束:存储区越界、保护错、非法指令、特权指令、运行超时、算术运算错、IO故障(3)外界干预:操作员、操作系统、父进程干预
过程:根据标识符找到PCB读取状态、终止进程执行归还CPU资源、终止子进程、归还所有资源、在链表中删除该PCB
3、阻塞和唤醒
阻塞原语:找到对应PCB,若进程在运行态保护现场,状态转为阻塞态,PCB插入等待队列
唤醒原语:找,移出等待队列状态设置为就绪态,PCB插入就绪队列,等待调度

·进程间通信
低级通信方式:PV操作
高级通信方式:
1、共享存储
需要使用同步互斥工具(如PV操作)
低级共享:基于数据结构;高级共享:基于存储区
进程内的线程是自然共享进程空间的
2、消息传递
进程通过系统提供的发送消息和接收消息两个原语进行交换,隐藏了通信实现细节
微内核与服务器间使用,支持多处理机系统、分布式系统和计算机网络
直接通信:发送进程直接把消息发给接收进程,挂在其消息缓冲队列上;
间接通信:发送进程将消息发至“信箱”
3、管道通信
管道实质上是一种固定大小的缓冲区,对于两端的进程而言是一个文件,只存在于内存中
类似于半双工通信机制,一个管道可以实现双向的数据传输,但同一时刻只能最多有一个方向的传输,不能两个方向同时进行;若要互动通信需设置两个管道
管道的大小通常为一页,不受磁盘大小的限制
当管道满时,写进程会被阻塞;空时,读进程被阻塞
读数据是一次性操作,拿走就释放空间

补充通信方式:文件映射、套接字

·线程
1、引入目的:进程目的:更好地使多道程序并发执行,提高资源利用率和系统吞吐量
线程的目的:减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能
线程=“轻量级的进程”,是系统独立调度和分派的最小单元;线程不拥有系统资源,只拥有运行所必须的资源;同一进程中的多个线程之间可以并发执行,共享进程的地址空间和资源
2、线程的状态:执行、就绪、阻塞
3、组织与控制
(1)线程控制块TCB
通常包括:线程标识符、一组寄存器(程序计数器、状态寄存器、通用寄存器)、线程运行状态、优先级、线程专有存储区(切换时保护现场)、堆栈指针(过程调用时保存全局变量和返回地址)
(2)通常线程被终止后并不立即释放它占有的资源,只有当进程中其他线程所用分离函数后被终止线程才与资源分离,释放资源供其他线程使用;被终止但尚未释放资源的线程仍可被其他线程调用,这样会使被终止的线程重新恢复运行
4、实现
线程分为用户级线程和内核级线程
(1)用户级线程ULT:内核意识不到线程的存在,调度仍以进程为单位
优点:线程切换不需要切换到内核空间;调度算法可为进程专有;实现与操作与系统无关
缺点:当进程中的一个线程被阻塞则整个进程被阻塞;不能发挥多处理机的优势,进程中仅有一个线程在运行
(2)内核级线程KLT:在内核的支持下运行,内核为每一个线程设置一个TCB来管理线程
优点:发挥多处理机优势;进程中的一个线程被阻塞不会影响其他线程;有内核支持,线程可拥有很小的数据结构和堆栈,切换较快;
缺点:线程切换需从用户态转为核心态,系统开销大;
(3)组合方式
一些内核级线程对应多个用户级线程(用户级线程通过时分多路复用内核级线程实现)
5、多线程模块(用户线程和内核线程的映射关系)
(1)多对一:多个用户级线程映射一个内核级线程
优点:线程管理在用户空间进行,效率较高
缺点:一个阻塞全部阻塞
(2)一对一:优点:并发能力强;缺点:开销大
(3)多对多:(克服缺点,综合优点)

·进程与程序
(1)进程需要获取资源(CPU、内存);程序只占用磁盘空间
(2)程序是静态的指令集合,是进程的核心内容
(3)进程是程序的动态执行过程,是程序执行的载体

·线程包含CPU现场,可以独立执行程序
·并发进程失去封闭性:并发进程共享变量,其执行结果与速度有关
·若一个进程实体由PCB、共享正文段、数据堆段、数据栈段组成,相关数据结构位于:
正文段:二进制代码、常量
数据堆段:动态分配的存储区
数据栈段:临时变量(实参传参,未赋值局部变量)
·使用多线程来处理键盘的输入无法发挥多线程优势(键盘输入慢)
·两个合作进程无法使用高级语言程序设计中的局部变量来交换数据(因为全局变量是对于某一个进行而言的,不同进程之间不能共享)
·用户级线程可以在任何操作系统中运行
·导致创建新进程的操作:用户登录成功、启动程序执行(设备分配不会创建进程,这由OS来考虑
·父进程与子进程
可以并发执行、拥有各自的虚拟地址空间(不共享)、有不同的PCB、不能同时使用同一临界资源

2.2处理机调度
·三级调度
(1)作业调度(高级调度)
内存与辅存之间的调度;多道批处理系统中通常有该调度,其他系统不需要
(2)内存调度(中级调度)
存储区管理中的对换功能
目的:提高内存的利用率和系统吞吐量(将暂时不能运行的进程调至外存等待)
(3)进程调度(低级调度)
按照某种算法,从就绪队列中选取一个进程,将处理机分配给它
最基本的调度,所有类型的系统必备;频率高
·联系:作业调度从外存的后备队列中选出一批作业进入内存,送入就绪队列
进程调度从就绪队列中选出一个进程,变为运行态,把CPU给它
中级调度是为了提高内存利用率,系统将那些暂时不用的进程挂起
·调度目标
(1)CPU利用率=CPU有效工作时间/(CPU有效工作时间+CPU空闲等待时间)
(2)系统吞吐量:单位时间内CPU完成作业的数量
(3)周转时间:作业从提交到完成所花费时间到总和
平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n
带权周转时间=作业周转时间/作业实际运行时间(应<=1)
平均带权周转时间=(作业1的带权周转时间+…+作业n的带权周转时间)/n
·调度的实现
(1)调度程序(调度器)=排队器+分派器+上下文切换器
(2)时机、切换与过程
不能进行切换的时机:处理中断时;进程在os内核临界区;进行原子操作过程中
应进行切换:当前进程无法继续运行;中断处理结束或自陷处理结束后
过程:os内核将原进程的现场信息推入当前进程的内核堆栈进行保存,更新堆栈指针;从新进程的内核栈中装入新进程的现场信息,更新当前运行进程空间指针、重设PC寄存器等,开始运行新进程
·进程调度方式:非抢占调度/抢占调度方式
·闲逛进程
当系统中没有就绪进程时调度闲逛进程,执行过程中测试中断,优先级最低,不需要CPU意外事件等资源,不会被阻塞
·内核级线程会被单独赋予一个时间片,用户级线程内核无法感知,选择进程给予时间片
用户级线程的切换在同一进程中进行,仅使用少量的机器指令;内核级线程的切换要完整上下文切换,修改内存映像、使高速缓存失效

·典型调度算法
1、先来先服务FCFS
效率低,对长作业有利;有利于CPU繁忙型作业,不利于IO繁忙型作业
2、短作业优先SJF
对长作业不利(可能导致饥饿现象);未完全考虑作业的紧迫程度;
平均等待时间、平均周转时间最少
(注意)饥饿!=死锁,饥饿是调度策略问题,死锁是环形等待
3、优先级调度算法
可用于作业调度和进程调度,分为非抢占/抢占式;或分为静态优先级/动态优先级
一般:系统进程>用户进程;交互型进程>非交互;IO进程>计算型
4、高响应比优先调度
主要用于作业调度,计算作业队列中每个作业的响应比,选出最高的的作业运行
响应比=(等待时间+要求服务时间)/要求服务时间
5、时间片轮转法
主要适用于分时系统;时间片大小的选取对系统性能影响大,通常由:
系统的响应时间、就绪队列中进程数目和系统处理能力来决定
6、多级队列调度算法
设置多个就绪队列,每个队列可使用不同的调度算法
7、多级反馈队列调度算法
动态调整进程优先级和时间片大小
实现:(1)设置多个就绪队列(2)各个队列时间片不同(3)每个队列都采用FCFS
(4)按队列优先级调度

·进程切换(在内核支持下)
上下文切换:保存当前进程状态(在其PCB中)并恢复另一个进程状态
上下文:某一时刻CPU寄存器和程序计数器的内容
·模式切换:内核态和用户态之间的切换
·时间片轮转调度算法是绝对可抢占的
·以输入、输出为主的作业优先级应高于以计算为主的作业

2.3同步与互斥
·临界资源:一次只能为一个进程所用的资源(如打印机、变量、数据),必须互斥的进行访问
·临界区:访问临界资源的那段代码
·同步:直接制约关系(相互合作)
·互斥:间接制约关系
·遵循准则:空闲让进、忙则等待、有限等待、有权等待

·实现临界区互斥的方法
1、软件实现
(1)单标志法:用于指示被允许进入临界区的进程编号,两进程必须交替进入(有死循环)
(2)双标志法先检查:设置数据flag[i],先检查是否有进程在临界区,若无,则修改自身对应标志
(可能会有两个进程同时进入临界区
(3)双标志法后检查:先设置自己的标志true,再检查对方的标志(可能导致饥饿现象)
(4)Peterson‘s Algorithm
在双标志法的基础上再设置变量turn,每个进程先设置自己的标志后再设置turn;同时检查另一个进程的状态标志和允许进入标志(不能实现让权等待)
算法如下:
Pi进程: Pj进程:
flag[i]=TRUE; turn=j; flag[j]=TRUE;
while(flag[j]&&turn==j); while(flag[i]);
critical section//临界区访问 critical section;
flag[i]=FALSE; flag[j]=FALSE;

2、硬件实现(低级方法、元方法)
(1)中断屏蔽法:关中断
执行效率低;将关中断的权利交由用户不安全
(2)硬件指令方法
TestAndSet指令:原子操作,读出指定标志后将其设置为真(可为每个临界资源设置一个共享布尔变量lock
Swap指令:交换两个字/字节的内容
硬件实现优点:任一数目进程,单/多处理机通用,简单易验证准确,支持多临界区,一个临界区一个布尔变量;
缺点:不能实现让权等待,可能导致饥饿现象

·互斥锁mutex lock:通常采用硬件机制实现
缺点:忙等待(循环调用),浪费CPU资源(通常运用于多处理器系统)
·信号量:只能被两个标准原语P、V(wait、signal)访问
1、整形信号量:用于表示资源数目(存在忙等)
2、记录型信号量:增加进程链表L,链接所有等待该资源多进程(不存在忙等,实现让权等待)
3、利用信号量实现同步:S初值为0,一对PV分别位于两个需要协同工作的进程中
4、利用信号量实现互斥:S初值为1,每个进程各自有一对PV,中间夹击临界资源
5、利用信号量实现前驱关系

·管程
1、定义了共享数据结构的各种进程在该数据结构上的全部操作
组成:(1)名称(2)局部于管程内部的共享数据结构说明
(3)对该数据结构进行操作的一组过程(或函数)
(4)对局部于管程内部的共享数据设置初始值的语句
(1)管程把对共享资源的操作封装起来(2)每次只允许一个进程进入管程,实现互斥
(3)是进程同步工具,解决信号量机制大量同步操作分散的问题
(4)管程是被进程调用的,是语法范围,无法创建和撤销
2、条件变量wait/signal
x.wait:当对x条件不满足时,正在调用管程的进程调用x.wait将自己插入x条件的等待队列,并释放管程给其他进程调用
x.signal:x对应的条件发生了变化,调用x.signal,唤醒一个因x条件而阻塞的进程
(注意)于P/V操作的异同
相似点:都可以实现进程的阻塞和唤醒
不同点:条件变量是没有值的,仅实现排队等待的功能;信号量是有值的,反映剩余资源数量

·经典同步问题(信号量:semaphore)
1、生产者-消费者问题
mutex=1 //临界区互斥信号
empty=n //记录缓冲区中空闲缓冲区(初始为n)
full=0 //记录缓冲区中,满缓冲区数量,初始为空
2、读者-写者问题(读进程优先)
count=0 //记录当前读者数量
mutex=1 //保护count变量(对count变量的互斥访问)
rw=1 //互斥信号量,保证读者写者的互斥访问
3、哲学家进餐问题
chopstick[5]={1,1,1,1,1} //信号量数组,并初始化
mutex=1 //取筷子信号量(当左右筷子都可用时)
4、吸烟者问题
假设一个系统中有三个抽烟者进程和一个供应者进程,每个抽烟者不停地卷烟并抽烟;要卷起并抽掉一根烟,抽烟者需要三种材料:烟草、纸、胶水;抽烟者分别拥有三种材料,供应者每次将任意两种材料放在桌上,拥有剩下材料的抽烟者卷并抽,抽完给供应者信号,供应者再将另外两种材料放在桌上,循环重复
num=0 //存储随机数
offer1=0 //定义信号量对应烟草和纸组合的资源
offer2=0 //……烟草和胶水
offer3=0 //……纸和胶水
finish=0 //表示抽烟是否完成(互斥进行抽烟动作)

·用V操作唤醒一个等待进程时,被唤醒进程变为就绪态
·用信号量机制(PV操作)实现
互斥时:信号量初值为1
同步时:信号量初值由用户决定
【同步互斥大题】
1、信号量的设置semaphore
互斥信号量mutex(初值为1)
empty/full:表示空位数量/已占位数

·PV操作可以用于实现进程的同步和互斥,但不能用于防止进程的死锁

2.4死锁
1、定义:若干进程因竞争资源而无限等待其他进程释放已占有资源
2、产生原因:系统资源的竞争;进程推进顺序非法;信号量使用不当
3、必要条件(破坏其一,则不能构成死锁)
(1)互斥条件:互斥使用资源
(2)不剥夺条件:资源只能由进程主动释放
(3)请求并保持:进程保持至少一个资源,又提出新的请求,而新请求资源已经被其他进程占有
(4)循环等待:存在进程资源循环等待链(环)(要求Pi等待的资源必须由Pi+1满足)
(若系统中每类资源都只有一个,则资源分配图含圈则成为死锁的充分必要条件
4、处理策略
(1)死锁预防(破坏必要条件)
·破坏互斥:不可行
·破坏不剥夺:不太行,会导致前一段工作的失效,反复释放申请资源会增大系统开销;
通常用于状态易于保存和恢复的资源
·破坏请求并保持:进程在运行前一次申请完所有需要的资源
实现简单;系统资源使用不充分造成资源浪费,甚至导致饥饿现象
·破坏循环等待:顺序资源分配法(给系统中的资源编号,进程只能按序申请资源)
限制了新类型设备的增加、依旧存在作业使用资源顺序与规定顺序不同、编程麻烦
(2)避免死锁
在资源动态分配的过程中,防止系统进入不安全状态
·系统安全状态:系统能按某个进程推进顺序完成所有的进程,该顺序为一个安全序列;若不存在安全序列,则称系统处于不安全状态
(注意)安全状态:可避免产生死锁;不安全状态:可能产生死锁

·银行家算法
1、相关数据结构
(1)可利用资源向量Available:Available[j]=K,系统中有Rj类资源K个
(2)最大需求矩阵Max:Max[i,j]=K,进程i需要Rj类资源的最大数目为K个
(3)分配矩阵Allocation:Allocation[i,j]=K,进程i当前已分配得到Rj类资源K个
(4)需求矩阵Need:Need=Max-Allocation,Need[i,j]=K,进程i还需Rj类资源K个
(5)工作向量Work:表示系统中剩余可用资源数目,初始为Available
2、算法描述
(1)Pi进程向系统发出资源申请:Request(i)[j]=K,进程Pi需要Rj类资源K个
(2)系统检测申请
Requset>Need或Request>Available时拒绝请求(申请资源数超出声明最大值/系统资源不足)
(3)尝试将资源分配给Pi
(4)执行安全性算法
若能找到一个安全序列,则分配资源;反之不分配
3、解题
———————————————————
资源情况|Allocation |Max |Need
进程 |R1 R2 R3 |R1R2R3 |R1R2R3
———————————————————
P0 | | |
———————————————————
P1 | | |

(3)死锁的检测和解除
·资源分配图
圆圈:进程;矩形:一类资源;矩形中小圆圈数:该类资源数目
请求边:从进程到资源的有向边
分配边:从资源到进程
·死锁定理:当且仅当S状态的资源分配图是不可完全简化的时为死锁状态
·死锁检测方法:资源有向图;资源矩阵
·死锁解除:
资源剥夺:挂起某些死锁进程,剥夺其资源后分配
撤销进程:强制撤销部分甚至全部死锁进程并剥夺资源(按进程优先级和撤销代价排序)
进程回退:让一个或多个进程回退到足以回避死锁的地步,回退时进程自愿释放资源
(要求系统保持进程信息,设置还原点)

第三章 内存管理

3.1概念

·内存管理主要功能:
(1)内存空间的分配与回收(2)地址转换(3)内存空间的扩充(逻辑上)
(4)内存共享(5)存储保护

·程序的链接与装入
将用户程序变为可在内存中运行的程序分为三步:编译、链接、装入
1、编译:由编译程序将用户源代码编译(高级语言—>低级语言)成若干目标模块(*.o)
2、链接:由链接程序将编译后形成的一组目标模块及他们所需的库函数链接在一起,形成一个完整的装入模块
·程序的链接方式:
(1)静态链接:程序运行前,将歌目标模块及所需库函数链接成一个完整的装配模块
需要:修改相对地址;变换外部调用符号
(2)装入时动态链接:边装入内存时边链接;便于修改和更新,便于实现对目标模块的共享
(3)运行时动态链接:在程序执行时对需要的模块进行链接,未用到的模块不装入内存
能加快程序的装入过程,节省大量的内存空间

3、装入:由装入程序将装入模块装入内存运行
·装入内存的方式:
(1)绝对装入:只适用于单道程序,逻辑地址与物理地址相同
(2)可重定位装入(静态重定位):
多道程序下,根据内存情况,将模块装入内存的适当位置;
重定位:在装入时对目标程序中指令和数据地址的修改过程;
早期多道批处理系统使用
(3)动态运行时装入(动态重定位):
将地址转换推迟到程序真正运行时
需要一个重定位寄存器支持
优点:可将程序分配到不连续的存储区;在程序运行前可以只装入部分代码即可运行;需要动态申请分配内存;便于程序段的共享

·逻辑地址与物理地址
·目标模块从零单元开始编址,称为目标模块的相对地址(即逻辑地址)
·不同进程可以有相同的逻辑地址,相同的逻辑地址可以映射到主存到不同位置

·地址重定位:(当装入程序将可执行代码装入内存时)将逻辑地址转化物理地址
OS中通过MMU(内存管理部件)

·进程的内存映像
(1)代码段:只读,可被多个进程共享
(2)数据段:包括全局变量和静态变量
(3)进程控制块PCB:存放在系统区
(4)堆:存放动态分配的变量(通过调用malloc动态的向高地址分配空间)
(5)栈:实现函数调用(从用户空间的最大地址往低地址增长)
(注意)代码段和数据段在程序调入内存时就指定了大小;堆、栈在运行时会动态的扩展和收缩
·内存中一个进程映像示意图
——————————0xFFFF FFFF
操作系统内核区
——————————0xC000 0000
用户栈(运行时创建)
—————————— <—esp栈指针
(供上下两区的增长空间)
——————————
共享库的存储映射区
——————————0x4000 0000
(供堆增长)
——————————
动态生成的堆(运行时由malloc创建)
——————————
读/写数据段(.data.bss)
——————————
只读代码段(.init.text.rodata)
——————————0x0840 8000
(未使用区)
——————————0

·内存保护
确保每一个进程有一个单独的内存空间,不受其他进程的影响,两种方法
(1)在CPU中设置一对上、下限寄存器
存放用户作业在主存中的上下限地址,每当要访问一个地址时,分别和两个寄存器的值相比
(2)采用重定位寄存器(基地址寄存器)和界地址寄存器(限长寄存器)
重定位寄存器记录最小的物理地址;界址寄存器记录逻辑最大地址
内存管理机构动态地将逻辑地址与界地址寄存器比较,若未越界,则加上重定位寄存器的值后映射为物理地址,在交由内存单元
例:进程P的VA=0~179,映射到PA=100~279
则重定位寄存器=100;界地址寄存器=179
加载这两个寄存器时必须使用特权指令,只有操作系统才能加载和修改,不允许用户修改

·内存共享:只读区域才能共享
·可重入代码/纯代码
(1)一种允许多个进程同时访问但不允许任何进程修改的代码
(2)不属于临界资源

·覆盖与交换:多道程序环境下用来扩充内存的方法
覆盖:将用户空间分为固定区和若干覆盖区,进程信息不必全部装入,对用户和程序员不透明
在单一连续存储管理中使用来扩大存储容量的技术,也可用于固定分区分配的存储管理
交换:将处于等待状态的程序从内存移到辅存(进程的中级调度采用交换技术)
(1)磁盘够大(2)每个进程的执行时间长于交换时间
(3)交换空间通常为磁盘的一整块,独立于文件系统,分为:
·交换区:采用连续分配方式,追求换入/换出的速度
·文件区:采用离散分配方式,追求存储空间的利用率

交换技术:主要在不同进程间进行;覆盖技术:用于同一个程序或进程中
(覆盖技术已成历史,交换技术仍在使用)

·连续分配管理方式
1、单一连续分配
内存分为系统区和用户区,用户区内存中仅有一道用户程序
优点:简单,无外部碎片,不需要内存保护;
缺点:只能用于单用户/任务操作系统中,有内部碎片,存储区利用率低
2、固定分区分配
将用户空间划分为若干固定大小的区域(每个分区的大小可不等),建立一张分区说明表
有内部碎片,无外部碎片可用于实现多道程序,不能实现多进程共享主存区,存储空间利用率低
3、动态分区分配/可变分区分配
在进程装入内存时根据进程需要动态地分配内存,分区的大小和数目都可变
随时间推移会产生大量无法利用的小的外部碎片,可通过紧凑技术解决(需要动态重定位寄存器支持)相对费时
动态分区的分配策略
(1)首次适应(最好最快)(2)邻近/下一次适应(3)最佳适应(4)最坏适应
最佳/最差:空闲分区按容量递增/递减的次序形成空闲分区链
回收内存:(1)回收区前/后相邻空闲区,合并后修改前/后空闲区的表项(大小/始址和大小)
(2)前后都有空闲区,修改前一空闲区的表项,取消后一空闲区的表项
(3)前后均无,新建表项,插入空闲链表

·动态重定位于动态内存分配
动态重定位:在程序运行过程中要访问数据时再进行逻辑地址与物理地址的变换,即在逐条指令执行时完成地址映射。
动态内存分配:是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。

动态重定位可以将程序分配到不连续的存储区,在程序运行之前可以只装入部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存,有利于程序的浮动;

动态内存分配随着时间的推移,内存中会产生越来越多小的外部碎片。可以通过紧凑技术来解决,即操作系统不时地对进程进行移动和整理。但这需要动态重定位寄存器的支持,且相对费时。

(注意)
内存分区管理方法:连续分配方式、非连续(离散)分配方式
·连续分配方式包括:单一、固定、动态
·非连续分配方式包括:分页、分段
在分页存储管理中根据运行作业时是否需要把作业全部装入内存后运行,分为:
基本分页和请求分页(虚拟存储器)

·基本分页存储管理
不产生外部碎片;每个进程平均产生半个块大小的内部碎片(页内碎片)
1、概念:
(1)页面与页面大小
页/页面:进程中的块;页框/页帧:内存中的块;块/盘块:外存中的块
页面过小:进程页数过多,页表过长占用大量内存;增加硬件地址转换开销,降低页面换出换入效率 ;页面过大:使页内碎片增多,降低内存大利用率
(2)地址结构:页号+页内偏移
(3)页表:系统为每一个进程建立一张页表,记录页面在内存中对应的物理块号,存放于内存中
实现从页号到物理块号到地址映射
页表项:页号|物理块号;物理地址=查表得到的物理块号拼上页内偏移
2、基本地址变换机构
页表寄存器PTR:存放页表在内存的起始地址和页表长度
·(题型)设页面大小为L,逻辑地址A变换为物理地址E
(1)页号=逻辑地址/页面长度(除法取整);页内偏移=逻辑地址%页面长度(除法取余)
(比较页号和页表长度,若大于,则产生越界中断)
(2)页号查页表得页框号(3)物理地址=内存中起始地址(物理块号*页大小)+页内偏移
p.s.地址变换过程由硬件自动完成
·(题型:确定页表项大小)
例:假设某系统内存大小4GB,页面大小4KB
4KB=212B,故4GB被划分为232/212=220个块,即需要20bit来表示
因为字节编址,凑8的倍数,24bit=3B
(页号不占空间,因为连续存放,只需知道其实地址即可,类比数组)
·页面大小为2的整数幂的好处:
(1)便于拆分逻辑地址(2)便于计算物理地址(直接拼接即可)

3、具有块表的地址变换机构
快表:具有并行查找能力的高速缓冲存储区(相联存储区),用于存放当前访问的若干页表项
·快表与普通Cache的区别:TLB中只有页表项的副本,Cache中还有各种数据的副本
·增加TLB后,若在TLB中命中,则存储数据只需一次访存;相比于没有TLB,只有页表,则存储一个数据或指令至少两次访存
4、两级页表
·单级页表的问题:
(1)页表需要连续存放(且每个进程对应一张页表)当页表过大时会占用很多连续的页框
(2)没有必要整个页表常驻内存
·逻辑地址空间格式
一级页号|二级页号|页内偏移

·若采用多级页表机制,则各级页表的大小不能超过一个页面
·访存次数(若无TLB)=级数+1

5、基本分段存储管理
·分页与分段的区别
(1)页/段是信息的物理/逻辑单位;对用户是不可见/可见的
(2)分页大小固定,分段大小不定(3)分页地址空间是一维的分段是二维的
·分段:按照用户进程中的自然段划分逻辑空间,每段从0起,并分配一段连续的地址空间(段内连续,段间不要求)
·地址结构:段号|段内偏移
·分段好处:方便编程、信息保护和共享、动态增长及动态链接
·段表:逻辑空间与内存空间映射的段表,每个段表项记录每一个段的始址和长度
·地址变换机构(类似于分页的变换,只需注意段内偏移是与段长比较,超出则产生越界中断)
·段的共享与保护
共享:通过两个作业的段表中响应表项指向被共享的段段同一个物理副本实现
通过动态链接的方式,将所需程序段映射到相关进程中;减少程序段的调入/出,减少对换次数
保护:(1)存取控制(2)地址越界保护

·段页式管理
分页:有效提高内存利用率;分段:反映程序结构有利于段段共享和保护
·逻辑地址:段号|页号|页内偏移;每个进程对应一张段表,每个分段有一张页表;二维
·进行一次访问需要三次访存

·在使用交换技术时,若一个进程正在IO操作,则不能交换出主存
·采用覆盖与交换技术的目的是节省主存空间
·内存保护由操作系统和硬件机构合作完成
·采用分页或分段管理后,提供给用户的物理地址空间取决于段/页表的长度(不一定)
·分段存储管理方法有利于程序的动态链接
·可重入代码是通过减少对换数量来改善系统性能的
·计算二级页表的页目录表项数
字节编址,页大小为210B,页表项大小为2B,逻辑地址空间大小为216页,则表示整个逻辑地址空间的页目录表中包含表项的个数至少是:
逻辑地址空间为216页,则需要216个页表项,
每页能存放的页表项数=页大小/页表项大小=210B/2B=29个
所有容纳下216个页表项需要216/29=27页,即页目录表项数
·在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址是在链接阶段
程序运行流程:编译生成多个目标模块的逻辑地址(均从0开始),通过链接后生成可执行文件,此时拥有完整程序的逻辑地址
·动态分区分配算法中,最容易产生内存碎片的是最佳适应算法
·在采用二级页表的分页系统中,CPU页表基址寄存器中的内容是当前进程的一级页表的起始物理地址

3.2虚拟内存管理
·传统存储管理方式特征:一次性:作业必须一次性全部装入内存后才能开始运行;驻留性:作业被装入内存后就一直驻留在内存中
·虚拟存储器的特征:
(1)多次性:无须在作业运行时一次性全部装入内存
(2)对换性:无须在作业运行时一直常驻内存
(3)虚拟性:从逻辑上扩充内存容量
·虚拟内存技术的实现
(1)三种方式:请求分页/分段/段页式存储管理
(2)硬件支持:一定容量的内存和外存;页/段表机制;中断机构;地址变换机构

·请求分页管理方式
1、页表机制
(1)页表项
|页号|物理块号|状态位P|访问字段A|修改位M|外存地址|
状态位P:该页是否已调入内存
访问字段A:记录本页在一段时间内被访问的次数,或已有多长时间未被访问,供置换算法参考
修改位M:该页在调入内存后是否被修改过,用于确定置换该页面时是否需写回
外存地址:指示该页的外存地址,通常是物理块号,供调入时参考
(2)缺页中断机构
特点:属于内部异常(在指令执行期间产生);在一条指令执行期间可产生多次中断
(3)地址变换机构
越界?越界中断:搜索快表
页表项在TLB中?修改访问位和修改位:访问页表
页在内存?修改快表:缺页中断
缺页中断:保留CPU现场、从外存中找到缺页;
内存满?选择一页换出:CPU从外存中读入缺页
换出页被修改?写回外存:读入缺页
启动IO硬件、缺页换入内存、修改页表
形成物理地址

·页框分配
1、驻留集大小
进程驻留集:给一个进程分配的物理页框的集合
2、内存分配策略
两种分配策略:固定/可变分配策略;两种置换策略:全局/局部置换策略
(1)固定+局部
只能从分配给该进程在内存的页面中选出一页换出;难以确定应为每个进程分配的物理块数
(2)可变+全局
每个进程被分配到物理块数可变,发生缺页时系统从空闲物理块队列中取出一块分配
比(1)灵活;可能会盲目给进程增加物理块,导致系统多道程序并发能力下降
(3)可变+局部
每个进程分配一定数目的物理块,发生缺页时只能从该进程在内存中的页面选择一页换出,若该进程缺页率过高/过低,则系统适当给该进程增加/减少物理块数,使缺页率稳定
保证进程不会过多调页的同时,保持了系统的多道程序的并发能力;实现复杂,开销大

3、物理块调入算法(固定分配策略下)
(1)平均分配(2)按比例分配(3)优先权分配
4、调入页面的时机
(1)预调页策略:(根据局部性原理)一次调入若干相邻页面(主要用于进程首次调入)
(2)请求调页策略:要访问的页面不在内存请求调页,一次一页;实现简单、增加IO开销
5、从何处调入页面
请求分页系统中外存分为两部分:
文件区:用于存放文件,离散分配,充分利用空间
对换区:用于存放对换页面,连续分配,更快的调入/出速度
(1)有足够的对换区空间:全部从对换区调入页面,在进程运行前需将进程相关文件复制到对换区
(2)没有足够的对换区空间:不会被修改的文件从文件区调入;可能被修改的,换出时须调到对换区,以后需要时再从对换区调入
(3)UNIX方式:进程相关文件都放在文件区,未运行过的页面都从文件区调入,曾经运行但又被换出的页面放在对换区,所以下次调入从对换区调入
6、如何调入页面
页在内存?内存满?置换哪页?被修改?修改表项、形成物理地址

·页面置换算法
1、最佳置换算法OPT(无法实现)
2、先进先出页面置换算法FIFO
·Belady异常:分配的物理块数增大,页故障数不减反增;队列类算法n
3、最近最久未使用LRU
·设置一个访问字段,记录页面自上次被访问后经历的时间,淘汰值最大的页面
·性能较好,需要寄存器和栈道硬件支持,是堆栈类算法
4、时钟置换算法CLOCK
(1)最近未用算法NRU/简单的CLOCK置换算法
设置一位访问位M,将所有页面视为循环队列,设置一个指针指向被替换的页面;
每次先检查指向页面的访问位,若为1,置0后指向下一页面;若为0,则换出
(2)改进的CLOCK置换算法
在增加访问位的基础上,再增加修改位A,根据AM将页面分为四类 (11|10|01|00)
从00到11,循环查找,替换第一个找到的页
相较于NRU,减少了磁盘IO操作次数

·抖动和工作集
1、抖动/颠簸:频繁的页面调度行为
原因:同时运行的进程过多,每个进程被分配到物理块太少,致使频繁发生缺页
置换页面算法不合理
2、工作集W:某段时间间隔内,进程要访问的页面集合,由时间t和工作集窗口大小确定
t时刻往前数“工作集窗口”个
工作集大小可能小于窗口大小(当窗口中有重复页面时)
分配给进程的物理块数要大于工作集大小
原理:操作系统跟踪每个进程的工作集,并为进程分配大于工作集的物理块
在工作集内的页面调入驻留集,外的换出;
若有空闲物理块,可再调一个进程进入存储,若超出物理块数,则暂停的一个进程

·内存映射文件Memory-Mapped Files
将磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域建立映射关系
直接访问被映射文件,不必执行文件IO操作或文件内容缓存操作,适用于管理大尺寸文件
实际交互在内存中进行,当进程退出或显式解除文件映射时,被修改的页面被写回磁盘文件
多个进程允许并发地内存映射同一文件,以便实现数据共享
内存映射文件可充当通信进程之间的共享内存区域

·虚拟存储器性能影响因素
页面较大/分配给进程的物理块数越多缺页率较低
·地址翻译(与计算机组成联系)
例,某系统满足:有一个TLB和一个data Cache,存储区以字节为单位编址,虚拟地址14位,物理地址12位,页面大小64B,TLB为四路组相联,共16个条目,data Cache是物理寻址、直接映射的,行大小为4B,共16组。写出访问地址为0x03d4,0x00f1,0x0229的过程

·虚拟存储器的大小
(1)实际容量<=内存+外存容量
(2)最大容量<=地址位数

·导致LRU算法实现起来耗费高的原因是需要对所有页进行排序
·已知系统为32位实地址,采用48位虚拟地址,页面大小为4KB,页表项大小为8B。假设系统使用纯页式存储,则要采用(4)级页表,页内偏移(12)位
页面大小4KB=2^12B,12位页内偏移
一页能容纳页表项数为4KB/8B=2^9个
48-12=36位虚页号
采用多级页表时,最高级表项不能超过一页大小,36/9=4级页表
·CPU利用率低,磁盘交换区利用率高如何改进
增大内存容量、减少多道程序度数

第四章 文件管理

4.1文件系统基础
·文件:以硬盘为载体的存储在计算机上的信息集合,用户以文件为单位进行输入输出
·文件的结构:
(1)数据项:基本数据项(最小逻辑单位),组合数据项(多个基本数据项组成)
(2)记录:一组相关的数据项集合
(3)文件:分为有结构文件和无结构文件
有结构文件:若干个相似记录组成;无结构文件:被视为字符流(二进制文件或字符文件)

·文件控制块和索引结点
1、文件的属性:名称、类型、创建者、所有者、位置、大小、保护、创建时间、
2、文件控制块:用于存放控制文件需要的各种信息的数据结构,实现“按名存取”
包含:基本信息(文件名、物理位置)、存取控制信息(存取权限)、使用信息(文件建立时间、上次修改时间)
文件目录:FCB的有序集合,也被视为一个文件,称为目录文件
3、索引结点(UNIX中使用):文件名和文件描述信息分开,文件描述信息单独形成一个称为索引结点的数据结构,简称i结点(inode)。文件目录中的每个目录项仅有文件名和指向文件所对应的i结点的指针构成
(1)磁盘索引结点:每个文件有一个唯一的磁盘索引结点,内容包含:文件主标识符、文件类型、文件存取权限、文件物理地址、文件长度、文件链接计数、文件存取时间
(2)内存索引结点:当文件被打开时,将磁盘索引结点复制到内存的索引结点中,相比磁盘索引结点,增加内容:索引结点编号、状态、访问计数、逻辑设备号、链接指针

·文件的操作:
(1)创建/写/读/重新定位/删除/截断文件
(2)文件的打开与关闭
在文件使用之前通过系统调用open显式打开,当文件不再被使用时,用close关闭;
在多个进程可以同时打开文件的操作系统中,通常采用两级表:每个进程表和整个系统表
进程表:存储进程对文件的使用信息
系统打开文件表:文件相关信息
对于打开文件表的索引称为:文件描述符(UNIX),文件句柄(windows)
内容包含:文件指针、文件打开计数器、文件磁盘信息、访问权限

·文件保护
方法:口令保护、加密保护、访问控制
(1)访问类型:读、写、执行、添加、删除、列表清单
(2)访问控制:为每个文件和目录增加访问控制列表ACL
优点:可以使用复杂的访问方法;缺点:长度无法预计可能导致复杂空间管理
精简访问列表:拥有者、组、其他(UNIX使用)
·口令:时空开销小;口令存于系统内部不够安全
·密码:保密性强,节省存储空间;编码和译码需要一定时间

·文件逻辑结构
1、无结构文件/流式文件
文件内部数据是一系列二进制或字符流组成,以字节为单位,访问只能通过穷举搜索,管理简单,操作方便,适用于采用字符流的无结构方式,如源程序文件,目标代码文件
2、有结构文件/记录式文件
根据各条记录的长度是否相等,分为:定长/可变长记录
(1)顺序文件:顺序排列,顺序或链式存储
链式和可变长顺序:不能实现随机存取;定长顺序:可
两种结构:
串结构:记录顺序与关键字无关,按存入时间排序,从头开始依次查找,费时
顺序结构:按关键字排序,可用折半查找法
(2)索引文件
建立一张索引表以加快文件检索速度,每个记录对于一个索引项
索引表:定长记录顺序文件
适用于对信息处理的及时性要求高的场合
(3)索引顺序文件
一组记录对应一个索引表项(减小索引表所占空间)
组与组间关键字有序,可用折半查找;组内关键字无序,用顺序查找
可建立多级索引表
(题型)计算平均查找次数
(例如,学生信息表,名字为主键,索引文件,每个学生对应一个索引表表项;
索引顺序文件,同一个字母开头的名字的学生为一组,对应一个表项)
(4)直接文件或散列文件
给定记录的键值或通过散列函数转换的键值直接决定物理地址
存取速度快,但可能引起冲突

·文件的物理结构
1、连续分配
每个文件在磁盘上占有一组连续的块;物理块号=起始块号+逻辑块号;
优点:支持顺序访问和直接访问(随机访问),在顺序访问时速度最快
缺点:不方便文件拓展;存储空间利用率低;会产生磁盘碎片
2、链接分配
(1)隐式链接
目录项中:记录文件第一块的指针和最后一块的指针
文件的每一块中(除最后一块):保存指向下一块的指针(用户透明
优点:便于拓展,没有碎片问题,外存利用率高
缺点:只支持顺序访问,查找效率低,指针占空间
(2)显式链接
把用与链接各物理块的指针显示存放于文件分配表FAT中
目录中只需记录文件起始块号;FAT表项:物理块号(可隐含)|下一块
一个磁盘仅设一张FAT,开机时将FAT读入内存,并常驻内存
优点:便于文件拓展,没有碎片,外存利用率高,支持随机访问;由于FAT常驻内存,地址转换时不需要访问磁盘,比隐式访问效率更高
缺点:FAT需要占用一定存储空间
3、索引分配
链接分配存在问题:
系统为每个文件建立一张索引表,记录文件各个逻辑块(可隐含)对应的物理块;
索引表存放的磁盘称为索引块;文件数据存放的磁盘块称为数据块
缺点:索引表占用一定空间
若一个文件的索引表大小超过一块磁盘块的大小时
(1)链接方案:多个索引块链接,问题:读取第n个索引块时,前n-1个都需先读入
(2)多层索引:类似多级页表,各层索引表大小不能错过一个磁盘块
(题型)计算能存放的最大的文件长度
(题型)根据逻辑块号计算应查找索引表项
采用K级索引表结构,且顶级索引表未读入内存,则访问一个数据块需K+1次读磁盘操作
问题:存储小文件时不合算
(3)混合索引
顶级索引表中,即包含直接地址索引又包含一级/二级间接索引
(题型)计算最大文件长度
4、混合索引分配

【区分:文件的逻辑结构与物理结构】
1、两大分类
·逻辑结构:无结构/有结构文件
有结构文件:顺序(顺序/链式存储)/索引/索引顺序
·物理结构:连续/链接/索引分配
2、链接
链式存储:文件内部各条记录链式存储,由创建文件的用户设计
链接分配:文件整体用链接分配,由操作系统决定
3、索引
索引文件的索引表:用户自己建立,映射:关键字到记录存放的逻辑地址
索引分配的索引表:操作系统建立,映射:逻辑

·逻辑上与物理上的索引逻辑:目的是加快文件数据的定位(用户角度)
物理:目的是管理不连续的物理块(系统角度)

·文件系统在创建一个文件时,为其建立一个文件目录项
·打开文件:把指定文件的目录复制到内存指定的区域
·目录文件FCB存放:该目录中所有子目录文件和数据文件目录
·读文件:open系统调用打开文件
open参数:文件路径名与文件名
·read:使用open返回的文件描述符(不使用文件名)
参数:文件描述符fd、buf缓冲区首地址;传送的字节数n
功能:从fd所指示的文件中读入n个字节的数据,并将它们送至由指针buf所指示的缓冲区中
·索引分配中,索引结点数与单个文件长度无关(有关:间接地址索引级数、地址项个数、文件块大小)
·可以提高文件访问速度:提前读;为文件分配连续的簇;延迟写;采用磁盘高速缓存
·控制访问矩阵位数=行数(用户类别)*列数(访问权限)

4.2目录
·文件目录:FCB(文件控制块)的有序集合(一个FCB就是一个文件目录项),包含:有关文件的属性、位置和所有权
·FCB:实现文件名和文件之间的映射,使用户(程序)能实现“按名存取”

·目录结构
1、单级目录
整个系统中只建立一张目录表,每个文件占用一个目录项,
实现“按名存取”;查找速度慢,不允许文件重名,不便于文件共享,不适用于多用户系统
2、两级目录结构
分为主文件目录和用户文件目录;允许不同用户的文件重名
用户无法对自己的文件进行分类
3、树形目录结构
绝对路径:从根目录出发的路径;相对路径:从当前目录出发
便于对文件分类,层次清晰,更有效的进行文件的管理和保护
4、无环图目录结构
在树形目录的基础上,增加指向同一结点的有向边
为每一个结点设置一个共享计数器
便于文件共享;系统管理复杂

·目录实现:线性列表、哈希表

·文件共享
1、基于索引结点的共享方式(硬链接)
在索引结点中设置链接计数count
A创建新文件,为文件的所有者,count=1
B链接该文件,则在B的目录项中增加一个目录项,count=2
A不再使用该文件时,不能删除该文件,count-1
当count=0时才能删除文件
2、利用符号链实现文件共享(软链接)
B共享A创建的文件F
系统创建LINK型文件,命名为F写入B的目录项,文件里只有F的路径名
只有文件所有者才有指向其索引结点的指针
文件所有者将文件删除后,其他用户对F的访问失效
软/硬区别:
硬链接有指向文件对指针;软链接只有该 文件的路径名
硬链接查找速度快于软链接
静态共享:软/硬链接
动态共享:两个进程同时对一个文件进行操作

·在使用顺序检索法时,
对树形目录应采用文件的路径名,且应从当前目录开始逐级检索;
只要路径名的一个分量名未找到,就应停止查找;
·对一个文件的访问,常由用户访问权限和文件属性共同限制
·若文件f1的硬链接为f2,两个进程分别打开f1和f2,两个进程分别打开f1和f2,获得对应的文件描述符为fd1和fd2
(1)f1和f2的读写指针位置可以不同(各进程的用户打开文件表中关于F表项内容不同)
(2)fd1,fd2分别指向各自的用户打开文件表中的一项
(3)在系统打开文件表中仅有一个表项包含F的属性
(4)f1,f2共享一个内存索引结点
·若目录dir下有文件file,则为删除该文件,内核需:
(1)释放file占用的磁盘空间(2)释放file的文件控制块(3)删除目录dir与file对应的目录项
(归纳:回收相应的磁盘空间和文件控制块,并删除目录中对应的目录项)
(不需要删除file的快捷方式)

4.3文件系统
·文件系统存储结构(上至下)
(1)应用程序(2)逻辑文件系统:文件控制块、文件保护(3)文件组织模块:地址转换、空闲空间管理(4)基本文件系统:物理块的管理(5)I/O驱动:设备驱动程序、中断处理程序

·文件系统存放在磁盘上,磁盘划分为一个或多个分区,每个分区对应一个文件系统
包含:启动OS的方式、总的块数、空闲块数量和位置、目录结构等
(1)主引导记录MBR:位于磁盘的0号扇区,后接分区表,记录每一个分区的起始和结束地址
(2)引导块:负责启动该分区中的操作系统
(3)超级块:包含文件系统的所有关键信息
·启动过程
BIOS执行主引导记录MBR,MBR确定并读入活动分区,活动分区的引导块启动操作系统、超级块将文件系统信息读入内存

·外存空闲空间管理
一个卷中,存放文件数据的文件区和存放FCB的目录区是分离的
初始化:划分目录区和文件区;建立空闲空间管理表;存放卷信息的超级块
以块为单位交换信息,文件的存储空间管理实质是对外存空闲区的组织和管理
1、空闲表法:连续分配方式,建立一张空闲盘块表(起始盘块号|空闲盘块数)
采用首次/最佳适应算法;插入时按情况进行合并
2、空闲链表法
(1)空闲盘块链:分配和回收过程简单,但分配时可能要重复操作多次,效率低,链可能会很长
(2)空闲盘区链:分配和回收复杂,效率较高,空闲盘区链较短
·空闲表和空闲链表法不适用于大型文件系统
3、位示图法:使用二进制的一位来表示一个盘块的使用情况
4、成组链接法(UNIX系统使用)
结合了空闲表和空闲链表,把顺序的n个空闲盘块号保存在第一个成组链块中,其最后一个空闲盘块则用于保存另一组空闲盘块号
(UNIX中)超级块中存放空闲空间的位向量表或第一个成组链块、卷中的目录区/文件区的划分信息。在对卷中文件进行操作之前,需预先读入主存,并保持主存与磁盘中的一致性
·UNIX文件系统的磁盘布局:
|引导块|超级块|空闲空间管理|i结点区(索引结点)|根目录|…(其他文件)…|

·虚拟文件系统
特点:
1、向上层用户提供统一标准的系统调用接口,屏蔽地处差异
2、要求下层文件系统必须实现某些规定的函数功能
3、每打开一个文件就在主存中新建一个vnode(统一的数据结构,只存在于主存中)
UFS文件系统目录项:文件名|i结点号
FAT文件系统目录项:文件名|文件类型|其他|文件大小|起始块号

·Linux抽象来四种对象类型:超级块/索引结点/目录项/文件对象

第五章 输入/输出(I/O)管理

5.1 I/O管理概述
·I/O设备的启动由系统完成

·设备分类
1、按信息交换的单位
(1)块设备:磁盘(有结构,传输速率高,可寻址,随机读写)
(2)字符设备:交互式终端机、打印机(无结构,传输速率低,不可寻址,采用中断IO方式)
2、按传输速率
(1)低速设备:键盘,鼠标(2)中速设备:激光打印机(3)高速设备:磁盘机,光盘机
3、按设备分配方式
(1)独占设备(2)共享设备(3)虚拟设备

·I/O接口/设备控制器,包括:
(1)设备控制器与CPU的接 数据/地址/控制线;数据寄存器(从设备来时输入数据或CPU来的输出数据)控制/状态寄存器(CPU来的控制信息或设备状态信息)
(2)设备控制器与设备的接口
一个设备控制器可以连接多台设备,对应多个设备接口,都存在数据、控制、状态三类信号
(3)I/O逻辑:用于实现对设备的控制
接口功能:(1)接收和识别CPU发来的命令(2)数据交换(设备与控制器之间,控制器和主存之间)(3)标识和报告设备的状态(给CPU)(4)地址识别(5)数据缓冲(6)差错控制

·I/O端口:设备控制器中能被CPU直接访问的寄存器
分为:数据/状态/控制寄存器
·CPU与I/O端口之间的通信:(1)独立编址(特殊的IO指令)(2)统一编址/内存映射IO

·I/O控制方式
1、程序直接控制
CPU循环检查,未采用中断机构,CPU与IO设备串行工作,CPU资源浪费,利用率低
2、中断驱动方式
I/O设备主动向CPU请求服务
3、DMA方式/直接存储器存取
在I/O设备和内存之间开辟直接的数据交换通路,解放CPU
特点:以块为单位;数据是设备直接送入内存的;仅在传输的开始和结束才需要CPU干预
CPU干预内容:数据传输方向,存放内存始址,传送数据长度
4类寄存器:命令状态寄存器CR/内存地址寄存器MAR/数据寄存器DR/数据计数器DC
与中断方式的区别:(1)中断的时机(2)数据传输的控制者(3)DMA以存储器为核心,与CPU并行工作;中断以CPU为核心(4)传输单位:块(批量);字节
4、通道方式
专门负责输入/输出的处理机(DMA的发展)
与一般处理机的区别:通道指令单一,通道程序置于内存中,与CPU共享内存
与DMA的区别:(1)干预更少(2)一个DMA控制器对应一个设备;一个通道控制多台设备

·I/O软件层次结构(上至下)
(1)用户层I/O软件:库函数,假脱机技术SPOOLing
(2)设备独立性(=无关性)软件:I/O调度,设备保护
(3)设备驱动程序:设置设备寄存器,检查设备状态
(4)中断处理程序:保存被中断进程的CPU环境
(5)硬件
1通过系统调用来获取操作系统的服务
2~4:属于OS的内核部分,即I/O(核心)系统
2提供服务:提供统一接口、设备保护、设备的分配与回收、差错控制、缓冲区管理、逻辑名到物理设备名的映射

·应用程序IO接口(IO系统与高层的接口)
(1)字符设备接口:通常采用中断方式,建立字符缓冲区,属于独占设备,须实现互斥共享
(2)块设备接口:常用DMA方式
内存映射接口:通过内存的字节数组来访问磁盘
(3)网络设备接口:网络套接字接口
(4)阻塞/非阻塞I/O

·虚拟设备:把一个物理设备变换成多个对应的逻辑设备
·通道技术是一种硬件机制
·通道控制设备控制器,设备控制器控制设备
·设备无关的操作系统软件:将系统调用参数翻译成设备操作命令
·本地用户通过键盘登录系统时,首先获得键盘输入信息的程序是中断处理程序
·系统将数据从磁盘读到内存的过程
初始化DMA控制器并启动磁盘
从磁盘传输一块数据到内存缓冲区
DMA控制器发出中断请求
执行“DMA结束”中断服务程序

5.2设备独立性软件
·与设备无关的软件,位于IO系统的最高层软件,下层是设备驱动程序
·高速缓存与缓冲区
1、磁盘高速缓存:提高磁盘IO速度
不同于CPU与内存间的Cache,而是利用内存空间来暂存磁盘中的信息,
逻辑上属于磁盘,物理上为驻留内存的盘块;
两种形式:在内存中开辟一个单独空间;将未利用地内存空间作为缓冲池,供请求分页和磁盘IO时共享
2、缓冲区
(1)目的:缓和CPU与IO间速度不匹配;减少CPU中断频率;解决数据单元大小不匹配问题;提高CPU与IO设备之间的并行性
(2)实现:硬件缓冲器:TLB;缓冲区(位于内存)
(3)根据缓冲区个数分类:
T:从磁盘中取一块到缓冲区
M:操作系统将缓冲区中数据传到用户区
C:CPU对数据块的处理时间
单缓存:在主存中设置一个缓冲区,大小为一块,
处理每块数据用时=max{C,T}+M
双缓冲:设置两缓冲区,提高了处理机和设备的并行程度
t=max{C+M,T}
C+M>T:CPU不等待;C+M<T:块设备连续
(题型)计算单/双缓冲区下数据块处理时间
循环缓存:包含多个大小相等的缓冲区,每个缓冲区中有指向下一个缓冲区的指针,构成环形
缓冲池:由多个系统公用的缓冲区组成,
按照使用状况形成3个队列:空缓存/输入/输出队列
对应4种工作缓冲区:存放输入数据/提取输入数据/存放输出数据/提取输出数据
·两台机器之间通信:
双方各有一个缓冲:只能实现单方向的数据传输
双方都有两个缓冲区:发送/接收缓冲区,实现双向数据传输
·管道是一种缓冲区

·高速缓存和缓冲区对比
(1)高速缓存存放低速设备的信息副本;缓冲区存放低速和高设备速之间传送的数据信息
(2)高速缓存中存放高速设备常访问信息,若不在需访问低速设备获取;
高速和低速设备间的通信需通过缓冲区(高速设备不会直接访问低速设备)

·假设有n块待传数据
单缓冲t=[max{C,T}+M]*n+C
双缓冲t=max{C+M,T}*n+M+C
无缓冲区=(T+C)*n

·独占式使用设备;分时式共享使用设备;以SPOOLing方式使用外部设备

·设备分配的数据结构
设备控制表DCT、控制器控制表COCT、通道控制表CHCT、系统设备表SDT
1、DCT:一个DCT代表一个设备,
每个表项包括:设备类型、设备标识符、设备状态、指向控制器表COCT的指针、重复执行次数或时间(多次失败才判定IO失败)、设备队列的队首指针(PCB)
2、COCT:(表中信息包括)控制器标识符,控制器状态,与控制器连接的通道表CHCT指针,控制队列的队首指针/队尾指针(一个CHCT对应多个COCT)
3、CHCT:通道标识符/状态,与通道连接的控制器表首址,通道队列队首/队尾指针
4、SDT:整个系统中只有一张SDT
表项:设备类,设备标识符(物理设备名),DCT,驱动程序入口(每个表项对应一个设备)
数据结构之间关系:整个系统里有一张SDT,SDT中每一个表项对应一张DCT;
每台设备对应一张DCT,每个控制器对应一张COCT,每个通道对应一张CHCT;
DCT中有指向COCT的指针,COCT中有指向CHCT的指针,
CHCT中含有使用其服务的几个COCT的首地址(一对多)

·设备分配策略:原则:充分发挥设备使用效率,避免死锁;分配方式:静态(独占设备)/动态;设备分配算法(先请求先分配,优先级高者)
·设备分配安全性:安全分配(进程发出IO请求后进入阻塞态);不安全分配(继续运行,仅当请求设备被另一个进程占用时才进入阻塞态)

·逻辑设备名到物理设备名到映射
设置一张逻辑设备表LUT,用于将逻辑设备名映射为物理设备名
LUT表项:逻辑设备名、物理设备名、设备驱动程序入口
两种设置方法:整个系统中一张;每个用户一张,放入进程的PCB中
使用LUT后的设备分配步骤:
(1)由进程请求的逻辑设备名查询SDT
(2)SDT通过查找DCT找到目标设备,并在LUT中新增表项
(3)通过DCT找到对应COCT
(4)COCT找对应CHCT
(注意)当设备、控制器和通道都分配成功,才算真正成功

·SPOOLing/假脱机技术(=预输入程序+井管理程序+缓输出程序)
一项将独占设备改造成共享设备的技术,利用外围控制机
(1)输入井和输出井:在磁盘上开辟两个存储区
(2)输入/输出缓冲区:在内存中开辟
(3)输入/输出进程(必须有多道程序技术的支持):模拟外围控制机
完成任务(打印机):
(1)在磁盘缓冲区中申请一块空闲盘块,将要打印的数据暂存
(2)为用户进程申请一张用户请求打印表,填入信息要求,挂载到假脱机文件队列上
特点:
(1)提高了IO速度(2)独占设备变为共享设备(3)实现虚拟设备功能(对于每个进程,都认为自己独占一个设备)

·设备独立性:用户在编程序时使用设备与实际设备无关
优点:方便编程、程序不受机器环境的限制、便于程序移植

·专用缓冲:单/双/循环;共享缓冲:缓冲池(并发进程使用)
·需要使用缓冲技术的场景
(1)图形用户界面下使用鼠标
(2)多任务操作系统下磁盘驱动器(假设没有设备预分配)
(3)包含用户文件的磁盘驱动器
(4)使用存储器映射IO,直接和总线相连的图形卡
·SPOOLing技术的基本条件:
(1)大容量、高速度的硬盘作为输入井和输出井
(2)SPOOLing软件

5.3磁盘和固态硬盘
·磁盘的存储能力受限于最内道的最大记录密度
·扇区是磁盘可寻址的最小单位
·磁盘管理
1、磁盘初始化
(1)低级格式化/物理格式化:划分扇区,用特殊的数据结构填充磁盘的扇区
(2)数据结构:头部,中间数据区域(512B),尾部;
头,尾包含磁盘控制器信息(扇区校验码,指向下一块对指针)
2、磁盘分区(如C,D盘),将分区的起始扇区和大小记录在主引导记录的分区表中
3、逻辑格式化(高级格式化)
工作包括:建立文件系统根目录;对保存空闲磁盘块信息的数据结构初始化,对扇区进行逻辑编号,建立逻辑盘的引导记录,文件分配表,文件目录表和数据区等(建立位示图、空闲分区表)
4、安装操作系统

·多个相邻扇区组合形成一簇/块,一簇只能存放一个文件内容,文件占用空间只能为簇的整数倍
3、引导块
自举装入程序(ROM中,为避免改变自举代码须改变ROM)
自举程序(磁盘启动块/引导块/启动分区中):初始化CPU、寄存器、设备控制器和内存,然后找到操作系统内核将其加载到内存,转向起始地址开始运行操作系统

·系统启动过程:ROM中的引导程序,磁盘引导程序,分区引导程序,操作系统初始化程序
·硬盘启动过程:磁盘物理格式化,磁盘分区,逻辑格式化,操作系统的安装

4、坏块
低级格式化时会保留一些块备用,磁盘记录坏块,组成列表,并在后续使用中不断更新列表,采用备用块来逻辑替代坏块,称为扇区备用,对操作系统透明

·一次磁盘读写时间=
寻道时间:磁头移动到指定磁道
+旋转延迟时间:定位到磁道的某一扇区(通常取磁头转一圈的平均时间)
+传输时间:磁盘读出或写入数据的时间
1、减少寻道时间(选择合适的磁盘调度算法)
(1)先来先服务:公平,简单;平均寻道距离大
(2)最短寻找时间优先:可能产生饥饿现象
(3)扫描SCAN算法(电梯算法):可避免饥饿
先通过距离最近的请求选择移动的方向,一个方向走到尽头后再反向走到尽头
(4)C-SCAN(循环扫描)
磁头只能单向移动提供服务,
假设满足从小到大的请求,则满足最大请求后
直接回返快速移动至最小请求(或始端,看题目要求)
(SCAN和CSCAN可默认为LOOK和CLOOK)
(5)LOOK:SCAN的改进,不需到达一端的尽头,只需到最远端的请求即可
(6)C-LOOK:C-SCAN的改进,只需到达最远端的请求
2、减少延迟时间
(1)同一扇区:对盘面扇区进行交替编号
(2)同一柱面的不同盘面:进行错位命名
磁盘地址结构为(柱面号,盘面号,扇区号)这种结构也与减少延迟有关
·旋转延迟相关
(1)磁盘空闲空间分配程序
(2)文件的物理结构(连续/链接/索引分配)

·固态硬盘
(1)基于闪存技术的存储器,由一个或多个闪存芯片和闪存翻译层组成
(2)以页为单位读写(3)随机写慢(随机读写性能优于磁盘,因为不需要机械操作)

·磨损均衡(1)动态磨损均衡(2)静态磨损均衡(更先进,SSD自动检测并管理)

·磁盘驱动程序完成:磁盘IO请求,计算柱面号/磁头号/扇区号(逻辑地址转为物理地址)
·提高磁盘IO速度的方法:(1)提前读(2)延迟写(设标志)(3)虚拟盘(内存仿真磁盘)