操作系统随记

1 计算机系统概述

1.1 OS基本概念

1 定义

操作系统OS是指控制和管理整个计算机系统的硬件和软件资源,合理地组织、调度计算机的工作和资源分配;为用户和其他软件提供方便的接口和环境;操作系统是计算机系统中最基本的系统软件。

2 特征

并发、共享、虚拟、异步

并发:
并发是指两个或多个事件在同一时间间隔内发生;宏观上同时发生,微观上交替发生
并发性:两个或多个事件在同一时间间隔内发生。
并行性:两个或多个事件在同一时刻发生,需要硬件支持,如多流水线或多处理机硬件环境。

共享:
资源共享即共享,是指系统中的资源可供多个并发执行的进程使用;可分为互斥共享和同时共享。
临界资源:一段时间内只允许一个进程访问的资源
互斥共享:一段时间内只允许一个进程访问该资源;大多数物理设备都是互斥共享
同时共享:一段时间内允许多个进程同时访问该资源;这里的同时指宏观上

并发和共享是操作系统两个最基本的特征,两者互为存在条件
1.资源共享是以程序的并发为条件的,若系统不允许程序并发执行,则自然不存在资源共享问题
2.若系统不能对资源共享实施有效的管理,则必将影响到程序的并发执行,甚至根本无法并发执行

虚拟:
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的
虚拟处理器:时分复用,让多道程序并发执行的方法,来分时使用一个处理器,虽然只有一个处理器,但它能同时为多个用户服务,使每个终端用户都感觉有一个中央处理器(CPU)在专门为它服务
虚拟存储器:通过空分复用技术,将一台机器的物理存储器变为虚拟存储器,以便从逻辑上扩充存储器的容量。当然,这时用户所感觉到的内存容量是虚的。
虚拟I/O设备:采用虚拟设备技术将一台物理I/O设备虚拟为多台逻辑上的I/O设备,并允许每个用户占用一台逻辑上的I/O设备,使原来仅允许在一段时间内由一个用户访问的设备(即临界资源)变为在一段时间内允许多个用户同时访问的共享设备。

异步:
在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性

3 功能

为了给多道程序提供良好的运行环境:处理机管理、存储器管理、设备管理、文件管理
为了方便用户使用,向提供接口:命令接口、程序接口
可用来扩充机器,以提供更方便的服务、更高的资源利用率

处理机管理:
即对进程的管理,包括进程控制、进程同步、进程通信、死锁处理、处理机调度等。

存储器管理:
方便程序运行、用户使用及提高内存的利用率,包括内存分配与回收、地址映射、内存保护与共享和内存扩充等功能。

文件管理:
计算机中的信息都是以文件的形式存在的,操作系统中负责文件管理的部分称为文件系统。
文件管理包括文件存储空间的管理、目录管理及文件读写管理和保护等。

设备管理:
设备管理的主要任务是完成用户的I/O请求,方便用户使用各种设备,并提高设备的利用率,主要包括缓冲管理、设备分配、设备处理和虚拟设备等功能。


命令接口:
用户利用这些操作命令来组织和控制作业的执行
联机命令接口:即交互式命令接口,适用于分时或实时系统。
脱机命令接口:即批处理命令接口,适用于批处理系统

程序接口:
程序接口由一组系统调用(也称广义指令)组成。是为编程人员提供的接口。普通用户不能直接使用程序接口,只能通过程序代码间接使用。
用户通过在程序中使用系统调用命令请求OS为其提供服务。系统调用命令又称广义指令。
GUl:图形化用户接口,用户可以使用形象的图形界面进行操作


对计算机资源的扩充:
在裸机上安装的操作系统,可以提供资源管理功能和方便用户的服务功能,将裸机改造成功能更强、使用更方便的机器。
通常把覆盖了软件的机器成为扩充机器,又称之为虚拟机。

1.2 发展历程

在这里插入图片描述

1.手工操作阶段(无操作系统)
程序的装入、允许、输出的结果都要人工干预
缺点是用户独占全机、CPU利用不充分、CPU与IO速度不匹配

2.批处理阶段(操作系统开始出现)
单道批处理系统:引入脱机输入输出技术,自动线、顺序性、单道性,缓解人机速度矛盾,但资源利用率还是低
多到批处理系统:多道程序设计技术操作系统开始出现,允许多个程序在CPU交替运行,多到、宏观并行、微观串行、间断性、共享性、制约性;主要解决如何分配处理器,多到程序的内存分配问题、IO设备如何分配,如何组织和存放大量的程序和数据,以方便用户使用并保证其安全性与一致性;资源利用率高,系统吞吐量大,但用户相应时间长,无人机交互能力

3.分时操作系统:
时间片轮转,每个用户都可以和计算机交互互不干扰
特点:同时性,交互性,独立性,及时性
缺点:无法处理及时任务

4.实时操作系统
能在某个时间限制内完成某些紧急任务不需要时间片排队,有软实时系统和硬实时系统
特点:及时性、可靠性

5.网络操作系统和分布式计算机系统
网络操作系统:把计算机网络中的各台计算机有机地结合起来,提供一种统一、经济而有效的使用各台计算机的方法,实现各台计算机之间数据的互相传送;网络中各种资源的共享,各台计算机之间的通信
分布式计算机系统:由多台计算机组成并满足下列条件的系统,主要特点是分布性和并行性

6.个人计算机操作系统
个人计算机操作系统是目前使用最广泛的操作系统,它广泛应用于文字处理、电子表格、游戏中。

引入多到程序设计的前提条件是有中断功能

通道技术是一种硬件技术

1.3 程序运行环境

1.3.1 处理器运行模式

操作系统内核程序:管理程序(内核程序)

用户编写程序:应用程序

特权指令:不允许用户直接使用的指令,如IO指令、关中断指令、内存清零指令

非特权指令:允许用户直接使用的指令,不能直接访问系统中的软硬件资源,仅限于访问用户的地址空间

CPU允许模式分为用户态(目态)、核心态(管态)

操作系统的内核包括:
1.时钟管理:
计时,通过时钟管理实现的进程切换
2.中断机制:
3.原语:
不能被打断,定义的直接方法是关中断
4.系统控制的数据结构及处理:
作业控制块、PCB、设备控制块、各类链表、消息队列、缓冲区等
进程管理:
存储器管理:
设备管理:

1.3.2 中断和异常的概念

在这里插入图片描述

故障:执行指令引起的异常,如非法操作码、缺页故障、除数为0、运算溢出等

自陷:实现安排的异常事件,让用户去转到核心态,如条件陷阱指令

终止:硬件故障

外中断:硬件中断

1.3.3 系统调用

系统调用是指用户在程序中调用操作系统提供的一些子功能

系统调用的功能:
设备管理:设备的启动,请求或释放
文件管理:读写删
进程控制:创建、销毁、阻塞、唤醒
进程通信:进程间消息或信号传递
内存管理:分配回收

系统调用的处理需要在核心态完成

中断是操作系用必须提供的功能

时钟中断是外部中断

库函数方便调试和替换,系统调用不方便调试,不能替换

1.4 操作系统结构

在这里插入图片描述
在这里插入图片描述

1.分层法
每层只能调用紧邻他的底层的功能和服务(单向)
优点:
便于调试和验证,简化系统的设计和实现
易于扩充和维护,不影响其他层
缺点:
合理定义各层比较困难
效率较差

2.模块化
将操作按功能划分为具有一定独立性的模块,规定好各模块的接口,这种方法称为模块-接口法
内聚性:模块内各部分联系紧密,内聚性越高,模块独立性越好
耦合性:模块间相互联系和影响的程序,耦合性越低,模块独立性越好
优点:
提高操作系统设计的正确性、可理解性、可维护性
增强可使用性,加快开发过程
缺点:
模块间的接口规定很难满足实际需求
各模块设计者齐头并进,每个决定无法建立在上一个已验证的正确决定的基础上,因此无法找到一个可靠的决定顺序

从操作系统的内核架构,可分为宏内核和微内核
3.宏内核
又称大内核或单内核,将操作系统的主要功能模块都作为一个整体运行在核心态,提供高性能服务
优点:高性能
缺点:内核代码庞大,结构混乱,难以维护
应用:windows、linux、ios、macOS;广泛吸收微内核优点进行改进

4.微内核
基本概念:将内核中最基本的功能保留在内核,将那些不需要在核心态执行的功能移到用户态,降低内核设计的复杂性。而移出内核的操作系统代码根据根据分层原则被划分为若干服务程序,相互独立运行,借助微内核通信。
微内核架构=微内核+多个服务器
微内核:与硬件处理紧密相关的部分;一些基本功能;客户和服务区之间的通信
服务器(进程):提供对进程线程进行管理的进程线程服务器、提供虚拟存储器管理功能的虚拟存储器服务器
客户和服务器之间借助微内核提供的消息传递机制来实现交互
微内核基本功能:进程线程管理;低级存储器管理,如依赖于硬件实现的页表机制和内存变换机制;中断和陷入处理。微内核只将这三个功能中属于机制的很小一部分放入微内核
特点:
扩展性和灵活性
可靠性和安全性:某个模块崩溃不会使整个系统崩溃
可移植性
分布式计算:采用消息传递机制,很好的支持分布式系统和网络系统
缺点:
需要频繁地在核心态和用户态之间切换,性能低
应用:鸿蒙OS、实时、工业、航空和军事应用

5.外核
内核负责进程调度、进程通信等功能;外核在内核态运行,负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全
为虚拟机分配资源,并检查使用这些资源的企图,以确保没有机器会使用他人的资源。每个用户层的虚拟机可以运行自己的操作系统,但限制只能使用已经申请并且获得分配的那部分资源。
优点:
核可直接给用户进程分配“不虚拟、不抽象的硬件资源,使用户进程可以更灵活的使用硬件资源
减少了虚拟硬件资源的“映射层",提升效率
缺点:
降低了系统的一致性,使系统变得复杂

1.5 操作系统引导

在这里插入图片描述

操作系统引导是指计算机利用CPU运行特定程序,通过程序识别硬盘,识别硬盘分区,识别硬盘上的操作系统,最后通过程序启动操作系统

BIOS 程序(Basic Input/Output System):BIOS 是固化在主板上的基本输入输出系统,是计算机启动第一个运行的软件,存放在ROM中。它会进行硬件初始化和自检,然后查找引导程序并执行。

引导程序(Boot):引导程序是存储在主存ROM中的一段小程序,它的作用是将操作系统的内核文件从硬盘中读取到内存中,并跳转到内核入口点开始执行。

主引导记录(MBR):MBR是硬盘的主引导记录,位于硬盘的第一个扇区。它包含了磁盘引导程序和分区表。该引导程序会找到活动分区并读取其分区引导记录,完成硬盘的引导。

分区引导记录(PBR):PBR是分区引导记录,位于每个分区的第一个扇区。PBR中包含了一个引导程序,可以寻找并激活分区根目录下的启动管理器,完成分区的引导过程。

1.激活CPU:激活的CPU读取ROM中的boot程序,将指令寄存器置为BIOS的第一条指令,开始执行BIOS
2.硬件自检
3.加载带有操作系统的硬盘
4,加载主引导记录
5.扫描硬盘分区表
6.加载分区引导记录
7.加载启动管理器
8.加载操作系统

1.6 虚拟机

使用虚拟化技术,将一台物理机器虚拟化为多台虚拟机器VM,每个虚拟机器都可以独立运行一个操作系统。

在这里插入图片描述

第一类虚拟机:

第一类虚拟机管理程序就像一个操作系统,他是唯一一个运行在最高特权级的程序,在裸机上运行并具备多道程序功能。虚拟机管理程序向上提供若干虚拟机,这些虚拟机是逻辑硬件的复制品,可以在虚拟机上运行不同的操作系统。

虚拟内核态:虚拟机是用户态,而虚拟机上的操作系统认为自己运行在内核态;真正内核态的指令交由虚拟机管理程序执行。

第二类虚拟机:

依赖于windows、linux等操作系统分配和调度资源,很像一个普通进程,如VMware Workstation。

对于第二类虚拟机管理程序,运行在底层硬件上的操作系统称为宿主操作系统;运行在虚拟机管理程序上的操作系统称为客户操作系统。

首次启动时,第二类虚拟机管理程序像一台刚启动的计算机那样运转,期望找到的驱动器可以是虚拟设备。然后将操作系统安装到虚拟磁盘上(其实只是宿主操作系统中的一个文件)。客户操作系统安装完成后,就能启动并运行。

第一类VMM第二类VMM
对物理资源的控制权直接运行在硬件之上,能直接控制和分配物理资源运行在Host OS之上,依赖于Host OS为其分配物理资源
资源分配方式在安装Guest OS时,VMM要在原本的硬盘上自行分配存储空间,类似于"外核“的分配方式,分配未经抽象的物理硬件GuestOs拥有自己的虚拟磁盘,该盘实际上是HostOs文件系统中的一个大文件。GuestOs分配到的内存是虚拟内存
性能性能更好性能更差,需要Host Os作为"中介”
可支持的虚拟机数量更多,不需要和Host OS竞争资源,相同的硬件资源可以支持更多的虚拟机更少,Host Os本身需要使用物理资源,Host OS上运行的其他进程也需要物理资源
虚拟机的可迁移性更差更好,只需导出虚拟机镜像文件即可迁移到另一台Host Os上,商业化应用更广泛
运行模式第一类VMM运行在最高特权级(Ring 0),可以执行最高特权的指令。第二类VMM部分运行在用户态、部分运行在内核态。GuestOs发出的系统调用会被VMM截获,并转化为VMM对Hostos的系统调用

2 进程和线程

进程和线程:
基本概念;进程线程的状态与转换
线程的实现:内核支持的线程,线程库支持的线程
进程和线程的组织和控制
进程间通信:共享内存,消息传递,管道

CPU调度与上下文切换:
调度的基本概念;调度的目标
调度的实现:调度器/调度程序,调度的时机和方式(抢占式/非抢占式),闲逛进程,内核级线程与用户级线程调度
典型调度算法:先来先服务,短作业,时间片轮转,优先级调度,高响应比优先,多级队列,多级反馈队列
上下文切换机制

同步与互斥:
基本概念
实现方法:软件,硬件
锁:信号量;条件变量
经典同步问题:生产者-消费之;读者-写者;哲学家进餐

死锁:
基本概念;预防死锁
死锁避免;死锁检测和解除

2.1 进程与线程

2.1.1 概念和特征

概念:
进程控制块PCB:
进程:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位

特征:
动态性(最基本的特征)、并发性、独立性、异步性(需要进程同步机制)

2.1.2 进程的组成

在这里插入图片描述

进程控制块PCB:
进程创建时新建一个PCB,常驻内存,是进程实体的一部分,是进程存在的唯一标志;系统通过PCB了解该进程状态和优先级
进程标识符:每个进程一个唯一的标识号
用户标识符:进程所归属的用户,主要为共享和保护服务
进程当前状态:描述进程状态信息,是CPU分配调度的依据
进程优先级:
资源分配清单:有关内存空间或虚拟地址空间的状况,所打开的文件列表和所使用的输入输出设备信息
处理机相关信息:CPU上下文,主要指CPU各存储器的值,保存断点这些

程序段:被进程调度程序调度到CPU执行的程序代码段

数据段:可以是进程对应加工处理的原始数据,也可以是程序执行时的中间或最终结果。

进程的组织方式有链接和索引

2.1.3 进程的状态和转换

在这里插入图片描述

运行态:进程在CPU上运行,每一时刻只有一个进程在允许
就绪态:进程获得除CPU外的一切资源,等待cpu调度,系统中可以有一个或多个就绪队列
阻塞态:等待除CPU外的某些资源,可以有一个或多个阻塞队列
创建态:正在创建,首先申请一个空白的PCB,向PCB中写入控制和管理的信息,并分配资源,再插入就绪状态
终止态:进程正在从系统中消失,可能是正常结束或其他原因,需要释放资源和回收

从运行态变为阻塞态是主动行为,从阻塞态变为就绪态是被动行为,需要其他相关进程的协助

2.1.4 进程控制

一般将进程控制用的程序段称为原语,原语的特点是不允许中断,是一个不可分割的单位

进程的创建
父进程和子进程:父进程可以创建子进程,子进程可以继承父进程所拥有的资源;当子进程被撤销时,应当将从父进程获得的资源归还给父进程;父进程撤销时会撤销所有子进程。
终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建
创建原语:
1.为进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的),若PCB申请失败,则进程创建失败
2.为进程分配所需的资源,如内存、文件、IO设备和CPU时间,从操作系统或父进程获得;如果资源不足,会一直处于创建态等待资源,而不是创建失败
3.初始化PCB,主要包括初始化标志信息、CPU状态信息和控制信息,以及设置进程优先级
4.插入进程就绪队列
进程的终止
引起进程终止的事件有:
1.正常结束,表示进程的任务已完成并准备退出运行
2.异常结束,表示进程在运行时,发生某种异常事件,如存储器越界、保护错、非法指令、特权指令错、允许超时、算术运算错、IO故障
3.外界干预,指进程应外界的请求而终止运行,如操作员或系统干预、父进程请求和父进程终止
终止原语:
1.根据进程标识符,找到对应PCB,从中读出进程的状态
2.若进程处于运行态,立即终止并将CPU资源分配给其他进程
3.若还有子进程,通常将子进程终止
4.将该进程拥有的全部资源,归还给操作系统或父进程
5.将PCB从所在的队列(链表)删除
进程的阻塞
正在执行的进程等待资源,如请求系统资源失败、等待某种操作的完成、新数据尚未达到或无新任务可做等;将自己由运行态变为阻塞态,是一种主动行为、阻塞原语:
1.找到进程标识号PID对应的PCB
2.该进程在运行态,保护现场,将其状态转为阻塞态,停止运行
3.将PCB插入相应事件的等待队列,将CPU资源调度给其他进程
进程的唤醒
当阻塞进程获得所需要的资源时,调用唤醒原语
唤醒原语:
1.在该事件的等待队列中找到相应进程的PCB
2.将其从等待队列中移除,状态改为就绪态
3.将PCB插入就绪队列,等待调度

block原语和wakeup原语是一对作用刚好相反的原语,必须成对使用;如果在某个进程调用了block原语,必须在与之合作或相关的进程安排一条相应的wakeup原语,否则,阻塞进程将永远阻塞不能被唤醒

2.1.5 进程的通信

进程之间的信息交换

低级通信:PV操作方式、

高级通信:共享存储、消息队列、管道

共享存储

在通信的进程之间存在一块可直接访问的共享空间,通过对这片空间进行读写操作实现信息交换。读写操作时,需要使用同步互斥工具PV操作

低级方式共享:基于数据结构的共享

高级方式共享:基于存储区的共享

操作系统只负责提供可共享使用的存储空间和同步互斥的工具,数据交换又用户自己安排读写指令完成

消息队列

进程之间交换信息以格式化的消息为单位,进程通过操作系统提供的发送消息和接收消息两个原语进行数据交换;是目前应用最广泛的进程间通信机制。例如微内核操作系统中,微内核与服务器之间的通信就采用了消息传递机制,该机制很好地支持多CPU系统、分布式系统和计算机网络,成为这些领域最主要的通信工具。

直接通信方式:进程直接给进程发送消息,并将让挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列取得消息

间接通信方式:通过中间实体信箱完成,广泛应用于计算机网络中

管道

管道是一个特殊的共享文件,又称pipe文件,数据在管道中先进先出,管道允许两个进程按生产者-消费者的方式进行通信,只要管道不满,写进程就可以从一端写入,只要管道非空,读进程就可从另一端读出。

为协调通信,管道必须提供三方面的协调能力:1、互斥,读写互斥;2、同步,写满后写进程阻塞,空时读进程阻塞;3、确定对方的存在

管道本质上也是一种文件,管道克服使用文件通信的两个问题:

1.限制管道的大小,而不像文件可以无限增长;linux中管道大小为4kb;管道满时写进程会阻塞

2.管道空时,read()进程阻塞

管道只能由创建进程访问,子进程可继承父进程管道,可用它来与父进程通信

管道只允许单向通信,若需要双向,需要定义两个管道

2.1.6 线程

基本概念:

进程:为了更好的使多道程序并发执行,提高资源利用率和系统吞吐量
线程:减小程序并发执行时所付出的时空开销,提高操作系统的并发性能
线程是轻量级的进程,是CPU执行的基本单元,由线程ID、程序计数器、寄存器集合和堆栈组成
线程是进程中一个实体,是不拥有自己的资源,可以共享进程的全部资源

线程和进程的比较:

1.调度:同一个进程下的线程调度是不会引起进程切换
2.并发性:除了进程,线程也能并发执行,提高系统的利用率和吞吐量
3.拥有资源:进程是系统中拥有资源的基本单位,而线程不拥有系统资源
4.独立性:同一进程中的线程共享地址空间和资源,不同线程中的进程相互独立
5.系统开销:线程切换开销小
6.支持多处理器系统:进程中的多个线程可分配到多个CPU上执行

线程的属性:

1.线程是一个轻型实体,不拥有系统资源,每个线程都应拥有唯一的标识符和线程控制块,记录线程执行的寄存器和栈等现场状态
2.不同的线程可以执行相同的程序,一个服务程序被不同的用户调用时,系统会将他们创建成不同的线程
3.线程是CPU调度的基本单位,多个线程可以并发执行
4.线程的生命周期会经历阻塞态、就绪态和运行态等

线程可以提高系统并发性理解:线程切换时可能有进程切换,也可能没有,平均开销变小了

线程的状态与转换:

执行态:正在运行
就绪态:只差CPU
阻塞态:

线程的组织与控制:

1.线程控制块PCB:
线程标识符;一组寄存器,包括程序计数器、状态寄存器和通用寄存器;线程运行状态;优先级;线程专有存储区,线程切换时用于保存现场;堆栈指针,用于过程调用时保存局部变量和返回地址
2.线程的创建:
操作系统中有用于创建和终止线程的函数
用户启动程序时,通常有一个称为初始化线程的线程正在执行,用于创建新线程,需要调用一个线程创建函数,提供相应的参数,执行函数后,返回一个线程标识符
3.线程的终止:
调用相应的函数来终止线程
线程被终止后并不立即释放他的所有资源,只有当进程中的其他线程执行了分离函数后,被终止的线程才与资源分离,此时资源才能被其他线程调用
被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止的线程重新恢复运行

线程的实现方式:

在这里插入图片描述

用户级线程ULT:有关线程管理的任何工作都由应用程序在用户空间中完成,内核意识不到线程的存在,依旧以进程为切换单位
优点:线程切换不需要内核,节省切换开销;可以自定义调用算法;
缺点:阻塞时会全部阻塞;不能发挥多CPU优势

内核级线程KLT:
每个内核级线程设置一个TCB
优点:能发挥多CPU优势;一个线程被阻塞,其他线程可正常运行
缺点:线程切换要转到内核态

组合方式:

线程库是为程序员提供创建和管理线程的API
1.没有内核支持:所有代码和数据结构都位于用户空间
2.有内核支持:代码和数据结构位于内核,调用一个API函数通常会导致对内核的系统调用

在这里插入图片描述

多线程模型:

1.多对一:多个用户级线程映射到一个内核级线程,一个进程--一个内核级线程,线程的调度和管理在用户空间完成;仅当需要线程需要访问内核时才进行映射,每次只允许一个线程进行映射
优点:管理在用户空间,效率高
缺点:一个线程访问内核阻塞时整个进程阻塞;多线程不能同时在多个CPU上运行

2.一对一:每个用户级线程映射到一个内核级线程,线程切换由内核完成
优点:一个线程阻塞后,允许调度另一个线程,并发能力强
缺点:没创建一个用户线程,需要相应一个内核线程,开销大

3.n对m:n个用户级线程映射到m个内核级线程,n>=m
拥有以上两种情况的综合优点

2.2 CPU调度

2.2.1 调度的概念

多道程序系统中,进程的数量多于CPU的数量,CPU调度是对CPU进行分配,按照一定的算法从就绪队列中选择一个进程分配CPU。

CPU调度是多道程序操作系统的基础,是操作系统设计的核心。

三级调度:

在这里插入图片描述

高级调度(作业调度):从外存的后备队列中选择一个或多个进入内存,为他们建立进程,送到就绪队列。每个作业只调入一次,调出一次。多道批处理系统大多配有作业调度,而其他系统中通常不需要配置作业调度。

中级调度(内存调度):为了提高内存利用率和系统吞吐量,将暂时不能运行的进程调至外存等待,称为挂起态;等有了运行条件和内存,再将进程调入内存的就绪队列。中级调度实际上是存储器管理中的对换功能。

低级调度(进程调度):就绪队列中选择一个进程分配CPU,频率最高。

1.作业调度为进程做活动准备,使进程能正常活动起来
2.中级调度挂起暂时不能运行的进程,处于作业调度和进程调度之间
3.作业调度最少,中级调度第二,进程调度频率最高
4.进程调度最基本,不可或缺。

2.2.2 调度的实现

1.调度程序(调度器)

用于调度和分派CPU的组件:

在这里插入图片描述

排队器:将系统中所有就绪进程按一定策略排成一个或多个就绪队列;每当有一个进程转变为就绪态时,排队器便将它插入相应的就绪队列。

分派器:依据调度程序所选的进程,将其从就绪队列中取出,将CPU分配给新进程

上下文切换器:
第一对切换:将当前进程的上下文保存到其PCB,在装入分派程序的上下文
第二对切换:新选程序的现场信息加入CPU寄存器

进程上下文:CPU的所有寄存器的值(现场信息)、进程的状态和控制信息以及堆栈中的内容。

2.调度的时机、切换与过程
调度和切换的时机:
1.创建新进程后,需要选择一个上处理机
2.进程正常结束或异常终止后,需要从就绪队列选择一个进程运行,如果没有就绪进程,就运行闲逛进程
3.进程被阻塞时
4.当io设备完成后,发出IO中断,让原本等待IO的进程从阻塞态变为就绪态,此时需要决定是新的进程投入运行还是让中断运行的进程继续执行

不能切换和调度的情况:
1.处理中断时
2.需要完全屏蔽中断的原子操作,如加锁、解锁、中断现场保护、恢复源自操作;原子操作时需要屏蔽中断
3.进程调度的方式

非抢占调度方式,又称非剥夺方式

抢占调度方式,又称剥夺方式

4.闲逛进程

Idel process,PID为0,不需要CPU之外的资源,不会被阻塞

5.两种线程调度
1.用户级线程调度:内核控制进程,由进程中的调度程序调度线程
2.内核级线程调度:

2.2.3 调度的目标

CPU利用率:CPU有效工作时间 / (CPU有效工作时间+CPU空闲等待时间)

系统吞吐量:单位时间内CPU完成作业的数量

周转时间:作业等待、在就绪队列中排队、在CPU上运行和IO操作花费时间的总和

周转时间=作业完成时间-作业提交时间

平均周转时间:

带权周转时间:作业周转时间 / 作业运行时间

等待时间:进程等待CPU的时间之和

响应时间:用户提交作业到首次产生响应所用的时间

2.2.4 进程切换

上下文切换:CPU从一个进程切换到另一个进程需要保存当前进程状态并恢复另一个进程的状态;进程上下文采用进程PCB表示,包括CPU寄存器的值、进程状态和内存管理器等。
1.挂起一个进程,将CPU上下文保存到PCB,包括程序计数器和其他寄存器
2.将进程移入就绪或阻塞队列
3.选择另一个进程执行,并更新其PCB
4.恢复新进程的CPU上下文
5.跳转到新进程PCB中程序计数器所指的位置执行

模式切换:用户态和内核态的切换,CPU逻辑上可能还在执行同一个进程

上下文切换只能发生在内核态
调度是一种决策行为,切换是一种执行行为;一般来说,先有资源的调度,再有进程的切换

2.2.5 典型调度算法

先来先服务FCFS
作业调度,进程调度
算法简单,但效率低;对长作业比较有利,对短作业不利;有利于CPU繁忙型作业,不利于IO繁忙型作业
短作业优先SJF、短进程优先SPF
缺点:对长作业不利,会产生饥饿现象
可以算是抢占式,又称最短剩余时间优先算法
!!短作业优先是平均等待时间,平均周转时间最优的
高响应比优先调度算法
主要用于作业调度,是对FCFS和SJF的一种综合平衡
响应比 = (等到时间+要求服务时间) / 要求服务时间
1.等到时间相同时,要求服务时间短的优先级高,类似于短作业优先
2.要求服务时间相同时,等待时间长的优先级高,类似与FCFS
3.对于长作业,响应比随时间的增长而优先级增加,克服饥饿现象
优先级调度算法
作业调度、进程调度
抢占式优先级调度、非抢占式优先级调度
静态优先级调度:优先级在创建进程时确定;简单易行,系统开销小,不够精确
动态优先级调度:创建进程的优先级可随时间的改变而增加
系统进程>用户进程
交互性进程>非交互性进程 前台进程>后台进程
IO型进程>计算型进程 频繁使用IO设备的进程优先级更高,有利于提升系统的效率
时间片轮转RR
主要适用于分时系统,所有就绪进程按FCFS排成一个就绪队列,每个一个时间片产生一次时钟中断,在时间片内未完成的进程将完成调度,重新回到就绪队列队尾
如果一个时间片未结束进程就运行完成,立刻完成调度
时间片大小对进程影响很大,时间片足够大时,时间片轮转算法会退化为FCFS
多级队列调度算法
系统设置多个就绪队列,每个就绪队列可以采用不同的调度算法
可以将每一个就绪队列分配到相应的CPU
多级反馈队列调度算法

综合时间片轮转调度算法和优先级调度算法

多个队列,每个队列都采用FCFS;第一级别的时间片最短,第二级别的时间片比第一级别增加一倍,以此类推;只有当前面队列都为空时才会调度下一级别的队列;每个进程时间片走完还没执行完时,进入下一级队列

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3 同步和互斥

2.3.1 同步和互斥的基本概念

临界资源:一次仅允许一个进程使用的资源称为临界资源;许多物理设备都属于临界资源:打印机

资源访问过程:
1.进入区:检查是否可以进入临界区,设置正在访问临界区的标志,阻止其他进程进入临界区
2.临界区:访问邻接资源的那段代码
3.退出区:将正在访问临界区的标志清除
4.剩余区:剩余部分

同步:直接制约关系;有一定的先后顺序
互斥:间接制约关系;空闲让进、忙则等待、有限等待、让权等待

2.3.2 实现临界区互斥的基本方法

软件实现方法

在进入区检查能否正常进入,如果有进程在临界区,则在进入区循环等待;进程离开临界区后则在退出区修改标志。

1.单标志法(违背空闲让进)

两个进程交替进入临界区

int turn=0;//表示那个进程可以进入临界区

p0:{
	while(turn!=0);
	临界区;
	turn=1;
	剩余区;
}

p1:{
	while(turn!=1);
	临界区;
	turn=0;
	剩余区;
}
2.双标志先检查(违背忙则等待)
bool flag[2]; //是否想进入临界区
flag[0] = false;
flag[1] = false;

p0:{
	while(flag[1]);
	flag[0]=true;
	临界区;
	flag[0]=false;
	剩余区;
}

p1:{
	while(flag[0]);
	flag[1]=true;
	临界区;
	flag[1]=false;
	剩余区;
}
3.双标识后检查(违背空闲让进,有限等待)饥饿
bool flag[2]; //是否想进入临界区
flag[0] = false;
flag[1] = false;
p0:{
	flag[0]=true;
	while(flag[1]);
	临界区;
	flag[0]=false;
	剩余区;
}

p1:{
	flag[1]=true;
	while(flag[0]);
	临界区;
	flag[1]=false;
	剩余区;
}
4.Peterson算法(违背让权等待,可能忙等)
bool flag[2];  //表示意愿
int turn = 0;  //表示哪个先进

//主动争取;主动谦让;检查对方是否想使用且最后是不是自己谦让
P0:{
	flag[0] = true;
	turn = 1;
	while(flag[1] && turn==1);
	临界区;
	flag[0] = false;
	剩余区;
}

P1:{
	flag[1] = true;
	turn = 0;
	while(flag[0] && turn==0);
	临界区;
	flag[1] = false;
	剩余区;
}
硬件实现方法

计算机提供了特殊的硬件指令,允许对一个字的内容进行检测和修正,或对两个字的内容进行交换

1.中断屏蔽

不适合多处理器系统

2.TestAndSet

不能让权等待

//共享变量lock表示当前临界区是否被加锁
bool TestAndSet(bool *lock){
	bool old;
	old = *lock;
	*lock = true; //无论之前是否加锁,都将lock设置为true
	return old;  // 返回原来的值
}

先检查lock,为false时进入;为true时循环等待
//使用TSL实现互斥的算法逻辑
while(TestAndSet(&lock));
临界区;
lock = false;
剩余区;
3.Swap

会占用CPU,不能让权等待

Swap(bool *a,bool *b);

bool old=true;
while(old == true)
	Swap(&lock,&old);
临界区;
lock=false;
剩余区;

2.3.3 互斥锁

进入临界区获得锁acquire(),退出临界区释放锁release();原子操作,由硬件完成;布尔变量available代表互斥锁;用于解决临界区的互斥功能

acquire(){
	while(!available);
	avilable = false; //获得锁
}

release(){
	available = true;
}

2.3.4 信号量

未遵循让权等待

整型信号量:
//两个标准原语
wait(S) == P
signal(S) == V

int S=1;
void wait(int S){
	while(S<=0);
	S=S-1;
}
void signal(int S){
	S=S+1;
}
记录型信号量:
typedef struct{
	int value;
	struct process *L;
}semaphore;

void wait(semaphore S){
	S.value--;
	if(S.value<0){
		block(S.L);
	}
}

void signal(semaphore S){
	s.value++;
	if(S.value<=0){
		wakeup(S.L);
	}
}
信号量实现互斥:
semaphore mutex=1;
p1(){
	P(mutex);
	临界区
	V(mutex);
}

信号量实现同步:
semaphore s=0;
p1(){
	...
	...
	V(s);
	...
}
p2(){
	P(s);
	...
	...
}

2.3.5 经典同步问题

生产者-消费者

在这里插入图片描述

多生产者多消费者

在这里插入图片描述

读者写者

互斥关系:写进程-写进程、写进程-读进程

有缺陷:

在这里插入图片描述

写优先:

在这里插入图片描述

哲学家进餐问题:

在这里插入图片描述

吸烟者问题:

在这里插入图片描述

2.3.6 管程

进程同步工具

1.定义

利用共享数据结构抽象的表示系统中的共享资源,将对该数据结构实施的操作定义为一组过程;统一管理对共享资源的访问,确保每次仅有一个进程使用共享资源

这个代表共享资源的数据结构,对该数据结构实施操作的一组过程所组成的资源管理程序,称为管程。

管程定义了一个数据结构和一组实现进程并发的操作。

组成:管程的名称;局部于管程内部共享数据结构的说明;对该数据结构进行操作的一组过程或函数;对共享数据结构设置初始值的语句

monitor Demo{//定义一个名称为"Demo"的管程

    //定义共享数据结构,对应系统中的某种共享资源
    共享数据结构 S;
    
    condition x;	//定义一个条件变量x
    
    //对共享数据结构初始化的语句
    init_code(){
        S=5;		//初始资源数等于5
    }
    //过程1:申请一个资源
    take_away(){
    	if(S<0){
    		//资源不够,在条件变量x上阻塞等待
    		x.wait();
    	}else{
    		对共享数据结构x的一系列处理;
            s--;		//可用资源-1
            ...
    	}
       

    }
    //过程2:归还一个资源
    give_back(){
        对共享数据结构x的一系列处理;
        s++;		//可用资源+1
        if(有进程在等待)x.signal();	//唤醒一个阻塞进程
    }
}

2.条件变量

当一个进程进入管程后被阻塞,直到阻塞原因被解除前,其他进程不能进入管程。将阻塞原因定义为条件变量condition;通常管程中可以设置多个条件变量,多个等待队列,对条件变量只能有wait和signal两种操作。

x.wait:将自己插入x条件的等待队列,并释放管程,其他进程可以使用

x.signal:唤醒一个进程

条件变量没有值,只能唤醒和阻塞进程,而信号量有值

2.4 死锁

2.4.1 死锁的概念

在并发环境下,各进程因竞争资源而造成一种互相等待对方手里的资源,导致各进程都阻塞。

死锁、饥饿、死循环

死锁、饥饿、死循环:
饥饿:长时间没有等待到资源分配

产生原因:对系统资源的竞争、进程推进顺序非法、信号量使用不当

产生必要条件:互斥条件、不剥夺条件、请求并保持条件、循环等待条件

只要有一个条件未满足,死锁就不会发生

处理策略:死锁预防、避免死锁、死锁的检测及解除

死锁预防:破坏死锁产生的必要条件
避免死锁:资源动态分配过程中,用某种方法防止系统进入不安全状态
死锁的检测与解除:允许死锁,死锁产生后采取措施解除死锁
资源分配策略各种可能模式主要优点主要缺点
死锁预防保守,宁可资源闲置一次请求所有资源,资源剥夺,资源按序分配适用于突发式处理的进程,不必进行剥夺效率低,进程初始化时间延长;剥夺次数过多;不便灵活申请新资源
死锁避免是“预防”和“检测”的折中(在运行时判断是否可能死锁)寻找可能的安全允许顺序不必进行剥夺必须知道将来的资源需求;进程不能被长时间阻塞
死锁检测宽松,只要允许就分配资源定期检查死锁是否已经发生不延长进程初始化时间,允许对死锁进行现场处理通过剥夺解除死锁,造成损失

2.4.2 死锁的预防

破坏互斥条件:互斥改为允许共享

破坏不剥夺条件:申请资源得不到时,主动释放占有资源;申请资源被其他进程占用时,由OS协助剥夺

破坏请求和保持条件:静态分配,运行前一次性申请全部资源;申请一部分先运行,释放部分资源后才可继续申请

破坏循环等待条件:顺序资源分配法限制申请资源的顺序

2.4.3 死锁的避免

在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁;每一次的资源分配之前先分析

1.系统安全序列

安全序列:按照这种序列分配资源,则每个进程都能顺利完成

安全状态:系统如果存在安全序列,则处于安全状态,安全状态可能有多个

不安全状态:不存在安全序列

死锁一定是不安全状态,不安全状态不一定是死锁;安全状态一定不会发生死锁

2.银行家算法

分配资源前,预先判断这次分配是否会导致系统进入不安全状态

1.可利用资源向量:Available(一维数据)

2.最大需求矩阵max:n*m矩阵,每个进程对每类资源的最大需求

3.分配矩阵Allocation:n*m矩阵,每个进程已分配到每类资源的数量

4.需求矩阵Need:n*m矩阵,每个进程还需要多少资源

在这里插入图片描述

在这里插入图片描述

2.4.4 死锁检测和解除

1.资源分配图

圆–进程,框–一类资源,框中的一个圆–一个资源;请求边;分配边

2.死锁定理

化简资源分配图检测系统状态是否为死锁状态

消去所有边

用死锁定理化简后,还有边相连的那些进程就是死锁进程

3.死锁解除

资源剥夺法:挂起某些死锁进程,抢占他的资源,将这些资源分配给其他死锁进程

撤销进程法:撤销进程并剥夺资源,简单代价大

进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步,资源释放资源而不是被剥夺

3 内存管理

3.1 内存管理基础

内存管理概念:逻辑地址与物理地址空间、地址变换、内存共享、内存保护、内存分配与回收

连续分配管理方式:页面管理、段式管理、段页式管理

3.1.1 内存管理的基本原理和要求

内存管理:操作系统对内存的划分和动态分配

主要功能:内存空间的分配和回收、扩充(虚拟内存技术和自动覆盖技术)、地址转换、内存保护、内存共享

程序链接装入
编译:高级语言翻译成机器语言;形成若干目标模块
链接:把编译后形成的一组目标模块及他们所需要的库函数链接在一起,形成一个完整的装入模块;完整逻辑地址
装入:由装入程序将装入模块装入内存运行

在这里插入图片描述

静态链接:程序运行之前,先将各模块及他们所需的库函数连接成一个完整的可执行文件,之后不再拆开

装入时动态链接:将各模块装入内存时,边装入边链接

运行时动态链接:在程序执行中需要该目标模块时,才进行链接;便于修改和更新,便于实现对目标模块的共享

绝对装入:在编译和链接后,得到的装入模块指定直接使用了绝对地址;只适用单道程序环境

可重定位装入:装入时对地址进行重地位,即将逻辑地址变换为物理地址,地址变换是在装入时一次完成的;为静态重定位,装入时分配完整内存

动态运行时装入:模块装入内存时依旧使用的是逻辑地址,等待程序要运行时才转为物理地址,需要一个重定位寄存器的支持;可以将程序分配到不连续的空间,只需装入一部分就可以运行,运行期间动态分配内存,便于实现共享,允许程序在内存中发生移动

!链接是形成完整装入模块与逻辑地址,但逻辑地址到物理地址的转换是重定位而不是装入

逻辑地址、物理地址

逻辑地址到物理地址的转换称为地址重定位

操作系统通过内存管理部件MMU将使用的逻辑地址转换为物理地址

进程的内存映像

当一个程序调入内存运行时,就构成进程的内存映像

代码段:程序的二进制代码,只读,可共享
数据段:程序运行时加工处理的对象,包括全局变量和静态变量
进程控制块PCB:存放在系统区
堆:存放动态分配的变量,通过malloc函数动态向高地址分配空间
栈:实现函数调用,从高地址往低地址方向增长

代码段和程序段在程序调入内存时就指定了大小,而堆栈可以动态调整

在这里插入图片描述

共享库用来存放进程用到的共享函数库代码,如printf函数等
在只读代码段中,.init是程序初始化时调用的_init函数;.text是用户程序的机器代码;.rodata是只读数据。
在读/写数据段中,.data是已初始化的全局变量和静态变量;.bss是未初始化及所有初始化为0的全局变量和静态变量
内存保护

确保每一个进程都有单独的内存空间,内存分配前需要保证操作系统不受用户进程影响,同时保证用户进程不受其他用户进程影响

1.CPU中设置一对上下限寄存器,存放用户作业的上限和下限地址,确定该作业的地址范围

2.重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器),作业地址范围为:重定位寄存器 到 重定位寄存器+界地址寄存器;加载重定位寄存器和界地址寄存器必须使用特权指令,不允许用户修改

内存共享

只有只读的区域才能共享

可重入的代码又称纯代码,允许多个进程同时访问但不允许修改;每个进程可以修改私有的数据区,不能修改共享代码

例:考虑一个可以同时容纳40个用户的多用户系统,他们同时执行一个文本编辑程序,若该程序有160KB代码区和
40KB数据区,则共需8000KB的内存空间来支持40个用户。如果160KB代码是可分享的纯代码,则不论是在分页系
统中还是在分段系统中,整个系统只需保留一份副本即可,此时所需的内存空间仅为40KB×40+160KB=1760KB。

对于分页系统,假设页面大小为4KB,则代码区占用40个页面、数据区占用10个页面。为实现代码共享,应在每个
进程的页表中都建立40个页表项,它们都指向共享代码区的物理页号。此外,每个进程还要为自己的数据区建立10个
页表项,指向私有数据区的物理页号。

对于分段系统,由于是以段为分配单位的,不管该段有多大,都只需为该段设置一个段表项(指向共享代码段始址,
以及段长160KB)。由此可见,段的共享非常简单易行。
内存分配与回收

单道程序-多道程序:单一连续分配-固定分配

适应大小不同的程序:固定分区-动态分区

更好地提高内存的利用率:连续分配-页式

满足用户在编程和使用方面的要求:段式

覆盖与交换

覆盖与交换技术是在多到程序环境下扩充内存的两种方法

1.覆盖:把用户空间分为一个固定区和若干覆盖区,将经常活动的部分放在固定区,其余部分按调用关系分段,将那些即将要访问的段放入覆盖区,其余段放在外存,需要调用时,再将其调入覆盖区,替换原有的段
打破了必须将一个进程全部信息装入主存后才能运行的限制;不在覆盖区的段会常驻内存,覆盖区的段能更新;覆盖技术对用户和程序员不透明
2.交换:把处于等待状态的程序移到外存,称为换出;把准备好的程序移入内存,称为换入
交换需要备份存储,通常是磁盘;为了有效使用CPU,需要使每个进程执行时间比交换时间长;换出进程必须完全处于空闲状态;交换空间通常作为磁盘的一整块,且独立于文件系统;交换通常会在系统忙时启动;

区别:交换技术主要在不同进程之间,覆盖则在同一个进程中;对于主存无法存放用户程序的矛盾,现代操作系统通过虚拟内存技术来解决的,覆盖技术已经成为历史;交换技术仍具有较强的生命力

3.1.2 连续分配管理方式

为一个用户程序分配一个连续的内存空间

内部碎片:分配给某些进程的内存区域中,有些部分没有用上
外部碎片:内存中某些空闲分区太小难以分配给程序
单一连续分配

在这里插入图片描述

系统被分为系统区和用户区:系统区通常位于低地址部分,用于存放操作系统相关数据;用户区存放用户进程相关数据;内存中只能有一道程序,占整个内存空间
优点:实现简单,无外部碎片;可采用覆盖技术;无须采取内存保护
缺点:只适用单用户、单任务的操作系统,有内部碎片,利用率低
固定连续分配

在这里插入图片描述

一种最简单的多道程序存储管理方式,将整个用户空间划分为若干个分区,每个分区只能装入一道作业
分区大小相等:缺乏灵活性
分区大小不等:
建立一张分区使用表
优点:实现简单,无外部碎片
缺点:程序太大时,可能所有分区都不满足,不得不采用覆盖技术,会产生内部碎片,内存利用率低

在这里插入图片描述

动态分区分配

又称可变分区分配,这种分配方式不会预先划分内存分区,而是进程装入内存时,根据进程大小动态建立分区,并使分区大小正好适合进程需要;大小和数目是可变的

紧凑技术:随着时间的推移,内存中会有越来越多的外部碎片,需要通过紧凑技术,不断对程序进行移动和整理,需要动态重定位寄存器的支持

动态分区分配没有内部碎片,但有外部碎片

动态分区分配会设置一张空闲分区链表,可以按始址排序
1.基于顺序搜索的分配算法
首次适用算法FirstFit:
每次都从低地址开始寻找,找到第一个满足大小的空闲分区;空闲分区以地址递增次序链接
算法简单,最好最快,回收分区后一般不需要对空闲分区列重新排序

最佳适应算法BestFit:
优先使用更小的分区,以保留更多大分区
空闲分区按容量递增形成空闲分区链,会产生大量小的、难以利用的外部碎片

最坏(最大)适应算法WorstFit:
优先使用更大的分区,以防止产生太小不可用的碎片
空闲分区以容量递减的次序链接,之后到达的大进程可能无足够的连续空间分配

邻近适应(循环首次适应)算法NextFit:
从上次查找的结束位置开始查找
空闲分区按地址递增的顺序排成一个循环链表;可能导致最后无大分区使用
2.基于索引搜索的分配算法:
当系统很大时,空闲分区链可能很长,大、中型系统中往往采用索引分配算法
根据其大小对空闲分区分类,对于每类(大小相同)的空闲分区,单独设立一个空闲分区链,并设置一张索引表来管理这些空闲分区链
当为进程分配空间时,在索引表中查找所需空间大小对应的表项,并从中得到头指针
索引分配算法有以下三种:

1.快速适应算法
空闲分区的分类根据常用的空间大小进行划分;第一,首先根据进程长度在索引表中找到能容纳他的最小空闲分区链表;第二,
从链表中取出第一块分配
优点是查找效率高、不产生内部碎片;缺点是回收分区时,需要有效合并分区,算法比较复杂,开销大

2.伙伴系统
规定所有分区的大小均为2的k次幂(k为正整数),为进程分配内存时,计算最小链表2^i分配,若已分配完,找2^(i+1)的链表将其等分
为两个分区,称为一对伙伴,其中一个分配,另一个加入2^i的空闲链表;若还不存在,则继续查找,直到找到为止;回收时,可能
也需要对伙伴分区进行合并

3.哈希算法
根据空闲分区链表的分布规律,建立哈希函数,构建一张以空闲分区大小为关键字的哈希表,每个表项记录对应头指针;分配时,
根据所需分区的大小,通过哈希函数计算得到哈希表中的位置,从中得到相应的空闲分区链表

以上都是连续分配,而非连续分配就是分页和分段管理

3.1.3 基本分页存储管理

连续分配中,固定分区会产生内部碎片;动态分区会产生外部碎片

分页思想:把主存空间划分为大小相等且固定的块,作为主存的基本单位。每个进程以块为单位进行划分,在运行过程中去申请主存空间;不会产生外部碎片,只会在最后一块有内部碎片

1.概念
页或页面:进程中的块
页框或页帧:内存中的块
块或磁盘:外存
页框=页帧=内存块=物理块=物理页面
为了方便地址转换,页面的大小应是2的整数幂

地址结构:页号+页内偏移量

页表:OS为每个进程建立一张页表,通常在PCB中,记录进程页面和实际内存块之间的映射关系
页号(对应逻辑地址,页表项在内存中连续存放,因此页号是可以隐藏的)+块号(对应物理内存)

地址转换:页号=逻辑地址/页面长度,页内偏移量=逻辑地址%页面长度
2.地址转换机构

在这里插入图片描述

通常会在系统中设置一个页表寄存器PTR,存放页表在内存中的起始地址F和页表长度M

进程未执行时,页表的始址和页表长度存放在PCB中,进程调度时再把他们放到页表寄存器

页号对应的页表项地址=页表起始地址+页号*页表项长度

分页管理系统中分页完全是由系统实现的

页表中页号可以隐含,不占内存空间

3.具有快表的地址变换机构

快表:相联存储器TLB,是一种访问速度比内存快很多的高速缓存器,用来存放最近访问页表项的副本,可以加速地址转换的速度;可以理解为一种特殊的cache

慢表:内存中的页表

在这里插入图片描述

地址转换时,先比较快表,若快表找不到在去内存比较慢表;找到页表项后,应同时将其存入快表,若快表已满,按照一定算法对旧的页表项进行替换(局部性原理)

4.两级页表

页目录表+页表

属于分页存储管理范畴,用于解决页表项占据连续页框的问题

单级页表的问题:1.页表项需要连续存放,当页表很大时,需要占用多个连续的页框;此时可以建立两级页表,一级页表为页目录表,二级页表离散存储;2.没必要让整个页表常驻内存,系统在一段时间内可能只需要访问几个特定页面;此时可以在需要访问时再把页面调入内存,在页表项中增加一个标志位,表示是否调入内存

需要多一次访存

3.1.4 基本分段存储管理

分页管理是从计算机的角度考虑设计的,目的是提高内存利用率,提升计算机性能;分页由硬件实现,对用户完全透明

分段管理是考虑用户和程序员,以满足方便编程、信息保护和共享、动态增长及动态链接等多方面的需要

地址结构是二维的

1.分段

按用户进程中的自然段划分逻辑空间;段内要求连续,段间不要求连续

在这里插入图片描述

逻辑地址=段号+段内偏移量;段号和段内偏移量由用户提供(编译程序完成)

2.段表

段表项=段号(隐藏)+段长+基址

3.地址变换机构

在这里插入图片描述

4.分页和分段的对比

分页:内存利用率高,但不方便按照逻辑模块实现信息的共享和保护

分段:方便按照逻辑模块实现信息的共享和保护,但如果段过长,会占用连续内存空间,会产生外部碎片

5.段的共享和保护

共享:分段系统中,共享是两个作业段表中的段表项指向同一个物理副本;不能修改的代码称为纯代码或可重入代码

保护:1.存取控制保护,指在段表项中设置存取控制字段;2.地址越界保护,检查逻辑地址是否超出进程的地址空间

3.1.5 段页式存储管理

将作业的地址空间首先分为若干逻辑段,每个段有自己的段号,然后将每个段分为若干大小固定的页

在这里插入图片描述

逻辑地址=段号+页号+页内偏移量

在一个进程中,段表只有一个,页表可能有多个

地址结构是二维的

地址转换:通过段表找到页表始址,然后通过页表找到页号,最后形成物理地址;需要三次访存

在这里插入图片描述

3.2 虚拟内存管理

虚拟内存基本概念、请求页式管理、页框分配、页置换算法

内存映射文件、虚拟存储器性能的影响因素及改进方式

3.2.1 基本概念

1.传统存储管理方式的特征
1.一次性:作业必须一次装入内存
当作业很大而不能全部装入内存时,无法运行
当大量作业要求运行时,只有一部分能装入内存,并发度下降
2.驻留性:作业装入内存后会长存内存直到运行结束,中间会有阻塞状态造成内存资源浪费
2.局部性原理
快表、页高速缓存和虚拟内存技术都是高速缓存技术,都依赖局部性原理
1.时间局部性:执行过的指令可能不久后会再一次执行;被访问过的数据可能不久后会再次访问;原因是有大量循环
2.空间局部性:访问的某个单元的邻近单元在不久后可能也会被访问;指令和数据通常顺序存储
3.虚拟存储器的定义和特征
虚拟存储器:
1.请求调页:程序装入时只要将当前需要的少数页面调入内存即可,在执行过程中,当所访问的信息不在内存时,由操作系统将需要的信息页面调入内存,称为请求调页
2.页面置换:当内存空间不够时,将内存中暂时用不到的页面调出外存,重新调入需要的信息

虚拟存储器特征:
1.多次性:多次调入调出,最重要的特征
2.对换性:无需常驻内存
3.虚拟性:逻辑上扩充内存的容量,实现最重要的目标
4.虚拟内存技术的实现
实现方式:
1.请求分页
2.请求分段
3.请求段页式

需要:
一定容量的内存和外存;页表机制;中断机构;地址变换机构

3.2.2 请求分页管理方式

请求分页管理 = 基本分页系统+请求调页+页面置换

1.页表机制

在这里插入图片描述

状态位P:标记该页是否已调入内存

访问字段A:记录该页一段时间内被访问的次数,供页面置换参考

修改位M:是否修改过,换出时是否需要写回外存

外存地址:通常是物理块号,供调入时参考

2.缺页中断机构

在请求分页系统中,当访问的页面不在内存时,产生一个缺页中断,请求操作系统的缺页中断程序处理;此时缺页的进程阻塞,调入页面完成后再将进程唤醒放入就绪队列。

若内存中有空闲页框,则直接从外存调入页框并修改页表项;若没有空闲页框,由页面置换算法选择一个页面淘汰,判断换出的页面是否要写回外存。

缺页中断:
在指令执行期间而非一条指令执行完后产生和处理中断,属于内部异常
一条指令执行期间可能多次缺页中断
3.地址变换机构

在这里插入图片描述

1.先检索快表,命中则取出物理块号,修改访问位,写指令还要把修改位置为1
2.快表未命中,查页表,找到时取出物理块号,并将该表项写入快表,若快表已满,需要替换
3.页表未找到,进行缺页中断,更新页表和快表,并获得物理块号
4.把得到的物理块号和页内地址拼接成物理地址

3.2.3 页框分配

1.驻留集大小

驻留集:给一个进程分配的页框的集合就是进程的驻留集

1.驻留集越小,内存中的进程就越多,可以提高多道程序的并发度;但分配给每个进程的页框太少,导致缺页率高
2.驻留集越大,当分配给进程的页框超过某个数目时,再为进程增加页框对缺页率的改善不大,反而浪费内存空间
2.内存分配策略
内存分配有固定分配和可变分配两种,页面置换时有全局置换和局部置换两种
1.固定分配局部置换:
为每个进程分配数目固定的物理块;局部置换是指发生缺页时,只能从分配给本进程的页面中选择一页换出
难以确定每个进程分配的物理块数,太少会频繁缺页中断,太多也降低利用率
2.可变分区全局置换:
先为每个进程分配一定数目的物理块,在运行期间可以适当增加或减少;全局置换是指发生中断时,可调入随意一个物理块
可以动态增加进程的物理块,但盲目增加会降低并发能力
3.可变分区全局置换:
为进程分配一定数目的物理块,缺页时只能在本进程分配的页面中调入调出;当频繁缺页中断时,系统再为进程分配若干物理
块,直到缺页率合适;反之,若缺页率特别低,可适当减少分配的物理块,但不能引起缺页率的明显增加
最理想,但实现最复杂
3.物理块调入算法
固定分配时:
1.平均分配算法
2.按比例分配算法:按进程的大小比例分配
3.优先权分配算法
通常是将所有可分配的物理块分成两部分,一部分按比例分配给各个进程;一部分根据优先权分配
4.调入页面时机
1.预调页策略:一次调入若干相邻页面回比一次调入一页更高效;主要用于首次调入,由程序员指出先调入哪些页
2.请求调页:缺页时调入
5.从何处调入页面

请求分页系统的外存分为:文件区和对换区(交换区)

对换区采用连续分配方式,速度较快,而文件区采用离散分配方式

1.系统有足够的对换区空间时:可全部从对换区调入所需页面;程序运行前需要将与该进程有关的文件从文件区复制到对换区
2.系统缺少足够的对换区空间:不会被修改的文件直接从文件区调入,这些页面不必换出,需要修改的部分,换出时将他们换
到对换区,以后需要再从对换区调入(因为读比写速度快)
3.unix方式:与进程有关的文件都放在文件区,从未运行过的页面都从文件区调入,曾经调入然后换出的页面在对换区,因此
下次调入从对换区调入;进程请求的共享页面若被其他进程调入内存,则不需要再从对换区调入
6.如何调入页面

3.2.4 页面置换算法

1.OPT最佳置换算法

选择淘汰以后永不使用的页面,或者最长时间不再被访问的页面;该算法无法实现

2.FIFO先进先出置换算法

使用队列实现

Belady现象:分配的物理块增多,缺页次数不减反增的现象

3.LRU最近最久未使用置换算法

选择最近最长时间未被使用的页面淘汰;每个页面设置一个访问字段,用来记录上次访问已过去的时长,淘汰值最大的页面

需要寄存器和硬件的支持,是堆栈类算法

4.CLOCK时钟置换算法

性能接近OPT算法,但实现起来开销大

1.简单时钟置换:
每个页面设置一个访问位A,首次被装入,或者被访问时,访问为置为1
所有页面连成一个循环队列,一个替换指针指向一个页面,当页面被替换时,指针指向下一页面
替换时只看访问位,若为1,把他修改为0,暂不换出,继续查看下一位;若为0,直接换出

2.改进型时钟算法:
页面换出时,被修改过的页面需要写回磁盘,开销较大,因此优先考虑换出未修改过的页面
设置访问位A和修改位M
淘汰次序:A=0,M=0,未被访问未被修改;A=0,M=1,未被访问已被修改;A=1,M=0,已被访问未被修改;A=1,M=1,已被访问已被修改
算法执行过程:
1.循环扫描,找A=0,M=0,这一轮不修改访问位A
2.找A=0,M=1,同时扫描过的页面访问位都改为0
3.再重复以上两步

3.2.5 抖动和工作集

1.抖动

刚刚换入内存的页面马上被换出,这种频繁的页面调度行为称为抖动或颠簸

发生的原因是分配的物理块太少

2.工作集

驻留集是为进程分配物理块的数量

工作集是一个时间内系统会用到的页面集合,可以重复

驻留集不能小于工作集,否则会发生抖动

3.2.6 内存映射文件

内存映射文件是操作系统向应用程序提供的一个系统调用,与虚拟内存有些相似,在磁盘文件和进程的虚拟地址空间之间建立映射关系。

将一个文件映射到虚拟地址空间,用访问内存的方式读写文件。将文件当成内存中一个大字符数组来访问而不通过文件IO方式来访问;文件也不会一次性读入内存。

进程可通过共享内存来通信,共享内存是通过映射相同文件到通信进程的虚拟地址空间来实现的;各进程虚拟地址空间相互独立,但映射到的物理内存相同

优点:1.程序员编程更简单,已建立映射的文件,只需按访问内存的方式进行读写;2.方便多个进程共享同一个磁盘文件

3.2.7 虚拟存储器性能影响因素

缺页率、分配给进程的物理块数、页面置换算法、写回磁盘的频率

3.2.8 地址翻译

4 文件管理

1.文件

文件的基本概念;文件元数据和索引节点inode

文件的操作:建立,删除,打开,关闭,读,写

文件的保护;文件的逻辑结构;文件的物理结构

2.目录

目录的基本概念;树形目录;目录的操作;硬链接和软链接

3.文件系统

文件系统的全局结构layout:文件系统在外存的结构,文件系统在内存的结构

外存空闲空间管理办法;虚拟文件系统;文件系统挂载mounting

4.1 文件系统基础

4.1.1 文件的基本概念

1.文件的定义

文件是以计算机硬盘为载体的存储在计算机上的信息集合,在用户进行的输入、输出中,以文件为基本单位。

文件管理系统是实现文件的访问、修改和保存,对文件维护管理的系统。

文件的组成:存储空间、标签、访问权限

文件的结构:
数据项:文件系统最低级的数据结构
1.基本数据项,数据中的最小逻辑单位 2.组合数据项,有多个基本数据项组成

记录:是一组相关数据项的集合,用于描述一个对象在某方面的属性

文件:又创建者定义、具有文件名的一组相关数据的集合
1.有结构文件,由若干相似的记录组成 2.无结构文件,字符流,如二进制文件或字符文件
2.文件的属性
文件名:同一目录下不允许有重名文件
标识符:一个系统内各文件标识符唯一,操作系统用来区分
类型:
位置:
大小:
创建者、所有者:
保护信息:访问控制信息
创建时间、最后一次修改时间、最后一次存取时间
3.文件的分类
按性质和用途:系统文件、用户文件、库文件
按文件中数据的形式:源文件、目标文件、可执行文件
按存取控制属性分类:可执行文件、只读文件、读写文件
按组织形式和处理方式分类:普通文件、目录文件、特殊文件

4.1.2 文件控制块和索引节点

FCB的有序集合称为文件目录,一个FCB就是一个文件目录项;一个文件目录也被视为一个文件,称为目录文件

1.文件控制块FCB

在这里插入图片描述

FCB是用来存放控制文件所需的各种信息的数据结构,以实现按名存取;文件和FCB一一对应,FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。

2.索引节点

文件目录通常存放在磁盘上,检索目录时需要一页一页掉入内存,但在检索过程中只用到了文件名,当文件名匹配成功时,才需要从该目录项中读出文件的物理地址;因此,unix系统采用了文件名和文件描述信息相分离的做法,使文件描述信息单独成为一个称为索引节点的数据结构,inode。

原本文件目录每个目录项=FCB

inode文件目录每个目录项=文件名+索引节点号(索引节点指针)

1.磁盘索引节点:存放在磁盘上的索引节点;每个文件有唯一的磁盘索引节点
文件主标识符:拥有该文件的个人或小组的标识符
文件类型:包括普通文件、目录文件或特别文件
文件存取权限:
文件物理地址:
文件长度:
文件链接计数:指向该文件名的指针计数
文件存取时间:

2.内存索引节点:存放在内存中的索引节点,当文件被打开时,要将磁盘索引节点复制到内存的索引节点,再增加以下内容:
索引节点号:
状态:是否被上锁或修改
访问计数:进程访问+1,访问结束-1
逻辑设备号:所属文件系统
链接指针:设置分别指向空闲链表和散列队列的指针

4.1.3 文件的操作

1.文件的基本操作
创建文件create系统调用:所需外存空间、存放路径、文件名
1.在外存中找到文件所需空间
2.根据路径找到该目录对应的目录文件,创建对应的目录项

删除文件delete系统调用:存放路径、文件名
1.找到目录文件现在对应目录项
2.根据目录项的信息,回收文件占用磁盘块
3.删除对应目录项

读文件read:索引号、读指针、读入数据量、写入内存位置

写文件write:索引号、写指针、写数据量、写出数据在内存位置
2.文件的打开和关闭

在这里插入图片描述

打开文件:文件存放路径、文件名、对文件操作类型r或rw
打开文件时并不会把文件数据直接读入内存,只是读文件描述符
1.找到外存中的目录文件,检查用户是否有操作权限
2.将目录项复制到内存的“打开文件表”,并将打开文件表的索引号返回给用户,之后用户使用该索引号指明要操作的文件
3.打开文件后,对文件的操作不需查询目录,可以根据内存中的打开文件表进行操作
每个进程有单独一张打开文件表,特有属性:读写指针(记录该进程对文件读写操作进行到的位置)、访问权限
系统有一张总的打开文件表,特有属性:打开计数器
系统打开文件表返回给用户称为文件描述符或句柄;用户用这个索引号访问文件而不是文件名


关闭文件:
1.将进程的打开文件表相应表项删除
2.回收本进程分配给该文件的内存资源
3.系统打开文件表的计数器-1,若计数器为0,则删除系统表的表项

文件打开后用户用文件描述符访问

4.1.4 文件保护

文件保护通过口令保护、加密保护和访问控制等方式实现;口令和加密是为了防止用户文件被他人存取或窃取,访问控制是用于控制用户对文件的访问方式。

1.口令保护

为文件设置一个口令,把口令保存在文件的FCB或索引节点中,用户访问文件前先输入口令,对比正确后才能访问文件。

口令时空开销很小,但存放在系统内部不安全。

2.加密保护(异或加密)

使用密码对文件进行加密,在访问文件时提供密码,进行解码后才得到真正的数据。

保密性强,不需要在系统中存储密码,但加密解密需要花费一定的时间。

3.访问控制

用一个访问控制表ACL记录各个用户的访问权限

访问类型:读、写、执行、删除、添加、列表清单

实现灵活,可以实现复杂的文件保护功能

如果某个目录进行访问权限的控制,那也要对该目录下的所有文件进行相同的权限控制

4.1.5 文件的逻辑结构

逻辑结构从用户的角度看到的文件组织形式;物理结构是指将文件存在外存上的存储形式

逻辑结构是为在文件中查找数据服务的

在这里插入图片描述

1.无结构文件

以字符流构成的文件,称为流式文件,长度是以字节为单位。

对流式文件的访问,是通过读写指针指出下一个要访问的字节;源程序、可执行文件、库函数都是无结构文件;对记录的访问只能通过穷尽的方式

2.有结构文件

有结构文件是指由一个以上记录构成的文件,称为记录式文件。可分为定长记录和可变长记录。可变长记录的查找只能通过顺序查找

在这里插入图片描述

顺序文件:
文件中的记录顺序排列,可以是定长记录也可以是可变长记录
1.串结构,各记录顺序与关键字无关,按存入先后时间排,检索必须从头开始
2.顺序结构,所有记录按关键字顺序排列,对于定长记录的顺序文件,检索可按折半查找
对于读写大批操作,顺序文件效率最高

索引文件:
建立一张索引表;索引表项=指向记录的指针+记录长度;索引表本身是一个定长记录的顺序文件
一条记录一个索引项,开销较大

索引顺序文件:
先分组,再对分组建立索引

直接文件或散列文件:
给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。
散列文件具有很高的存取速度,但可能会引起冲突,不同关键字的函数值相同

4.1.6 文件的物理结构

文件的分配方式:对磁盘非空闲块的管理

文件存储空间管理:对磁盘空闲块的管理

类似于内存分页,磁盘中也会被划分为一个个的磁盘块;文件的逻辑地址可以用:逻辑块号+快内地址表示

在这里插入图片描述

1.连续分配

要求每个文件在磁盘上占有一组连续的块

目录项=开始块号+长度

优点:支持顺序访问和随机访;访问速度最快

缺点:不利于文件扩展;存储空间利用率低,会产生磁盘碎片

2.链接分配

离散分配,由每一块指向下一块指针

消除了磁盘的外部碎片,提高磁盘的利用率,便于动态分配文件块,文件的插入、删除和修改也非常方便。

隐式链接:
目录项=开始盘块号+结尾盘块号
每一个物理块有一个指向下一块的指针,这些指针对用户是透明的
优点:扩展方便,不会有碎片,利用率高
缺点:只支持顺序访问,不支持随机访问;指针也要消耗空间

簇:可以把几个盘块组成一个簇,按簇而不按块进行分配,可以减少查找时间和指针空间,但是增加了内部碎片。

显示链接:
目录项=起始块号
一个磁盘设置一张文件分配表FAT,开机时将FAT读入内存并常驻内存;FAT表项=物理块号+下一块;由于FAT是顺序存储的,物理块号可以隐含;FAT还标记了空闲的块号
逻辑块号转化为物理块号的过程不需要访问磁盘
优点:方便扩展,不会有碎片,利用率高,支持随机访问,地址转换不需要访问磁盘
缺点:文件分配表占用一定的存储空间
3.索引分配

目录项=顶级索引块号

文件离散分配在各个磁盘块中,系统为每个文件建立一张索引表,记录文件中各个逻辑块对应的物理块;索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据库。

目录项中记录索引表在外存的存放位置,将索引表读入内存,按逻辑块号查找索引表得到对应的物理块号

可以随机访问,扩展容易,但索引表需要占用一定的存储空间

当索引表太大,一个索引块装不下时:
1.链接方案:将多个索引块以链接形式连起来
2.多层索引:类似于多级页表,若K级索引,顶级索引表未调入内存,访问一个磁盘块需要(K+1)次读磁盘操作
3.混合索引:顶级索引表中可能有直接索引地址+一级间接索引+二级间接索引

各级索引表最大不能超过一个块;FCB中会有指向顶级索引表的指针,每读下一级的索引快都需要一次读磁盘操作

4.2 目录

在这里插入图片描述

目录管理的要求:
1.实现按名存取
2.提高对目录的检索速度,从而提高对文件的存储速度
3.提供访问文件的信息,方便共享文件
4.允许不同用户对不同文件采用相同的名字

4.2.1 目录的基本概念

文件目录是FCB的有序集合,一个FCB就是一个文件目录项

按名存取

提高文件存取速度

可共享,提供控制访问文件的信息

目录管理通过树形结构来解决和实现

4.2.2 目录结构

1.单级目录结构

整个系统一张,每个文件占一个目录项;不允许文件重名

访问文件时,先按文件名在目录中找到FCB,经合法性检查后执行相应的操作

不适合多用户系统

2.两级目录结构

主文件目录MFD+用户文件目录UFD;不同用户的文件可以重名,但不可以对文件进行分类

主文件目录项记录用户名及相应用户文件目录所在的存储位置

用户文件目录记录该用户文件的FCB信息

3.树形(多级)目录结构

不同目录下的文件可以重名,可以对文件进行分类,不方便共享

文件路径名是一个字符串

绝对路径:从根目录出发,每个文件有唯一的路径名

当前目录+相对路径:每个用户、每个进程设置一个当前目录

4.无环图目录结构

允许目录共享子目录或文件,同一个子目录或文件可以出现在两个或多个目录中

方便实现共享,为共享结点设置共享计数器,为0时才可以删除

4.2.3 目录的操作

搜索:
创建文件:增加一个目录项
删除文件:
创建目录:
删除目录:1.不删除非空目录,需要删除目录中所有文件,并递归删除子目录 2.可删除非空目录,目录中的文件和子目录同时被删除
移动目录:文件或子目录
显示目录:
修改目录:

4.2.4 目录实现

访问文件时会利用路径名去找目录项,目录项中提供查找文件磁盘块所需要的信息;目录的实现就是为了查找;目录查询是通过在磁盘上的搜索完成的

通常用的更多的是顺序列表;顺序检查完成后,得到的是文件的逻辑地址

1.线性列表

最简单的目录实现方式,采用文件名和数据块指针的线性列表

当创建新文件时,必须首先搜索目录看是否有同名文件存在,再新增
当删除文件时,根据文件名搜索目录,再释放空间
当要重用目录项时,1,可以将目录项标为不再使用,或将他加到空闲目录项列表上,2.将目录的最后一个目录项复制到空闲位置,并减少目录的长度

采用链表结构可以减少删除文件的时间

线性列表的优点在于实现简单,不过查找比较费时

2.哈希表

哈希表根据文件名得到一个值,并返回一个指向线性列表中元素的指针

优点:查找快,插入和删除也简单

问题:需要避免冲突,不同文件映射到同一位置

4.2.5 文件共享

多个用户共享同一个文件,系统中只需要保留该文件一个副本

1.基于索引节点的共享方式(硬链接)

在这里插入图片描述

基于索引结点的共享方式,将文件的物理地址和属性等信息放在索引结点而不是目录项中,文件目录中只设置文件名及指向相应索引结点的指针。

不同用户的目录项指向同一个索引结点,索引节点中需要有链接计数count,某用户删除文件只是删除该用户目录项,并把count–,只有count=0才能删除文件和索引结点

2.利用符号链实现文件共享(软链接)

在这里插入图片描述

系统创建link型新文件,存放共享源文件的存放路径,类似于快捷方式

link文件会按照路径在目录中层层查找

即使共享文件被删除,link文件依旧存在,只是查找路径时会失败;查找时需要查找多级目录,会有多次磁盘IO,因此软链接访问速度要比硬链接更慢。

只有主文件有指向索引结点的指针,其他文件只有该文件的目录名

软链接和硬链接是文件系统中的静态共享方法;还存在两个进程同时对同一个文件进行操作的动态共享

4.3 文件系统

4.3.1 文件系统结构

在这里插入图片描述

假设某用户请求删除文件 “D:/工作目录/学生信息.xlsx” 的最后100条记录。
1. 用户需要通过操作系统提供的接口发出上述请求——用户接口
2. 由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录
项——文件目录系统
3. 不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限——
存取控制模块(存取控制验证层)
4. 验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址——逻辑文
件系统与文件信息缓冲区
5. 知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址——物理文件系统
6. 要删除这条记录,必定要对磁盘设备发出请求——设备管理程序模块
7. 删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收——辅助分配模块

4.3.2 文件系统布局

物理格式化:划分扇区,用替用扇区替换坏扇区
磁盘分区:
逻辑格式化:对各分区格式化,形成引导块、超级块等
1.文件系统在磁盘中的结构

磁盘划分为一个或多个分区,每个分区有一个独立的文件系统

在这里插入图片描述

主引导记录MBR:位于磁盘0号扇区,用来引导计算机,后面是分区表(分区表给出每个分区的起始和结束地址),计算机启动时,BIOS首先读入并执行MBR,MBR做的第一件事确定活动分区,读入第一块即引导块

引导块:每个分区都从一个引导块开始,win称之为分区引导扇区

超级块:包含文件系统的所有关键信息,计算机启动或文件系统首次使用时,超级块会被读入内存。里面包含:该分区块的数量、块的大小、空闲块的数量和指针、空闲FCB数量和指针等

文件系统空闲块的信息:位示图或指针链接形式
i结点:每个文件对应一个i结点
根目录:
文件和目录:
2.文件系统在内存中的结构
内存中的安装表:包含每个已安装文件系统分区的有关信息
内存中目录结构的缓存,包含最近访问目录的信息
整个文件系统的打开文件表:包含每个打开文件的FCB副本、打开计数及其他信息
每个进程的打开文件表:包含进程打开文件的文件描述符和指向整个系统的打开文件表中对应的表项的指针

在这里插入图片描述

4.3.3 外存空闲空间管理

在这里插入图片描述

1.空闲表法

适用于连续分配,回收空闲块时要注意合并

系统为外存上所有空闲区建立一张空闲表

在这里插入图片描述

2.空闲链表法

将所有空闲盘区连成一条空闲链,系统保存着链头,链尾指针

空闲盘块链:以盘块为单位,每个盘块都有指向下一盘块的指针
优点是分配和回收一个盘块过程简单,缺点是可能需要多次重复操作,效率低

空闲盘区链:以盘区为单位,每个盘区有下一个空闲盘区的指针和本盘区的盘块数
回收盘区时同样需要合并
优缺点刚好和空闲盘块链相反,优点是分配和回收效率高,链短,缺点是分配回收过程复杂
3.位示图法

在这里插入图片描述

用一个二进制来表示磁盘中一个盘块的使用情况,0表示空闲,1表示已分配
每个盘块要转换为(i,j)
优点是查找很方便,位示图很小,可以保存在内存;大小与磁盘容量有关,适合小型计算机
4.成组链接法

适用于大型文件系统,unix中采用的方法

将空闲盘块分成若干组,每一组的第一个盘块记录下一组空闲盘块总数和空闲盘块号,当改组第一个盘块为0时表示结束;每组的第一块作为索引链将每一组链接起来
回收时将空闲的盘块加入空闲盘块号栈顶部,同时移动指针,将栈中空闲盘块数+1

在这里插入图片描述

4.3.4 虚拟文件系统

虚拟文件系统VFS屏蔽了不同文件系统的差异和操作细节,为用户提供统一的调用接口

UFS文件系统:磁盘;目录项=文件名+i结点号
NTFS文件系统:移动硬盘
FAT文件系统:U盘;目录项=文件名+文件类型+其他+文件大小+其他块号
虚拟文件系统抽象了四种对象类型,每种包含数据和函数指针:
1.超级块对象:
2.索引节点对象:
3.目录项对象:
4.文件对象:

4.3.5 文件系统挂载

文件系统的安装和挂载

1.在VFS中注册新挂载的文件系统,内存的挂载表包含每个文件系统的相关信息,包括文件系统类型、容量大小
2.新挂载的文件系统,要向VFS提供一个函数地址列表
3.将新文件加到挂载点,也就是将新文件系统挂载到某个父目录下

5 输入输出管理

1.IO管理基础

设备:设备的基本概念,设备的分类,IO接口

IO控制方式:轮询方式,中断方式,DMA方式

IO软件层次结构:中断处理程序,驱动程序,设备独立性软件,用户层IO软件

输入输出应用程序接口:字符接口设备,块设备接口,网络设备接口,阻塞/非阻塞IO

2.设备独立性软件

缓冲区管理:设备分配与回收;假脱机技术SPOOLing;设备驱动程序接口

3.外存管理

磁盘:磁盘结构,格式化,分区,磁盘调度算法

固态硬盘:读写性能特效,磨损均衡

5.1 IO管理概述

5.1.1 IO设备

IO设备是将数据输入到计算机中,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。

1.设备分类
1.使用特性:
人机交互:鼠标、键盘、打印机;用于人机交互,数据传输慢
存储设备:移动硬盘、光盘;用于数据存储,传输速度快
网络通信设备:调试解调器,用于网络通信;速度介于上述两者之间

2.按信息交换单位:
块设备:信息交换以块为单位;属于有结构设备,如磁盘;传输速率高,可寻址
字符设备:信息交换以字符为单位;属于无结构类型;如交互式终端机、打印机

3.按传输速率:
低速设备:每秒几字节到数百字节,键盘、鼠标
中速设备:每秒数千到数万字节,激光打印机
高速设备:M到G,如磁盘、光盘机
2.IO接口

在这里插入图片描述

IO接口(设备控制器)位于CPU与设备之间,与CPU和设备通信,具有按CPU发来的命令去控制设备工作的功能。

组成部分:
1.设备控制器与CPU的接口:实现控制器与CPU的通信
数据线:读写数据、控制信息、状态信息
地址线:要访问IO接口中寄存器的编号
控制线:读写等控制信号
数据寄存器、控制/状态寄存器

2.设备控制器与设备的接口:实现控制器与设备之间的通信
一个设备控制器可以连接多个设备,因此可以有多个设备接口
每个接口都存在数据、控制和状态三种类型的信号

3.IO逻辑:负责识别CPU发出的命令,并向设备发出命令
用于实现对设备的控制,通过一组控制线与CPU交互,对从CPU收到的IO命令进行译码
CPU启动时,将启动命令发送给控制器,通过地址线把地址发送给控制器,由控制器的IO逻辑对地址进行译码,并相应地对所选设备进行控制
主要功能:
接受和识别CPU发出指令(控制寄存器)
向CPU报告设备的状态(状态寄存器)
数据交换(数据寄存器暂存数据)
地址识别(由IO逻辑实现)
数据缓冲
差错控制
3.IO接口的类型
按数据传输方式(外设一侧):并行接口和串行接口;接口要完成数据格式的转换
按主机访问IO设备的控制方式:程序查询接口、中断接口、DMA接口
按功能选择的灵活性:可编程接口、不可编程接口
4.IO端口

IO端口是指设备控制器中可被CPU直接访问的寄存器,包括数据寄存器、状态寄存器、控制寄存器

数据寄存器:实现CPU与外设之间的数据缓冲
状态寄存器:获取执行结果和设备的状态信息
控制寄存器:由CPU写入,以便启动命令或改变设备模式

实现IO通信,有两种控制方法:独立编制和统一编制

独立编址:为每个IO端口分配一个IO端口号,只能操作系统使用特殊的IO指令才能访问端口
统一编制:内存映射,为每个IO端口分配一个内存地址,通常靠近地址空间的顶端

5.1.2 IO控制方式

外设与内存之间输入输出的控制方式;尽量减少CPU对IO控制的干预,将CPU从繁杂的IO控制事务中解脱出来。

在这里插入图片描述

在这里插入图片描述

 1.程序直接控制(轮询)
 CPU向设备控制器发出IO读指令,然后不断循环检测设备状态,直到确认数据已在设备控制器的数据寄存器中,便将数据取出,送入内存指定单元,便完成一个字节的IO操作
 CPU和IO设备串行工作,CPU利用率低

 2.中断驱动方式
 CPU发出一条指令后继续工作,等到IO设备将数据传入数据寄存器后,设备控制器通过控制线向CPU发中断信号,待CPU取数据
 正在执行的指令发出读指令之后需要阻塞
 设备和内存之间的数据交换都必须经过CPU的寄存器;CPU以字为单位,与块设备很难兼容

 3.DMA方式
 直接存储器存储,在IO设备和内存之间开辟直接的数据交换通路
 基本的传输单位是数据块,不再是字节;所传送的数据,是从设备直接送入内存的,不在经过CPU;仅在传送开始或结束时才需要CPU的干预
 cpu收到设备的DMA请求时,向DMA控制器发出一条命令,设置MAR和DC初值,启动DMA控制器,然后CPU继续其他工作;有DMA控制器负责数据传送,直接与内存交互,传送结束后再向CPU发送中断信号,只有传送开始和结束才需要CPU参与
 数据传输以块为单位,不再经过CPU寄存器

 4.通道控制方式
 通道方式与DMA类似,比DMA有更高的自主权;不需要CPU设置传输的数据块大小,内存位置

5.1.3 IO软件层次结构

目前普遍采用层次结构的IO软件,将系统中的设备管理模块分为若干层次,每层利用下层提供的服务完成功能并向上层提供服务

在这里插入图片描述

用户层软件:
实现与用户交互的接口,用户可直接调用库函数对设备操作
用户层软件将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务

设备独立性软件:
用于实现用户程序与设备驱动器的统一接口,设备命名、设备保护和释放等;同时为设备管理和数据传送提供必要的存储空间
设备独立性软件,又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现;使用逻辑设备名
使用逻辑设备名的好处:增加设备分配灵活性;易于重定位(不改变用户程序而改变IO操作的设备)
设备独立性软件主要功能:1.执行所有设备共有操作,包括对设备的分配与回收,将逻辑设备名映射为物理设备名;对设备进行保护;缓冲管理;差错控制;提供独立于设备的大小统一的逻辑块;2.向用户层提供统一接口
I/O设备被当做一种特殊的文件;不同类型的I/O设备需要有不同的驱动程序处理
操作系统系统可以采用两种方式管理逻辑设备表(LUT):
第一种方式,整个系统只设置一张LUT,这就意味着所有用户不能使用相同的逻辑设备名,因此这种方式只适用于单用户操作系统。
第二种方式,为每个用户设置一张LUT,各个用户使用的逻辑设备名可以重复,适用于多用户操作系统。系统会在用户登录时为其建立一个用户管理进程,而LUT就存放在用户管理进程的PCB中。

设备驱动程序:
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。 
通常每类设备配置一个设备驱动程序,是io进程和设备控制器之间的通信程序,以进程形式存在
将上层发出的一系列命令(如read/write)转化成特定设备“能听得懂”的一系列操作。
不同设备的内部硬件特性也不同,这些特性只有厂家才知道,因此厂家须提供与设备相对应的驱动程序,CPU执行驱动程序的指令序列,来完成设置设备寄存器,检查设备状态等工作。
为I/O内核子系统隐藏设备控制器之间的差异。

中断处理程序:

在这里插入图片描述

总结:
1.当用户要读取某块设备内容时,通过操作系统提供的read命令接口,就经过用户层
2.操作系统提供给用户使用的接口一般是统一的,每个设备都可以相应的统一命令;用户调用read命令经过设备独立层的解析再交给下层
3.不同设备对read的行为不同;需要解析成不同的不同指令,这就经过设备驱动层
4.命令解析后,需要中断正在运行的进程,就经过中断处理程序

直接涉及到硬件其体细节、且与中断无关的操作肯定是在设备驱动程序层完成的;
没有涉及硬件的、对各种设备都需要进行的管理工作都是在设备独立性软件层完成的。

5.1.4 应用程序IO接口

1.IO接口的分类

在IO系统与高层之间的接口中,根据设备类型不同,进一步分为若干类

字符设备接口:
指数据的存取和传输以字符为单位的设备,如键盘、打印机;基本特征是传输效率较低、不可寻址,采用中断驱动方式。
get和put操作:不可寻址,只能采取顺序存取方式,建立一个字符缓冲区,get和put都是使用该缓冲区
in-control指令:字符设备类型繁多,差异甚大,因此在接口中提供一种通用的in-control指令来处理它们
字符设备都属于独占设备,接口中需要提供打开和关闭操作,以实现互斥共享。

块设备接口:
数据的读取和传输以数据块为单位,例如磁盘;基本特征是传输速率较高、可寻址。磁盘设备通常采用DMA方式
隐藏磁盘的二维结构,将原本需要(磁道号,扇区号)表示转化为所有扇区从0 - n-1编号,变成一种线性结构
将抽象命令映射成底层操作:将上层对文件的读写等抽象命令映射成设备能识别的操作
内存映射接口:通过内存的字节组来访问磁盘,不提供读写磁盘操作;映射文件到内存的系统调用返回包含文件副本的一个虚拟内存地址;只需访问内存映像时,才由虚拟存储器实际调页。内存映射文件的访问和内存读写一样简单

网络设备接口:
与网络上的其他计算机通信,套接字接口:使应用程序创建的本地套接字连接到远程应用程序创建的套接字

在这里插入图片描述

2.阻塞IO和非阻塞IO

阻塞IO:当进程调用IO时,进程被阻塞,需要等待IO完成才唤醒;大多操作系统提供的IO接口都是阻塞IO

操作和实现简单,但IO执行阶段会一直阻塞下去,需要等IO完成进程才被唤醒。

非阻塞IO:调用IO操作时不阻塞该进程,可以做其他事,但要一直询问IO操作是否完成

轮询方式会占用CPU时间

5.2 设备独立性软件

5.2.1 设备独立性软件

也称设备无关软件,是IO系统最高层软件,下层是设备驱动程序;设备独立性软件包括执行所有设备公有操作的软件

5.2.2 高速缓存与缓冲区

1.磁盘高速缓存

其实就是用内存的空间暂存磁盘中盘块的信息,磁盘高速缓存逻辑上属于磁盘,物理上是驻留在内存中的盘块。
高速缓存在内存中主要有两种形式:1.在内存中开辟一个单独空间作为磁盘高速缓存,大小固定;2.把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘IO共享
操作系统中使用磁盘高速缓存来提高磁盘IO速度,访问速度高效。

2.缓冲区(Buffer)

缓冲区是一个存储区域,可以由专门的硬件存储器组成,也可利用内存作为缓冲区
硬件做缓冲区:成本高,容量小,一般仅用在速度要求高的场合,如联想寄存器
内存做缓冲区:大部分情况,设备独立性软件的缓冲区管理就是要管理好这些缓冲区

引入缓冲区:
1.缓和CPU与IO设备之间速度不匹配的矛盾
2.减少对CPU的中断频率,放宽对CPU中断响应时间的限制
3.解决基本数据单元大小(数据粒度)不匹配的问题
4.提高CPU与IO设备之间的并行性

在这里插入图片描述

单缓冲:
每当用户进程发出一个IO请求,操作系统便在内存中为之分配一个缓冲区,通常一个缓冲区大小就是一个块。
假设设备将一块数据输入缓冲区的时间为T,OS将缓冲区数据传输到工作区时间为M,CPU处理时间为C
缓冲区必须充满后才能取出数据;为空时才能冲入数据
每块数据用时 max(C,T)+M
两个设备设置单缓冲区只能单向传输数据

在这里插入图片描述

双缓冲:
T > C+M 处理一块数据的平均用时T
T < C+M 处理一个数据块的平均耗时为C+M
每块数据用时 max(T,C+M)
两台设备设置双缓冲区可实现双向传输

在这里插入图片描述

缓冲池:
缓冲池由系统中的共用缓冲区组成
空缓冲队列
装满输入数据的输入队列
装满输出数据的输出队列

缓冲池中的四种工作缓冲区:
用于收容输入数据的工作缓冲区(hin)
用于提取输入数据的工作缓冲区(sin)
用于收容输出教据的工作绥冲区(hout)
用于提取输出数据的工作缓冲区(sout)
3.高速缓存与缓冲区的对比

高速缓存是数据的拷贝

在这里插入图片描述

5.2.3 设备分配与回收

1.设备分配概述

设备分配是指根据用户的IO请求分配所需的设备,分配的总原则是充分发挥设备的使用效率,尽可能让设备忙碌,又要避免不合理的分配方法造成进程死锁。

2.设备分配的数据结构

系统中可能存在多个通道,每个通道可以连接多个控制器,每个控制器可以连接多个物理设备;设备分配的数据结构要展示这种关系。

在这里插入图片描述

1.设备控制表DCT:每个设备一张
设备类型:打印机,扫描仪等
设备标识符:物理设备名,唯一
设备状态:忙/闲,空闲时可实现设备回收
指向控制器表的指针:每个设备由一个控制器控制,指向该控制器表
重复执行次数或时间:IO失败上限
设备队列队首指针:指向等待该设备的进程队列

2.控制器控制表COCT:每个设备控制器一张
一个设备控制器由一个通道控制

3.通道控制表CHCT:每个通道一张
与通道连接的控制器表:可找到所有控制器信息

4.系统设备表SDT:整个系统一张
记录连接到系统中的所有设备,每个物理设备对应一个表项

为进程分配设备主要考虑的因素:设备的固有属性、设备的分配算法、设备分配的安全性、独立性

3.设备分配时应考虑的因素
1.设备的固有属性:
独占设备、共享设备、虚拟设备(属于共享设备)

2.设备的分配算法
FCFS算法:先到先服务
最高优先级优先算法:优先级相同时按FCFS

3.设备分配的安全性:分配中防止死锁
安全分配方式:发出IO请求后进程就阻塞,直到IO完成才唤醒
不安全分配方式:发出IO请求后仍运行,会继续发第二、第三个请求,直到请求的设备被占用才阻塞
4.设备分配步骤
1.分配设备:根据IO请求的物理设备名查找SDT,找到对应的DCT
2.分配控制器:根据DCT找到COCT
3.分配通道:根据COCT找到CHCT
只有以上都分配才算分配成功
5.逻辑设备名到物理设备名的映射

逻辑设备表LUT:逻辑设备名到物理设备名的映射
在这里插入图片描述

5.2.4 SPOOLing假脱机技术

为了缓和CPU的高速性和IO设备低速性之间的矛盾;将低速的IO设备上的数据传送到高速的磁盘上,CPU需要时再从磁盘读数据,反之相反。

在这里插入图片描述

输入井和输出井:
在磁盘开辟两个存储区域;输入井模拟脱机输入时的磁盘,用于收容IO设备输入的数据,输出井模拟脱机输出的磁盘,用于收容用户程序的输出数据。
一个进程输入或输出的数据保存为一个文件,所有进程的输入或输出文件链接成一个输入或输出队列。

输入缓冲区和输出缓冲区:
在内存中开辟两个缓冲区,暂存设备送来和输出井输出的数据

输入进程和输出进程:
输入进程用于模拟脱机输入时的外围控制机,将用户要求的数据从输入设备传到输入缓冲区,在存到输入井,CPU需要时再从输入井读入内存
输出进程相反
井管理程序:
用于控制作业和磁盘井之间信息的交换

打印机是典型的独占设备,利用spooling技术将他改造成可共享设备
多个用户请求打印机时
1.在磁盘缓冲区为进程申请一个空闲块,并将要打印的数据送入暂存
2.为用户进程申请一张空白的用户请求打印表,挂到假脱机文件队列上
特点:
1.提高IO速度
2.将独占设备改造成共享设备
3.实现虚拟设备功能

5.2.5 设备驱动程序接口

设备驱动程序是IO系统上层与设备控制器之间的通信程序,主要任务是接收上层应用发来的IO请求,如read和write命令,将他们转换成具体要求后发送给设备控制器。

设备驱动程序的功能:实现上层应用于设备控制器的通信,1.接收上层软件发来的命令和参数,将抽象要求转化为与设备相关的具体要求,例如盘快号转化为盘面号+磁道号+扇区号;2.检查用户IO请求的合法性,了解设备工作状态,传递参数,设置工作方式;3.发出IO命令,看是否能启动设备进行工作;4.及时响应设备控制器发来的中断请求,根据中断类型调整中断处理程序进行处理

设备驱动程序的特点:1.将抽象IO转化为具体IO后传送给设备控制器,并将设备状态和IO完成情况反馈给请求进程;2.与设备采用的IO控制方式紧密相关,常见的IO控制方式是中断驱动方式和DMA方式;3.与硬件密切相关,不同类型的设备应配置不同的设备驱动程序;4.由于与硬件紧密相关,很多固化在ROM中;5.允许同时多次调用运行

5.3 磁盘和固态硬盘

5.3.1 磁盘

磁盘容量计算:以前的磁盘扇区按圆心角划分,扇区的密度从外到里逐步增加;现代磁盘划分为若干环带,每个环带具有相同的扇区数

将簇号转化为磁盘物理地址的过程:

磁盘地址:柱面号 + 盘面号 + 扇区号

5.3.2 磁盘的管理

1.磁盘初始化

低级格式化、物理格式化:划分扇区,每个扇区由头部、数据区域和尾部组成,头部和尾部包含一些磁盘控制器的使用信息

2.分区
  1. 磁盘分区:c盘d盘,每个分区由一个或多个柱面组成,每个分区的起始扇区和大小都记录在磁盘主引导记录的分区表中
  2. 逻辑格式化、高级格式化:将初始文件系统数据结构存储到磁盘上(空闲空间和已分配空间等,一个初始为空的目录),建立根目录、对保存空闲磁盘块信息的数据结构初始化。

簇:相连几个扇区连一起,一个簇只能存放一个文件的内容;文件所占空间只能是簇的整数倍

3.引导块

初始化程序(自举程序):计算机启动时运行,用来初始化CPU、寄存器、设备控制器和内存等,接着启动操作系统;启动操作系统时需要找到磁盘上的操作系统内核,把他加载到内存运行。

自举程序通常存放在ROM中,但只保留很小的自举装入程序,完整的引导程序放在磁盘启动块上,启动快位于磁盘的固定位置。

windows启动:磁盘分为一个引导分区和多个分区,引导分区包含操作系统和设备驱动程序,每个分区的第一个扇区称为引导扇区;0号扇区称为主引导记录MBR,里面有引导代码和磁盘分区表;在运行ROM中的代码后会引导运行MBR中的代码。

在这里插入图片描述

4.坏块

对于简单磁盘,如IDE控制器磁盘,坏块可手动处理,如MS-DOS的format命令执行逻辑格式化时会检查坏块。坏块在FAT上标明。

对于复杂磁盘,控制器维护磁盘内坏块列表,低级格式化时初始化并不断更新;低级格式化时也会将一些块保留作为备用。

对坏块的处理实际上就是使系统不去使用坏块。

5.3.3 磁盘调度算法

1.磁盘存取时间

一次磁盘读写时间 = 寻道时间 + 旋转延迟时间 + 传输时间

寻道时间Ts:磁头移动到目的磁道跨越n条磁道所需的时间 和 启动磁头臂的时间s,约2ms;设磁盘驱动器速度有关程序m,约为0.2ms,Ts=m*n+s

旋转延迟时间Tr:磁头转到目的扇区的时间,通常取转半圈的时间,设磁盘选择速度r,Tr=1/2r

传输时间Tt:从磁盘读出或写入数据时间,设读写字节数b,一个磁道上字节数N,磁盘旋转速度r,Tt=b/rN

磁盘存取时间中,寻道时间占大头,与磁盘调度算法密切相关,而旋转延迟时间和传输时间和磁盘旋转速度相关,比较难优化;所以磁盘调度的主要目标是减少磁盘的平均寻道时间。

2.磁盘调度算法
1.先来先服务算法FCFS:具有公平性

2.最短寻道时间优先算法SSTF:会产生饥饿现象

3.扫描算法SCAN:只有磁头移动到最外侧磁道时才能向内移动,移动到最内侧磁道时才能向外移动

4.循环扫描算法C-SCAN:从当前磁头移动到最小/最大磁道,再回到最大/最小磁道,回程无效

5.对扫描算法和循环扫描算法,可以改进为磁头只需要移到到最远端一个请求即可返回,不需要到达磁盘端点

在这里插入图片描述

3.减少延迟时间的方法

减少延迟时间也是提高磁盘传输效率的重要因素;磁头在读入一个扇区后需要短暂的处理时间才能读下一个扇区

同一个盘面可以采用交替编号,逻辑相邻两个扇区物理上隔开一个扇区

不同盘面可以采用错位命名,同柱面不同盘面的扇区错开

在这里插入图片描述

4.提高磁盘IO速度的方法

文件的访问速度是衡量文件系统性能的最重要因素,优化:1.改进文件的目录结构及检索目录的方法,以减少对目录的查找时间;2.选取好的文件存储结构,提高文件访问速度;3.提高磁盘IO速度,实现文件中的数据在磁盘和内存之间快速传送

改善磁盘IO性能的方法
1.采用磁盘高速缓存(磁盘高速缓存)
2.调整磁盘请求顺序(磁盘调度算法)
3.提前读
4.延迟写
5.优化物理块分布:扇区分布优化,链式或索引时尽量相同文件尽量安排在相邻磁道
6.虚拟盘:用内存仿真磁盘,RAM盘,常用存放临时文件
7.采用磁盘阵列RAID:由于可采用并行交叉存储,因此能大幅提高磁盘IO速度

5.3.4 固态硬盘

1.固态硬盘的特性

固态硬盘SSD是一种基于闪存技术的存储器,本质与U盘无差别,只是容量更大性能更好

一个SSD由一个或多个闪存芯片和闪存翻译层组成;闪存芯片代替传统磁盘中的机械驱动器,闪存翻译层将来自CPU的读写请求翻译成底层物理设备的读写控制信号,相当于磁盘控制器。

在这里插入图片描述

以页为单位进行读写,速度快,以块为单位进行擦除,速度慢;

2.磨损均衡

闪存的擦写寿命是有限的,一般是几百次到几千次

动态磨损均衡:写数据时,自动选择较新的闪存块

静态磨损均衡:没有数据写入时,SSD会检测并自动进行数据分配,让老的闪存块承担无须写数据的存储任务,平时读写都是较新的闪存块中进行

!!!

线程可以独立执行程序,拥有CPU现场;线程通信可以通过共享的存储空间

系统发生死锁时可能所有进程都在阻塞态,没有进程在运行态

进程所请求的一次IO操作完成后,进程从阻塞态变为就绪态

高级调度,也就是作业调度,会创建进程;操作系统相应客户提出的请求也会创建新进程

速度最快的进程通信方式是共享内存

二进制代码和常量通常放在正文段(全局变量);动态分配的存储区在数据堆段,临时使用的变量在数据栈段

处于临界区的进程也可能因为中断或抢占被调度;另外也可能自己阻塞

实时系统进程调度通常采用抢占式高优先级优先调度算法

系统开销最小的调度算法是FCFS

PV操作是一种低级的进程通信原语,不是系统调用

硬件地址变换机构一般用于动态重定位,页式管理、动态分区分配和页式虚拟都需要需要;而单一连续分配和固定分区分配不需要地址变换机构

动态重定位是在作业装入的执行过程中进行的

提高存储效率,通常统同一文件存放在不同面的同一磁道上

采用分页和分段后,由于不确定段表和页表的大小,提供给用户的物理地址空间不确定

页式管理中,CPU将虚拟地址分解为页号和页内偏移量,然后由硬件转化为物理地址

程序的动态链接和逻辑地址有关,因此分段管理有利于动态链接

可重入程序使用同一物理地址,通过动态链接的方式将程序字段映射到相关进程,减少调入调出的兑换次数

分段方式对低级程序员是可见的

CPU对主存的访问是以字节为单位

LRU算法开销大是需要对所有页面进行排序

所有页面置换算法都可能会引起抖动

页表放在PCB中,所以页表基本常驻内存

虚拟存储器的最大容量由CPU地址长度决定;虚拟存储器的实际容量为内存和外存的容量之和

unix将输入输出设备视为特殊文件

文件高速缓存可以减少磁盘IO次数;磁盘调度算法可以减少寻道时间

存储介质的特性会影响磁盘使用的组织形式

同一文件在不同介质上存放的物理结构可能不一样

文件的访问控制,常由用户访问权限和文件属性共同限制;备份防止文件受损;存储控制矩阵用于多用户之间存取权限保护

逻辑文件系统的功能:对文件按名存取、进行文件目录管理、将文件名转换为文件描述符或文件句柄、进行存储保护

对外存文件管理的主要目标是提高存储空间利用率

字符设备无法随机寻址;共享设备必须是可寻址和可随机访问的

虚拟设备是采用虚拟技术将一台独占设备转化为若干逻辑设备

设备控制器中实现设备控制功能的是设备控制器和设备的接口

通道是一种硬件技术

spooling技术的主要作用是提高独占设备的利用率

独立性软件:执行所有程序公有操作的软件

spooling技术不需要外围机的支持

固定分区分配中,程序的重定位由连接装入程序完成

时间片调度算法的相应时间和进程的数量成反比

进程映像中最重要的部分是进程上下文,是进程执行活动全过程的静态描述

所有IO指令都是特权指令

虚拟地址转化为物理地址是由硬件完成的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值