2020-08-30

操作系统预习!!!求求你了 学快点吧

概念和目标

层次结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2UxuKLHa-1598797484401)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597906019295.png)]

操作系统作用:

1.协调软硬件资源工作;

2.为上层应用程序提供服务;

3.是系统软件、不是硬件。

操作系统需要实现的功能和目标

进程:程序的执行过程,执行前需要将程序放入内存中,才能被CPU处理。

作为系统资源的管理者需要的功能
  1. 文件管理
  2. 设备管理
  3. 存储器管理(调度程序等)
  4. 进程管理
  5. 作业管理
作为系统资源的管理者的目标

资源的管理安全高效

作为用户和计算机硬件之间的接口(称为用户接口)
  1. 命令接口(分为联机命令接口(用户说一句,系统做一句,过程和系统不断交互)和脱机命令接口(用户说一堆,系统做一堆,比如批处理)):允许用户直接使用
  2. 程序接口(在程序中调用,用户只能通过程序间接使用,由一组系统调用组成,也可以叫系统调用,也叫广义指令):允许用户间接使用。
作为最接近硬件的层次需要提供的功能

功能和目标:实现对硬件机器的拓展。

覆盖了软件的机器叫做扩充机器或虚拟机。

操作系统的特征

并发和共享是最基本的特征,二者互为存在条件。

并发:指两个或多个事件再同一时间间隔内发生。这些事件宏观上是同时发生的,微观上是交替发生的。对操作系统来说:计算机系统中同时存在着多个运行着的程序。并行:指两个或多个事件在同一时刻发生

共享:指系统中的资源可供内存中多个并发执行的进行共同使用(分为互斥共享:一个时间段内只允许一个程序访问该资源;同时共享:允许一个时间段由多个进程“同时(宏观同时、微观交替)”,对它们进行访问)

虚拟:把一个物理上的实体变为若干个逻辑上的对应物。前者是实际上的,后者是用户感受到的。虚拟技术分为:1.空分复用技术;(虚拟存储器)2.时分复用技术(虚拟处理机)。并发和共享是虚拟的基础

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

发展历程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0aFLQjg-1598797484403)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597908408687.png)]

1.手工操作阶段

通过程序员纸带机打孔进行操作。

主要缺点:用户独占全机、人机速度矛盾导致资源利用率低。

2.批处理阶段
单道批处理系统

**引入脱机输入/输出(用磁带完成),监督程序(操作系统雏形)**负责控制做作业的输入、输出。

先把信息读入磁带,然后由磁带输入计算机。

内存中只能有一道程序运行。待当前程序结束后才能进行下一个程序输入。

多道批处理系统

与单道相比,每次往内存中输入多道数据。

操作系统正式诞生,并引入中断管理(并发核心),各个程序并发执行(肯定有资源共享)。

优点:资源利用率大幅提升,系统吞吐量大

缺点:用户响应时间长,没有人机交互。

3.分时操作系统

计算机以时间片为单位轮流各个用户/作业服务,用户可以通过终端和计算机交互。

优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机。

缺点:不能优先处理一些紧急任务,各个任务的优先级相同

4.实时操作系统

在分时操作系统的基础上能优先响应一些紧急任务。(通过严格要求在一定时限内处理完事件。)某些紧急任务不需要时间片排队

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BO4quO3f-1598797484405)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597909378277.png)]

操作系统运行机制和体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v2lY7w8r-1598797484407)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597909801247.png)]

指令:CPU能识别、执行的基本命令。

运行机制
指令

有的指令会对用户产生危害。

所以将指令分为:1.特权指令、2.非特权指令

两种处理器状态

分为两种处理器状态:1.用户态(目态)此时CPU只能执行非特权指令2.核心态(管态)特权、非特权都可以执行

通过PSW寄存器中的某个标志位标记当前CPU处于哪种状态

两种程序

根据指令的权限分配不同,分为两种程序:

1.内核程序(系统的管理者,可以执行特权和非特权,运行在核心态)。

2.应用程序(普通应用程序只能执行非特权指令,运行在用户态)。

操作系统内核

问题:哪些功能由内核程序实现?

运行机制

操作系统分为两个层次:1.内核(接近硬件)。2.非内核(接近应用程序)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w8ibIHQh-1598797484408)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597910852342.png)]

原子性:如果开始执行就必须执行结束。

内核:计算机配置的底层软件,是操作系统的基础和核心。

实现操作系统内核功能的就是内核程序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mnyVN6HS-1598797484408)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597910977109.png)]

操作系统的体系结构:大内核和微内核

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tALfpEXV-1598797484409)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597911023003.png)]

大内核:将主要模块都作为系统内核,运行在核心态。优点:高性能,缺点:难以维护,内核代码大

微内核:只把最基本的功能保留在内核。优点:内核功能少、结构清晰,方便维护。缺点:性能低(需要频繁切换内核态和用户态)

中断和异常

本质:

发生中断就意味着需要操作系统介入,开展管理工作。

1.当中断发生时,CPU立即进入核心态

2.当前运行的进程暂停执行,并由操作系统内核对中断进行处理

3.发生不同的中断信号,会进行不同的处理。

用户态->核心态是通过中断实现,并且中断是唯一的途经;核心态—>用户态只需要执行一个特权指令更改PSW的状态。

分类

中断分为内中断(也称异常,与CPU中执行的程序有关)和外中断(与CPU外部有关,与执行程序无关)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4qtbJ0sZ-1598797484410)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597911879972.png)]

另外一种分类:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PPd1TWLH-1598797484410)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597911951993.png)]

中断信号是以指令为周期检测。

系统调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wf3mDuW0-1598797484411)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597913912191.png)]

系统调用定义

程序接口:由一组系统调用组成

应用程序通过系统调用请求操作系统的服务。(一些操作如果应用程序直接执行的话会产生错乱,所以需要由操作系统进行统一的掌控)。

在用户程序中,凡是和资源有关的操作(例如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式发出服务请求,这样可以保证系统的稳定性和安全性

系统调用分类
按照功能分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRZZA4m3-1598797484411)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597913129446.png)]

系统调用的处理需要在核心态下进行。

系统调用与库函数的区别:

应用程序一般通过库函数(有的库函数不会实现库函数调用)进行系统调用。

系统调用的过程

陷入指令(即异常)是在用户态执行,执行结束后CPU立即进入核心态

发出系统调用请求是在用户态,面对系统调用响应处理是在核心态

先内置了是唯一一个只能在用户态执行,而不可在核心态执行的指令

进程

进程的定义

程序:一个指令序列

单道程序阶段的特性:所有的设备都属于一个程序,所以内存分为程序段(存放程序的代码)和数据段(存放程序的数据)。

多道程序的特性:内存中有多个程序,不同于单道程序,多个程序会有多个程序段和数据段,此时操作系统如何确定对应的程序所在的程序段和数据段呢?引入进程和进程实体的概念

系统为每个运行的程序配置一个数据结构,称为进程控制块PCB,用来描述进程的各种信息。(如程序代码存放位置等)

PCB、程序段、数据段构成了进程实体(进程映像)。

PCB是进程存在的唯一标志。

具体定义:
  1. 进程是程序的一次执行过程
  2. 进程是一个程序及其数据在CPU上顺序执行时发生的活动
  3. 进程时具有独立功能的程序在数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位。

强调的是动态性

组成
程序段

程序代码

数据段

程序运行时使用、产生的运算数据。

PCB

操作系统通过PCB来管理进程

PCB中应该包含操作系统对其进行管理所需的各种信息。

分为:

  1. 进程描述信息(进程标识符PID,用户标识符UID)
  2. 进程控制和管理信息(进程当前状态,优先级)
  3. 资源分配清单(程序段指针,数据段指针,键盘,鼠标)
  4. 处理机相关信息(寄存器值)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8xUxdqn-1598797484412)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597917426245.png)]

组织方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YCyz9AKU-1598797484412)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597917516628.png)]

  1. 链接方式(将PCB多个队列,操作系统持有指向各个队列的指针)
  2. 索引方式(只是将队列改为索引表)
特征

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nMGx8QF5-1598797484413)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597917621088.png)]

动态性是进程的最基本的特征

进程是资源分配、接受调度的基本单位

进程的状态和各个状态的转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l1RUiTSM-1598797484413)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597917881833.png)]

三种基本状态
运行态:

占有CPU,并在CPU上运行

就绪态:

已经具备运行条件,但没有空闲CPU,而暂时不能运行。

阻塞态:

等待某一时间而暂时不能运行。

另外两种状态
创建态:

进程运行之前,需要进行一定的处理,这个状态就叫做创建态

终止态:

进程结束之后,需要对资源进行释放。

进程状态的转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AiiSMgd1-1598797484414)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597918335382.png)]

就绪态:除了处理机以外,拥有其他的所有资源,进入运行态时需要恢复运行环境(因为之前可能执行过)

运行态:所有的资源包括处理机资源

运行态——>就绪态(时间片到或者处理机被抢占)

阻塞态:其他的资源有些还未到位,并且处理机资源也没有。

运行——>阻塞:是一种主动行为,由进程自身做出的主动行为

阻塞——>就绪:进程不能控制,是一种被动行为

如果遇到不可预知的错误:进入终止态,被撤销

阻塞态不能进入到就绪态,就绪态也不能直接进入到阻塞态,阻塞态也不能直接进入到运行状态。

进程控制

定义:

就是实现进程状态转换(包括创建态和终止态)

原语:

原语是一种特殊的程序。

问题:如果一个进程在执行完毕后,却没有来得及写入状态信息会发生什么?(出错)

用原语实现进程控制。

特点:执行期间不允许中断,只能一气呵成

称为原子操作。

原理:通过关中断(执行时关中断,避免新的中断进入)和开中断指令完成(执行完毕后开中断,可以被中断)

关中断/开中断只能在核心态下执行的特权指令,所以原语也运行在核心态。

做到三类事(1.更新信息2.插入PCB3.分配/回收资源)

创建原语

从无到创建到就绪态就是创建原语干的事情。

  1. 申请空白PCB
  2. 为新进程分配所需资源
  3. 初始化PCB
  4. 将PCB放入就绪状态
撤销原语

就绪态/阻塞态/运行态——>终止态——>无

  1. PCB集合中找到要终止的PCB
  2. 若进程在运行,直接剥夺CPU,将CPU再分配
  3. 终止其所有子进程
  4. 将该进程拥有的所有资源归还
  5. 删除PCB
阻塞原语(与唤醒原语配合使用)
  1. 找到要阻塞的PCB
  2. 保护进程运行状态,并设状态信息为阻塞态,暂停运行进程
  3. 放入相应事件的等待队列
唤醒原语

阻塞——>就绪

  1. 等待队列中找到PCB
  2. 溢出等待队列,设置状态为就绪态
  3. 插入就绪队列

(不分配资源,因为分配资源是被动进行的)

切换原语

如果当前切换的PCB是运行态,则变为阻塞态或就绪态

如果是就绪态,则变为运行态。

  1. 将运行环境存入PCB
  2. PCB移入相关队列
  3. 选择另外一个进程执行,更新其PCB
  4. 根据PCB恢复进程所需的运行环境。

进程通信

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AhiL5ZPN-1598797484414)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597927278015.png)]

进程之间的信息交换

各进程拥有的内存地址空间相互独立。(进程是分配资源的基本单位)

为了保证安全:一个进程不能直接访问另外一个进程的地址空间。

共享存储

操作系统会生成一个共享空间,用于存放分享的信息。

两个进程对于共享空间的访问必须是互斥的

操作系统只提供共享空间和同步互斥工具。

共享存储:

  1. 基于数据结构的共享:比如共享空间里面只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。

  2. 基于存储区的共享:在内存中画出一块共享存储区,数据的形式和存放位置都有进程控制,这种方式速度更快,是一种高级通信。

管道通信

管道:用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。

管道只能采用半双工通信,即同一时间段内只能实现单向的传输,如果要实现双向同时通信,需要设置两个管道

各个进程需要互斥的访问管道

数据是以字符流的方式写入管道,写满时write会被阻塞,管道空时read被阻塞

管道未写满不能读出,管道未读空不能写入

数据读出后就从管道中抛弃,即读进程最多只有一个!!!!

消息传递

进程之间的数据交换将以格式化的消息(Message)为单位。进程通过操作系统提供的发送消息/接收消息原语进行数据交换

Message包括消息头和消息体

消息头:包括发送进程ID等基础信息。

消息体:传递的信息

分为两种消息传递方式

  1. 直接通行方式

    消息直接挂到接受进程的消息缓冲队列上(每个进程都有一个消息缓冲队列)

  2. 间接通信方式

    消息需要先发送到中间实体(信箱)中。操作系统会维护一个信箱。然后对应的进程通过接收消息原语从信箱中取出。

线程、多线程模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4qAxaTp-1598797484415)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597928784753.png)]

传统的进程是程序执行流的最小单位。

现在的线程是程序执行流的最小单位,是基本的CPU执行单元。

引入线程后,进程只作为除CPU以外的系统资源的分配单元(调度的基本单位是线程)。

线程间并发:同一进程之间的线程切换,不需要切换进程环境,系统开销小。

属性

多个CPU中,每个线程可以占用不同的CPU

每个线程都有一个线程ID、线程控制块(TCB)

线程也有就绪、阻塞、运行三种基本状态

线程不拥有系统资源(进程拥有)

同一进程的不同线程之间共享进程资源,并且可以进行线程之间通信。

不同进程之间的线程切换会导致进程切换。

实现方式
用户级线程

通过应用程序通过线程库实现。

所有的线程管理工作都由应用程序负责(包括线程切换),对用户是不透明的(可以看到),对操作系统是透明的(不能看到,操作系统只能看到进程)。

可以在用户态进行。

内核级线程

内核级线程的管理工作由操作系统内核完成。

内核级线程的切换必然需要在核心态下才能完成。

可以使用n个用户级线程映射到m个内核级线程上(n>=m)

只有内核级线程才是处理机分配的单位

多线程模型
多对一模型

多个用户级线程映射到一个内核级的线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。

缺点:一个用户级线程被阻塞后,整个进程会被阻塞;多个线程不能再多核处理机上并行运行。

一对一模型

一个用户级线程映射一个内核级线程。

优点:并发能力强。

缺点:一个用户进程会占用内核级线程。线程切换由内核级完成,系统开销大。

多对多模型

n个用户级线程映射到m个内核级线程,每个用户进程对于m个内核级线程。

克服了多对一和一对一的缺点。

处理机调度的基本概念

调度:确定某种规则决定执行任务的顺序。

处理机调度:分配处理机给进程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zgVDTfvY-1598797484415)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597929708316.png)]

高级调度(作业调度)

按一定的原则从外存处于后被队列的作业中选择一个作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB)。

高级调度是辅存和内存之间的调度。每个作业只调入一次和调出一次。调入生成PCB,调出撤销PCB。

中级调度(内存调度)

引入虚拟存储技术后,可以将暂时不能运行的进程调至外存等待,等他重写具备条件且内存又稍有空闲时,再调入内存。

提高了内存利用率和系统吞吐量。

调入外存的进程状态叫做挂起状态。值得注意的是PCB并不会调入外存,而是会常驻内存,PCB会记录外存中的存放位置。被挂起的进程会进入挂起队列中。

频率比高级高。

七状态模型

挂起态分为:就绪挂起(内存不够时)、阻塞挂起两种。

通过激活和挂起来操作挂起队列。

当阻塞挂起的资源出现后,会直接进入就绪挂起。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OqsxaNKb-1598797484416)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597929441360.png)]

低级调度(进程调度)

也叫进程调度,主要任务按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。

为了实现并发执行,低级调度的调用会很高。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hYwAxkUX-1598797484416)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597929497410.png)]

调度原则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VOJOR8VZ-1598797484417)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597930407831.png)]

不能进行进程调度的情况:

  1. 处理中断的过程

  2. 进程在操作系统内核程序临界区

    临界资源:一个时间段只允许一个进程使用的资源。各进程需要互斥地访问临界资源。

    临界区:访问临界资源的那段代码。

    内核程序临界区:用于访问某种内核数据结构(例如进程的就绪队列)。

    当进程访问内核程序临界区时,会对这个临界资源进行上锁,如果进行调度,这个临界资源不会释放。

  3. 进行原子操作。

调度方式
非抢占方式

只允许主动放弃处理机。

实现简单,系统开销小,但无法及时处理紧急任务。

抢占方式。

可以被动放弃处理机。

可以处理更紧急的进程。

调度算法

调度算法属于低级调度,但由于内容过多,所以专门生成一个模块进行记录

评价指标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTaz6xuy-1598797484417)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597930968493.png)]

CPU利用率

指CPU忙碌事件占总时间的比例。

利用率=忙碌时间/总时间

系统吞吐量

单位时间内完成了作业的数量。

系统吞吐量=总共完成了多少道作业/总共花了多少时间

周转时间

(作业)周转时间:作业被提交给系统,到作业完成为止的时间。

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

(作业)平均周转时间=各作业周转时间之和/作业数

(作业)带权周转时间=作业周转时间/作业实际运行时间=(作业完成时间-作业提交时间)/作业实际运行时间

平均带权周转时间=各作业带权周转时间之和/作业数

等待时间

指进程/作业处于等待处理机状态时间之和。

等待时间=周转时间-运行时间

如果有I/O操作,等待时间=周转时间-运行时间-I/O操作时间。

响应指标

指用户提交请求到首次产生响应的时间

调度算法

饥饿:某个进程或作业长时间得不到服务。

先来先服务(FCFS)

按照作业/进程到达的先后顺序进行服务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TitA4nXB-1598797484418)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597931119725.png)]

是一个非抢占式的方法。

优点:公平、算法实现简单。

缺点:对长作业/进程有利,对短作业/进程不利,带权周转时间很大。

不会导致饥饿。

短作业/进程优先(SJF/SPF)

原理:最短的作业/进程优先得到服务。

既有抢占式,也有非抢占式方法。

抢占式的短作业优先算法,又称为最短剩余时间优先算法(SRTN)

SRTN(抢占式的短作业优先算法):

每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,但其概念运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度。

优点:“最短的”平均等待时间、平均周转时间

缺点:执行时间不好确定

饥饿:会产生饥饿。

FCFS考虑了作业的等待时间没有考虑执行时间,所以对长作业友好。SJF考虑了执行时间,没有考虑等待时间,所以对短作业优先

高响应比优先(HRRN)

算法思想:综合考虑等待时间和执行时间。

规则:每次选择响应比最高的作业/进程提供服务。

响应比=(等待时间+要求服务时间)/要求服务时间

既可以用于作业调度,也可以用于进程调度。

一般来说是非抢占式方法。

优点:综合考虑了等待时间和运行时间

不会导致饥饿。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKY52TZG-1598797484418)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597932738799.png)]

以下是适用于交互式的算法

时间片轮转算法(RR:Round-Robin)

常用于分时操作系统,更注重响应时间。

算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放入就绪队列重新排队。

用于进程调度

若进程未能在时间片内运行完,则被强行剥夺使用。属于抢占式算法。由时钟装置发出时钟中断来通知CPU时间已到。

注意时间片轮转的就绪队列,同一个时间内,新调入的在从运行状态结束的进程之前

当时间片设置过大的时候,会导致时间片轮转算法退化为FCFS算法。

当时间片设置过小时,会导致系统会花大量的时间来处理进程切换。

优点:公平、响应快、适用于分时操作系统。

缺点:进程切换有一定开销,不区分任务的紧急程度。

不会导致饥饿。

优先级调度算法

适用于实时操作系统

每个作业/进都有自己的优先级,调度时选择优先级最高的作业/进程。

既可以处理作业,也可以处理进程

抢占式、非抢占式。抢占式需要在就绪队列变化时,检查是否会发生抢占。

根据优先级是否能够动态改变,分为静态优先级和动态优先级。

通常:系统进程高于用户进程;前台进程优先级高于后台进程。;操作系统偏好I/O进程(也叫I/O繁忙型进程,与其对应的是计算型进程(CPU繁忙型进程)),主要原因是I/O可以与CPU并行执行。

优点:可以适用实时操作系统。

缺点:可能会导致饥饿。

多级反馈队列调度算法

思想:对其他调度算法的折中权衡。

  1. 设置多级就绪队列,各级队列优先级从高到底,时间片从小到大
  2. 新进程先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进入下一级队列队尾,若已经是最后一级,则重新放到最后一级的队尾
  3. 只有第k级队列为空时,才会为第k+1级对头的进程分配时间片

用于进程调度

抢占式算法。(若高级的队列有进程进入时,会直接抢占处理机)

优点:对各个类型的进程相对公平。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaXQ8YxC-1598797484419)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597981080279.png)]

进程同步和互斥

同步

也叫直接制约关系,主要原理就是协调多个进程之间的工作次序。

互斥

一个时间段只允许一个进程使用,这个资源叫做临界资源。

对临界资源的互斥访问,逻辑上分为四部分:

  1. 进入区(检查是否可以进入临界区,并上锁和组织其他进程)
  2. 临界区(访问临界资源的那段代码)
  3. 退出区(负责解锁)
  4. 剩余区(做其他处理)

设置互斥需要以下原则:

  1. 空闲让进
  2. 忙则等待
  3. 有限等待
  4. 让权等待

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rY6U1jYn-1598797484419)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597992225041.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4YufsZ7r-1598797484420)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597992238169.png)]

互斥的软件实现方法
单标志法

两个进程访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进入临界区的权限只能被另外一个程序赋予。

缺点:违背空闲让进的原则

双标志先检查法

设置一个布尔型数组,各个元素用来标记个进程想进入临界区的意愿。

缺点:异步性可能导致同时访问临界区,违背了忙则等待的原则。

双标志后检查法

双标志先检查法的改版。为了避免先检查法的错误,把上锁放在检查的前面。

缺点:进入死锁状态。违背了忙则让进和有限等待的原则。

Peterson算法

思想:孔融让梨,主动让对方先使用临界区。

多设置一个公共标志,让对面先使用临界区。

缺点:没有遵循让权等待原则。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ytsxUjP-1598797484420)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597994100689.png)]

互斥的硬件实行方法
中断屏蔽

利用“开/关中断实现”,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换。

优点:简单、高效

缺点:不适用于多处理机(因为当前的关中断只能用于当前的处理机,如果有多个处理机,会导致其他处理机的进程访问互斥资源);只适用于操作系统内核进程,不适用于用户进程。

TestAndSet指令(简称TSL或TS指令)

指令用硬件实现的,执行过程不允许被中断,只能一气呵成。

优点:实现简单;适用于多处理机环境。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IUOjBUGd-1598797484421)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597994631197.png)]

缺点:不满足让权等待原则,暂时无法进入临界区的进程会占用CPU一直判断。

Swap指令

执行过程不允许子终端,只能一气呵成。硬件实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8V5Vltm-1598797484421)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597994721142.png)]

思想:交换lock和old的值。

优点和缺点与TSL相似。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FRINmyds-1598797484422)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597994779879.png)]

信号量机制(整形信号量和记录信号量最大的区别就是记录信号量解决了让权等待问题)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FAop1xiZ-1598797484422)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597995897944.png)]

用户可以通过操作系统的一对原语对信号量进行操作,从而很方便的的实现进程互斥、进程共享。

信号量其实就是一个变量(可以为整数或其他高级记录变量),可以用来表示某种资源的数量进行。

原语最重要的特性就是不可被中断。

原语就用于解决检查和上锁不统一的问题。

一对原语:wait(S)原语(P操作,资源减一)和Signal(S)(V操作,资源加一)原语

存在的问题:不满足“让权等待”原则,会发生“忙等”。

整形信号量

用一个整数型的变量为信号量,用来表示系统中的某种资源的数量。

对应操作只有三种:初始化、P操作、S操作

记录型信号量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C20DUI1R-1598797484422)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597995776469.png)]

在整形信号量的基础上,增加一个等待队列,并增加阻塞和唤醒功能。

对于正在请求资源的时候,把等待资源的进程使用block原语让其进入阻塞状态,并且将其记录到等待队列中;当signal原语对资源进行释放的时候,就是用wakeup原语唤醒一个进程。

等待的进程数是value的绝对值。

优点:遵循了“让权等待”原则,不会出现“忙等”现象。

用信号量机制实现进程互斥和同步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GpxGQf16-1598797484423)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597996473087.png)]

互斥

设置互斥信号量mutex,初值为1。使用临界区之前执行P操作,临界区之后执行V操作。

对于不同的临界资源要设置不同的互斥信号量。

同步

进程同步:解决异步性带来的进程没有顺序执行的关系。

就像实验做的ABC哪个问题一样,设置多个同步信号量,判断之间的关系

前驱关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HEdjGRdp-1598797484423)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597996460182.png)]

多层同步关系,S1执行后才能执行S2,S2执行后才能执行S4;S4、S5、S3执行过后才能执行S6。

每一个关系都需要设置一个同步信号量(每一个箭头)

相应的互斥和同步问题

生产者和消费者问题

生产者、消费者共享一个初始为空、大小为n的缓冲区。

缓冲区不空,消费者才能取出产品。(同步关系)

缓冲区没满,生产者才能放入产品。(同步关系)

为了保证缓冲区不被覆盖,需要让缓冲区互斥访问

同步P操作和互斥P操作的顺序不能颠倒(互斥应该放在同步之后),否则会出现死锁现象。(比如wait(empty)和wait(mutex)如果直接wait(mutex)的话,此时却没有wait(empty)并且消费者也不能释放empty)

为了增加效率,可以将不访问临界资源的代码放在临界区外。

多生产者多消费者

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kMNO1SAm-1598797484424)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597997346085.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKXPIvLu-1598797484424)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597997513202.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ODs2xP8G-1598797484425)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597997524119.png)]

如果盘子容量为2时,两个进程可能会导致覆盖问题(即不知道可以都是对第一个容量进行操作)。

吸烟者问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vaKKN5vJ-1598797484426)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597997773044.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0G7Wvf0A-1598797484426)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1597998061110.png)]

读者写者问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E77MR7oY-1598797484427)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598000579741.png)]

  1. 允许多个读者读取文件。
  2. 只允许一个写者写信息。
  3. 任意写者工作时不允许其他读者或写者工作。
  4. 写进程工作时,应该让所有的读者全部退出。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kemFHpiv-1598797484427)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598000906222.png)]

在读文件源源不断地情况下,保证写操作地顺利执行,所以设置一个w互斥信号量,保证写优先。

哲学家进餐问题

死锁:每个人都拿左边地筷子,没有拿右边地筷子。

  1. 最多允许四个哲学家同时进餐。

  2. 奇数号拿左边的筷子,然后拿右边的;而偶数号则刚好加反。

  3. 仅当哲学家能同时拿起左右两只筷子的时候,才拿起筷子。(设置mutex操作让哲学家能同时拿起左右两只筷子)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkNK7czw-1598797484428)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598001509413.png)]

管程

信号量机制问题:编写困难,易出错。

管程:是一种更高级地同步机制。

定义:
组成:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6xjfBGX-1598797484428)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598001682139.png)]

类似于面向对象地类。

特征:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXJVVCYf-1598797484429)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598001714988.png)]

管程地过程(函数)中可以使用P、V操作,主要是用于实现同步操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hzVqVVCF-1598797484429)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598002138430.png)]

死锁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6rzTMry9-1598797484430)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598003377354.png)]

概念

在并发环境下,各个进程竞争资源造成地一种相互等待对方手里资源地情节。

死锁、饥饿、死循环

死锁:各进程互相等待资源,导致每个进程都阻塞。至少有两个或两个以上进程发生死锁

饥饿:由于长期得不到想要的资源,某进程向前推进地现象。可能只有一个进程发送饥饿,比如长期得不到处理机

死循环:某进程执行过程中一直出现某个循环的现象。处于运行态,是Bug导致的,可能只有一个进程出现死循环

产生死锁的条件
1.互斥条件

必须互斥使用的资源的争抢才会导致死锁。

2.不剥夺条件

进程所获得的资源未使用完之前,不能由其他进程强行夺走。

3.请求和保持条件

进程至少拥有一个资源,然后又申请了新的资源请求,然后这个资源又被其他进程占有。

4.循环等待条件

存在一种进程资源的循环等待连。

发生死锁时一定有循环等待,但是循环等待不一定发生死锁。(如果每类资源只有一个,那么循环等待就必然会导致死锁)

死锁的处理策略
预防死锁(破坏死锁的四个条件)静态策略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GoRE9DUp-1598797484430)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598003976692.png)]

破坏互斥条件

使用SPOOLing(增加中间处理者的方式处理所有互斥请求)技术将独占技术在逻辑上改造成为共享设备。

破坏不剥夺条件

当进程长时间请求新的资源不能满足,则必须立即释放保持的所有资源。或者根据优先级强行抢夺资源。

缺点:实现复杂,释放资源可造成前一阶段的失效;反复申请和释放会降低系统吞吐量。

破坏请求和保持条件

可以采用静态分配方法,即在进程运行前一次性请求分配所需要的全部资源。

缺点:资源利用率极低,可能会导致进程饥饿。

破坏循环等待条件

可以采用顺序资源分配法,给资源编号,规定每个进程必须按照编号递增的顺序请求资源,同类资源一次申请完。

这样会导致一个进程只有已占有小编号的资源,才能申请大编号的资源。

缺点:不方便增加新设备;实际使用资源的顺序可能与编号的递增顺序不一致,会导致资源浪费。

避免死锁(避免系统进入不安全状态(银行家算法))动态死锁
安全序列

安全序列:如果系统按照这个序列分配资源,则每个进程都能顺利完成。只要有一个安全序列,系统就是安全状态,如果一个都没有,则系统进入了不安全状态。这就意味着可能所有进程都无法顺利的执行下去,但是如果有一些进程提前归还了资源,则系统可能重新回到安全状态。

安全状态:不可能发生死锁。

不安全状态:可能发生死锁

银行家算法

思想:在资源分配之前预判断这次分配是否会导致系统进入不安全状态,以此决定是否分配请求,不答应则让进程先阻塞。

安全性算法:

对于多种资源,通过拓展为多维向量进行。

计算出所有进程最多还需要的资源数,然后轮流与系统剩余可用资源进行对比,如果剩余可用资源满足的话,就释放进程已占有的资源数,然后继续对其他的进程进行再次比对。

如果最后所有的进程都可以满足,就代表这是一个安全序列,不可能发生死锁。否则可能发生死锁。

银行家算法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2L8XV55U-1598797484431)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598005032049.png)]

当试探分配后,就可以将对应进程已分配、最多需要、当前资源进行修改。

然后操作系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态,若安全则正式分配,否则进程阻塞等待。

死锁的检测和解除(允许死锁的发生,然后采取某种措施解除死锁)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5xkjiRl-1598797484431)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598005847944.png)]

死锁的检测

对系统已经发生死锁进行检测,必须:

  1. 某种数据结构来保存资源的请求和分配信息
  2. 提供一种算法,利用上述信息检测系统是否已经进入死锁状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VafZQP8e-1598797484432)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598005378442.png)]

如果能消除所有的边,就称为是可完全简化的,此时一定没有发生死锁(即找到一个安全序列)

如果最后不能消除所有边,此时就是发生了死锁。

最终还连着的边就是死锁状态的进程。

死锁的解除

化简资源分配图后,还连接着边的哪些进程就是死锁进程。

解除:

  1. 资源剥夺:挂起某些进程,然后抢占资源。可能导致饥饿
  2. 撤销进程:强行撤销进程,释放资源,可能导致付出代价较大
  3. 进程回退:让一个或多个死锁进程回退到避免死锁的地步。要求系统要记录进程的历史信息。

内存

概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gk0JpaH8-1598797484432)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598014833194.png)]

指令放在进程的程序段中。

指令需要给出变量的实际存放地址(物理地址),但是在实际生产及其指令的时候,并不知道进程的数据会被放在哪个位置,所以编译生成的命令是使用逻辑地址(相对地址)

编译时产生的指令只关心“相对地址”,实际放入内存中时再想办法根据起始位置得到绝对地址。

相对地址:逻辑地址

绝对地址:物理地址。

编译过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0f8nmj7D-1598797484433)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598013773545.png)]

编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)

链接:将编译后形成的目标模块以及所需要的库函数链接在一起,形成一个完整的装入模块(这里形成完整的逻辑地址)

装入:由装入程序将装入模块装入内存运行(这里合成物理地址)

装入

装入的三种方式(三种方式完成逻辑地址对物理地址的转换)

绝对装入

编译时如果就能知道程序放到内存中的哪个位置,编译程序就将产生绝对地址的目标代码,装入程序按照装入模块中的地址,将程序和数据装入内存。

缺点:灵活性很低,只适用于单道批处理系统

静态重定位

又称为可重定位装入。编译、链接后的装入模块的地址都是从0开始,指令中使用的地址、数据存放的地址都相当于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对内存进行“重定位”,将逻辑地址转换为物理地址(即加上起始地址地址变换是在装入时一次完成的)

静态重定位的特点就是在一个作业装入内存时,必须分配其所有的内存空间,如果没有足够的内存,就不能装入该作业。并且装入的作业在地址中无法动态改变

动态重定位

又称为动态运行时装入。编译、链接后的装入模块的地址都是从0开始。装入程序把装入模块装入内存后,并不会直接把逻辑地址转换为物理地址,而是把地址转换推迟到真正要执行的时候才进行。因此装入内存后所有的地址依然是逻辑地址。需要一个重定位寄存器的支持。

重定位寄存器存放装入模块的起始地址。

采用动态定位时允许程序在内存中移动;可以装入部分程序、可以分配到不连续的存储区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLt5EpeO-1598797484433)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598014589780.png)]

链接方式
静态链接:

运行之前把一次所有的目标模块和需要的库函数链接成一个完整的可执行文件(装入模块),之后不再拆开。

装入时动态链接

装入时动态链接:将个目标模块装入内存时边装入边链接的链接方式

运行时动态链接:

程序执行时,需要该模块,才将该模块进行链接。优点:便于更新和修改还有对目标模块的共享。

内存管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVxOnRHo-1598797484434)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598016812944.png)]

负责的功能
  1. 内存空间的分配和回收。
  2. 提供某种技术从逻辑上对内储存空间进行扩充。
  3. 负责逻辑地址与物理地址的转换。
  4. 内存保护,操作系统要保证各个程序互不干扰。
内存保护

可采用两种方法

  1. CPU设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
  2. 采用重定位寄存器,也称基址寄存器和界地址寄存器(也叫限长寄存器)进行越界检查,重定位寄存器中存放的起始物理地址,界地址寄存器中存放的是进程的最大逻辑地址。
内存扩充

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4wyC7BS-1598797484434)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598019440125.png)]

覆盖技术

思想:将程序分为多个段(多个模块),常用的常驻内存,不常用的在需要时调入内存。

内存中分为一个“固定区”和若干个“覆盖区”。

需要常驻的放在固定区,调入后就不再调出。(除非运行结束)

不常用的放入“覆盖区”,需要时放入内存,不需要时放入外存。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bvkyyv5o-1598797484435)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598017099711.png)]

覆盖结构必须由程序员声明,操作系统完成自动覆盖。

缺点:对用户不透明,增加了用户编程负担。

交换技术

思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,将外存中已具备条件的进程换入内存。

其实就是处理机中级调度。

被调出的进程的PCB需要常驻内存(要根据PCB中的信息对进程进行管理)。

中级调度(内存调度):就是要决定将哪个处于挂起状态的进程重新调入内存。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ppppv4PX-1598797484435)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598017804966.png)]

交换位置

具有对换功能得到操作系统中,通常把磁盘分区分为文件区和对换区两部分,文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件空间的管理采用离散分配方式。

对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,通常对换区采用连续分配方式。

总之,对换区的I/O速度比文件区更快。

交换时机

内存吃紧的时候换出,缺页多的时候就换入。

换出进程的优先级

可优先换出阻塞进程,可以换出优先级低的进程,为了防止优先级低的进程的内存在调入后很快又被换出,系统会考虑内存的驻留时间。

覆盖在同一个程序或进程中进行的

交换是在不同进程或作业之间进行

内存空间的分配和管理(连续分配)

连续分配:指为用户进程分配的必须是一个连续的内存空间。

非连续分配:不一定是连续的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMIiJ5MP-1598797484435)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598021051660.png)]

连续分配:

单一连续分配

内存分为系统区和用户区

系统区通常位于内存的低地址部分,用于存放操作系统的相关数据;用户区用于存放用户进程相关数据。

内存中只能有一道用户程序,用户程序独占整个用户区空间

优点:实现简单,无外部碎片,可以采用覆盖技术扩充;不一定采用内存分配

内部碎片:分配的内存区域中有一段没有用到。

缺点:只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率低。

固定分区分配

在单一连续分配的基础上,将内存分为多个分区,每个分区就像一个单一连续分配的内存一样,只能装入一道作业。

固定分区分配分为两种:1. 分区大小相等(没有灵活性);2.分区大小不等(把用户区分为多个大小相等的块,然后由这些块自由组合分区;增加了灵活性)

操作系统需要建立一个数据结构——操作说明表,每个表项对应一个分区,内有详细信息。

优点:不会产生外部碎片

缺点:产生内部碎片;程序太大放不下只能用覆盖技术优化,但会增加开销。

动态分区分配

也叫可变分区分配,不会预先划分内存分区,在进程装入内存根据进程的大小动态建立分区。(系统分区大小和数目可变)

建立了一个分区后会将整个内存进行截断,被截断了的就叫空闲分区

记录信息的数据结构
  1. 空闲分区表(表存储每个空闲分区的基础信息,这里指被截断了)
  2. 空闲分区链(双向链表,指向前一个空闲指针和后一个空闲指针)
空闲分区分配

问题:多个满足条件的分区如何选择

需要按照一定的动态分区分配算法(后面讲)

分区的分配和回收

分配了空闲分区,需要对对应的数据结构存储的信息进行更改。

回收:

  1. 回收区的后面有一个相邻的空闲分区

    需要把在数据结构中的信息的起始地址和分区大小进行合并。上面融入下面。

  2. 回收区的前面有一个相邻的空闲分区

    也是更改信息,下面的融入上面的。

  3. 回收区的前面和后面都有一个相邻的空闲分区

    修改相应的信息,从下到上合并。

  4. 前后都没有相邻的空闲分区

    需要增加一条信息,即记录增加一个空闲分区信息。

缺点:有外部碎片

优点:没有内部碎片

外部碎片:内存中的某些空闲分区太小利用不上。(可以用紧凑技术来解决内部问题)

内部碎片:分配给某进程的内存区域,如果有些部分没有用上。

动态分区分配算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKvoctvl-1598797484436)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598078811003.png)]

前提:有很多空闲分区满足分配需求

首次适应算法

思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。

实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表)。

优点:可能将后面的大分区保留。

最佳适应分配算法

算法思想:对于多个满足条件的空闲分区,优先选择小的空闲分区

实现:按照容量递增次序(从小到大)链接。每次分配内存顺序查找。

缺点:会产生很多的外部碎片

最坏适应思想

思想:与最佳适应分配算法,优先选择大的空闲分区,此时就会空留比较大的空间。

实现:按照容量递减次序(从大到小)链接。每次分配内存顺序查找。

缺点:如果有大进程到来,没有足够的分区分配

邻近适应算法

思想:解决首次适应算法的查找开销,每次从上次的结束位置开始查找空闲分区。

实现:以地址递增为顺序,每次分配内存从上次的结束位置开始查找。

缺点:可能没有大分区

内存空间的分批和管理(不连续)

想法:允许将一个进程分散装入不相邻的分区中。

连续分配:为用户进程分配的必须是一个连续的内存空间

非连续分配:为用户进程分配的是一些分散的内存空间

基本分页存储方式(把固定分区分配改造为非连续分配版本)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b6VIbHIv-1598797484436)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598082553156.png)]

处理大进程装不下的方法:将进程分为多个部分装入不同的分区。分区大小越小,内存碎片会更小,内存利用率更高。

将内存空间分为一个个大小相等的分区(每个分区就是一个“页框”或“物理块”。每个“物理块”有一个编号,即“物理块号”,物理块号从0开始);于是可以把用户进程的地址空间分为与物理块大小相等的一个区域,称为“页面”,每个页面都有一个编号,也是从0开始,叫做页面号;每个进程的最后一个页面可能占不满一个物理块;操作系统以物理块为单位为每个进程分配内存空间,页面和物理块是一一对应的关系;各个页面不必连续存放,也不必按先后顺序来,可以放到不同的物理块中。

分页之后如何进行逻辑到物理地址的转换?

思想:根据每个页面的页号求得对应的物理起始位置,然后算出对应的偏移量(偏移量是指,页面内部逻辑地址的偏移量,例如指令逻辑地址81,当前页面的起始逻辑地址50,则偏移量为31)就可以得到实际物理地址。

实现:

  1. 算出逻辑地址对应的页号
  2. 要知道该页号对应页面在内存中的物理起始位置。
  3. 要算出逻辑地址在页面内的“偏移量”
  4. 物理地址=页面始址+页内偏移量

页号=(int)逻辑地址/页面长度(例如页号=80/50=1)

页内偏移量=逻辑地址%页面长度(例如偏移量=81%50=31)

操作系统会用某种数据结构记录各个页面的起始位置。可以通过页号去查找物理起始位置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVF9KAAx-1598797484437)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598081811231.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aimPPDiJ-1598797484437)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598081897530.png)]

逻辑地址结构固定不变

地址结构包含两个部分:前一部分为页号,后一部分是页内偏移量(最大偏移量<=物理块大小)。

如果有K位表示页内偏移量,则表示系统中一个页面的大小是2k个页面

单级页表

为了知道进程每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。

  1. 每个进程对应一张页表

  2. 进程的每一页对应一个页表项

  3. 每个页表项由“页号”和“块号”(“物理块号”)组成

  4. 页表记录进程页面和实际存放页面的内存卡之间的对应关系。

  5. 每个页表项的长度是相等的,页号是隐含的

    只需要知道页表存放的起始位置和页表项长度(物理块号的最大字节,例如4GB内存,物理块大小4KB,则最多220个物理块,为了表示这些内存块的编号,至少需要3个字节,所以页表项长度就为3B),就可以算出对应的页号(此时的页号就从起始位置开始,加了1个3B就是1,2个3B就是2)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5AvyIohb-1598797484438)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598082274120.png)]

基本地址变换机构

基本地址变换机构:用于实现逻辑地址到物理地址转换的一组硬件机构的原理和流程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KCewO6LJ-1598797484438)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598084462886.png)]

通常会在系统中存放一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M,进程未执行时,页表的始址和页表长度放在进程控制块PCB中,当进程被调度时,操作系统会把它们放到页表寄存器中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uP0WFBCh-1598797484439)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598083128691.png)]

步骤:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNB7FyZl-1598797484439)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598083361687.png)]

例题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7KzlHDC-1598797484439)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598084062134.png)]

一维:即只需要一个逻辑地址信息

页表项大小为3B时,可能出现的查找问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmRmG9tv-1598797484440)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598084348572.png)]

具有快表的地址机构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwcWsQqy-1598797484440)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598085359201.png)]

在基本地址变换机构上进行改进。

局部性原理:

时间局部性:如果执行了程序的某条指令,那么不久后这条指令有可能再次执行;如果某个数据被访问过,不久之后该数据可能会被再次原理。

空间局部性:一旦程序访问了某个存储单元,不久之后,其附近的存储单元也可能被访问(因为很多数据在内存中都是连续存放的)

时间局部性原理和空间局部性原理统称为局部性。根据这个特性,可能多次查询查找的是一个页表项,所以能不能简化查询页表的操作?

快表:又叫联想寄存器(TLB),用于存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表叫做慢表。

优化思想:将最近使用的页表项会放入快表(访问速度快),下一次查询对应的页号直接通过寄存器(即快表)查询。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K5fLiC7R-1598797484441)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598085068389.png)]

变换过程和实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiQMEk88-1598797484441)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598085343741.png)]

两级页表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S8cNYEEZ-1598797484442)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598086748372.png)]

目的:解决单级页表的问题

问题:

  1. 当页表项过多时,由于单级页表隐藏页号的特性,需要显式的计算出页号,前提是页表项连续的存储,这就会需要一个非常大的空间,违背了离散分配的目的。(解决:将页表进行分组,使每个物理块能刚好放入一个分组,此时就需要为离散分配的页表再建立一张页表,称为页目录表、外层页表、顶层页表;页目录表记录的是对应的页表分组的内存块号,此时对应的地址结构也要发生变化)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9902c2HH-1598797484442)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598086399931.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7HAdYym-1598797484442)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598086568231.png)]

    两级页表需要访问三次内存:1.页目录表2.二级页表3.访问目标内存单元

  2. 由局部性原理可以得知,只需要一些页表项常驻内存就够了(解决方法,虚拟存储技术用一个标志位表示该页面是否已经调入内存。若想访问的页表项不在内存,则产生缺页中断(内中断))。

基本分段存储管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jffNU0He-1598797484443)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598090580858.png)]

与分页区别:离散分配时所分配的地址空间的基本单位不同。

分段

进程的地址空间:按照程序自身的逻辑地址划分为若干个段(可能是若干个函数),每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编制。

内存分配:以段为单位进行分配,每个段在内存中占据连续空间,但各段可以不相邻。

优点:由于是按照逻辑功能模块划分,用户编程更方便。(编程时使用段名操作各个段,CPU操作时会使用段号操作。编译程序会将段号转为段名)

定义

分段系统的逻辑地址由段号和段内地址(段内偏移量)

段号的位数决定了每个进程可以分几个段

段内地址位数决定了每个段的最大长度

段表

与页表相似,只不过段表由段号、段长、基址(起始地址)。

段长不同,但是段表项的长度是相同的。

段号是隐含的,不占存储空间。

只要知道段表的起始地址,就可以找到对应的段表项。

地址变换

段表寄存器用于存放段表起始地址F和段表长度M。

地址转换基本与分页存储相同,只有需要判断偏移量是否超过对应的段长

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHQpJjxH-1598797484443)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598090030391.png)]

分页、分段管理对比

页是信息的物理单位,分页仅仅是系统管理上的需要,用户不可见。页的大小由系统确定,固定;分页的用户进程地址空间是一维的,程序员只需要给出一个记忆符就可以表示一个地址(即逻辑地址,在用户看来,逻辑地址并没有因为分页而分开,而是在系统的操作下在变换的时候进行加减)

段是信息的逻辑单位。分段的主要目的是更好的满足用户需求,对用户是可见的,段的大小不固定;用户的地址空间是二维的,用户在编程的时候就有分段了,需要自己给出段名和段内地址。

分段优点:更容易实现信息的共享(不属于临界资源的代码可以被共享访问即不能被修改的代码——纯代码)和保护。

也可以引入快表机构,通过将段表内容拷贝到寄存器中,减少内存访问。

段页式管理方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pkPt02l8-1598797484444)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598091360156.png)]

是分页和分段管理方式的结合。

分页:不会产生外部碎片;但不太适合实现信息的共享和保护。

分段:产生外部碎片(段长过大);但适合实现信息的保护和共享。

定义

先将进程按照逻辑模块进行分段,然后将各段进行分页。

逻辑地址结构

由段号(决定每个进程分为多少个段)、页号(每个段最多有多少页)、段内地址(页内偏移量,决定物理块大小)组成。

分段对用户可见,用户需要显式给出段名和页内偏移量,但是分页对用户是不透明的,所以分页工作由操作系统完成,所以段页式管理的地址结构是二维的(只需要提供段名和页内偏移量)

段表、页表

每个进程都有一个段表,每个段对应一个段表项,每个段表项由段号、页表长度、页表存放块号(页表起始地址)组成,每个段表项长度相等,段号是隐藏的。每个段对应一个页表,页号隐含的。

地址转换

需要一个段表寄存器用于找到段表存储地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vaTFPZLh-1598797484444)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598091297935.png)]

虚拟内存
基本概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QWw5pRmx-1598797484445)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598092412814.png)]

传统存储管理的特征和缺点(连续分配、非连续分配)
  1. 一次性:作业必须一次性装入内存才可以使用,导致:1大作业无法运行(无法一次性装入);2.大量作业要求运行时,内存无法容纳,只有少量部分运行,并发度下降。
  2. 驻留性:一个作业一旦装入内存,就会一直驻留在内存中,直到作业运行结束,尽管这些数据用不到。

虚拟存储通过局部性原理解决这个问题。

高速缓冲的思想:将频繁访问的数据放到更高速的存储器中。

虚拟技术:很快要用到的部分装入内存,暂时用不到的部分露在外存;并且在程序执行过程中,操作系统需要从外存调入;内存空间不够时,操作系统需要将不用的信息换到外存。

虚拟内存的最大容量:计算机的地址结构CPU寻址范围确定的

虚拟内存的实际容量=min(外存和内存容量之和,CPU寻址范围)

特征

多次性:作业可以多次调入内存

对换性:无需长期常驻内存,允许在作业运行过程中,将作业换入、换出

虚拟性:从逻辑上扩展了内存的容量。

实现

前提:必须是建立在离散分配的内存管理方式之上(因为只有这样才能将进程的一部分调出内存而不是类似中级调度直接将进程调出)

三种实现方式的区别:

1.当访问信息不再内存时,操作系统需要将信息从外存调入内存(即提供请求调页/调段功能)

2.若内存不够,需要置换不常使用的部分换出内存。(即提供页面置换/段置换功能)

对换是以页或段的形式进行外存和内存之间的转换(进程可以执行),而中级调度是以进程的方式进行转换(此时进程无法执行)

请求分页存储管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iHebeWCh-1598797484446)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598171826491.png)]

请求分页存储管理与基本分页存储管理的主要区别:

  1. 当访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存。(需要提供请求调页功能)
  2. 若内存空间不够,由操作系统负责将内存中用不到的信息换出外存。(需要提供页面置换功能)
页表机制

需要记录页面是否调入内存,以及页面如果在外存的存储位置。

需要实现页面置换,需要记录每个页面的指标用与判断是否换出。

如果页面没有被修改,就不用浪费时间覆盖了。

增加字段

  1. 状态位(是否调入内存)
  2. 访问字段(记录最近被访问几次,用于判断是否置换)
  3. 修改位(标记调入内存后数据是否被修改过)
  4. 外存地址(页面在外存中存放的位置)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LzYEEUCe-1598797484446)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598171086552.png)]

缺页中断机构

给出逻辑地址,判断访问的页面是否在内存,如果不在,便产生一个缺页中断,然后由操作系统的缺页中断程序处理中断,此时缺页的进程被阻塞,放入阻塞队列,调页完成后再将其唤醒,放入就绪队列;1. 如果内存有空闲,直接分配;2.如果没有空闲,通过页面置换算法选择一个页面淘汰,如果被修改过,需要重新写入外存,然后空闲出的内存分配

缺页中断:属于内中断

一条指令可能在执行过程中产生多次缺页中断。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jj5fuhWv-1598797484447)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598171424238.png)]

如果在请求分页存储管理中:快表中有的页面必须存放在内存中,如果某页被调入外存,快表中的相应表项也要被删除;调入内存的表会直接调入快表而无需写入慢表;所有的更改和加入其实都可以直接在快表中进行,只是如果要把快表项从快表中删除时需要拷贝到慢表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-570c8iG5-1598797484447)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598171503472.png)]

页面置换算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PN2tGZfs-1598797484448)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598173674703.png)]

  1. 最佳置换算法(OPT)

    每次选择淘汰页面以后不会被使用或者最长时间内不再被执行的页面。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xBiDODca-1598797484448)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598172009864.png)]

    缺页中断未必发生页面置换(可能有空闲内存块)

    缺页率=缺页中断次数/总的访问页面

    缺点:无法实现,无法预知使用次数

  2. 先进先出置换算法 (FIFO)

    淘汰的页面是最早进入内存的页面。

    Belady异常:当为进程分配的物理块数增大时,缺页次数不减反增。

    只有FIFO会产生Belady异常

    缺点:算法效率低

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

    淘汰的页面是最近的最久未使用的页面。

    实现:在页表项中用访问字段记录该页面自上次被访问以来所经历的时间t。

    做题:逆向扫描过程中出现的最后一个出现的一个页面就是要淘汰的页面。

    缺点:需要硬件支持,成本大

    优点:效率高

  4. 时钟置换算法(CLOCK算法或最近未用算法(NRU))

    分为简单的CLOCK算法和改进型CLOCK算法

    1. 简单的CLOCK算法

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qFZR3UoS-1598797484449)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598173158557.png)]

      最多扫描2次

    2. 改进型的CLOCK算法

      思想:减少I/O操作次数,即优先淘汰没有被修改过的页面。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OeD6Pt7i-1598797484449)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598173653398.png)]

      最多扫描4次

页面分配策略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7oaLnNUb-1598797484450)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598175267809.png)]

驻留集:请求份额中给进程分配的物理块的集合,在采用虚拟存储技术的系统中,驻留集的大小一般小于进程的总大小;驻留集太小:导致缺页频繁;驻留集太大:资源利用率降低

固定分配:驻留集大小刚开始分配,然后大小不变

可变分配:驻留集大小刚开始分配,然后大小可变

局部置换:发生缺页时只能选进程自己的物理块进行置换

全局置换:可以把操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。

固定分配不能与全局置换,因为全局置换会把驻留集大小进行改变。

  1. 固定分配局部置换:

    缺点:很难刚开始确定进程分配多少物理块

  2. 可变分配全局置换:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LTh959hk-1598797484450)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598174189539.png)]

    未锁定:系统会锁定一些页面,这些页面中的内容不能置换出外存。

  3. 可变分配局部置换:

    只允许从自己的物理块中进行换出,如果进程频繁缺页,系统会多分配几个物理块。

何时调入页面?

  1. 预调用策略:

    根据局部性原理,调入本来要调入内存的页面周围的页面一起调入内存,不稳定,主要用于进程的首次调入

  2. 请求调用策略:

    请求调入一次就调入一次

何处调入页面?

外存分为对换区(读写速度快)和文件区

  1. 内存与对换区(前提对换区够大,否则就是内存与文件区(此时只能传入不被修改的数据))
  2. UNIX方式:全部放入文件区,被换过的放入对换区。

抖动:刚刚换入的页面马上换出外存,刚刚换出又要被换入。原因主要是分配给进程的物理块不够(太多会抖动,太少会降低资源利用率)

工作集:进程在某段时间间隔内,进程实际访问页面的集合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bx0Fhh0j-1598797484451)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598175176308.png)]

工作集可能小于窗口尺寸:可以根据工作集的大小来确定驻留集大小(一般来说来说驻留集不能小于工作集大小)

文件管理

概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fYngGzLM-1598797484452)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598175681051.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZR15jKF-1598797484452)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598175825626.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-At1c3XyG-1598797484453)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598175984512.png)]

文件的逻辑结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XGD3TiSj-1598797484453)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598187566739.png)]

逻辑结构:用户看来,文件内部的数据是如何组织起来的。

物理结构:操作系统看来,文件的数据是如何存放在外存中的。

无结构文件不需要探讨逻辑结构

有结构文件:由一组相似的记录组成,又称为“记录式文件”,一般来说每个记录都有一个数据项可以作为关键字。根据每条记录的长度是否相等可以分为定长记录可变长记录

顺序文件

文件中的记录一个接一个地顺序排列,可以是定长或可变长地,在物理上可以顺序存储(物理上也是相邻的,可变长记录无法实现随机存取;定长(可实现随机存取,若适用串结构,无法快速找到记录,若采用顺序结构,可以快速找到(二分)))或链式存储(物理上不一定相邻,无论定长/可变长记录或者串结构/顺序结构,都无法实现随机存取)

根据记录是否按照关键字排序分为串结构(顺序与关键字无关)和顺序结构(按关键字顺序排列)

默认顺序文件:指顺序存储的顺序文件。

缺点:增加/删除记录比较困难(串结构相对简单)

索引文件

解决:对于可变长记录查找方式的优化。

每个文件会建立一个索引表,每个表项会对应文件的一条记录,文件的记录是可以离散存放的,但是索引表必须连续存放。

索引表由索引号、长度、指针组成。

如果将关键字作为索引号内容,且按关键字顺序排序,可以实现折半查询。

可以根据不同的数据项建立多个索引表。

索引顺序文件

问题:索引表可能会很大,导致存储空间的利用率低。

将记录进行分组,一组记录对应一个索引表项,索引顺序文件的索引项也不需要按关键字顺序排列。

多级索引顺序文件

索引顺序文件的套娃。

文件目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-92GDEoQd-1598797484454)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598188875448.png)]

文件控制块

目录本身就是一个有结构文件,由一条条记录组成,每条记录就代表放在该目录下的文件。

文件控制块:目录文件中的一条记录就是一个文件控制块(FCB),FCB的有序集合就是“文件目录”,FCB中包含了文件的基本信息(文件名、物理地址、逻辑地址等),存取控制信息(是否可读/科协),使用信息;其中最重要的就是文件名、文件存放的物理地址。

FCB最重要的作用实现了文件名和文件之间的映射,实现“按名存储”

对目录实现的操作
搜索

根据文件名搜索

创建文件

创建一个新文件时,需要在其所属的目录中增加一个目录项

删除文件
显示目录
修改目录
目录结构
单级目录结构

整个系统只有一张目录表,实现了按名存取,但是不允许文件充满

两级目录结构

分为主文件目录(由一个主文件目录记录一个用户对于的目录存放地址)和用户文件目录(每个用户有一个单独的文件目录)

允许不同用户的文件重名。

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

类似Windows的目录,是两级目录结构的套娃。

从根目录出发的路径称为绝对路径

每次都从根目录查找,是很低效,所有可以设置一个当前目录

优点:方便对文件进行分析

缺点:不适合文件的共享。

无环图目录结构

在树形目录的基础上,增加一些指向统一节点的有向边,使政改革目录成为一个有向无环图。

可以用不同的文件名指向同一个文件,甚至可以指向同一个目录。

索引节点(FCB改进)

搜索时只需要文件名,索引可以将其他的文件信息组合为一个索引节点,然后将其单独存放,然后文件名和一个索引节点指针为一个表项,这样可以大大的提高文件检索速度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qE55GOT6-1598797484454)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598188820194.png)]

存放在外存的索引节点称为“磁盘索引节点”,放入内存称为“内存索引节点”

文件物理结构(文件分配方式,对已有的文件进行管理)

对磁盘的管理:1.对非空闲磁盘块管理2.对空闲磁盘块进行管理

基本概念

类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统,磁盘块的大小与内存块、页面的大小相同。

文件的逻辑地址空间也被分为了一个一个的文件“块”

文件的逻辑地址可以表示为(逻辑块号、块内地址)的形式。

基本与基本分页相同

连续分配

连续分配方式要求每个文件在磁盘上占有一组连续的块。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5WvBRWXA-1598797484454)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598189485105.png)]

对于块号需要在文件的目录表中存储两个信息,1.起始块号2.长度。

物理块号=起始块号+逻辑块号

支持顺序访问和直接访问。

访问两个磁盘块相隔越远,移动磁头所需时间就越长。

优点:支持顺序访问和直接访问,连续分配的文件在顺序读/写的速度最快

缺点:文件不易扩展;存储空间利用率低,会产生磁盘碎片(类似于内存中的外部碎片)

链接分配

分配离散的磁盘块,通过链接的方式连接到一起

隐式链接

记录起始块号和结束块号,每个块中存储了一个指向下一个块号。所以读取一个逻辑块i,需要从0号一直读到i,即i+1,即只支持顺序访问,不支持随机访问(查询方式低,方便扩展文件)

显式链接

把链接文件各物理块的指针显式存放在一个表中(这个表是共有的,记录的是每个块号下一个块是哪个),即文件分配表FAT。

在文件目录中只需要存储文件的起始块号。

开机时,FAT会读入内存,并常驻内存。

优点:方便文件扩展,不会有碎片问题,支持随机访问。

缺点:文件分配表的需要一定的存储空间。

索引分配

也是离散分配,系统为每个文件建立一个索引表,索引表记录了文件的各个逻辑块对应的物理块(索引块:索引表存放的磁盘;数据块:文件数据存放的磁盘块)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbvwXNmb-1598797484455)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598190483703.png)]

优点:支持随机访问,文件扩展也很容易实现。

当一个磁盘块存放不下一个索引表:

  1. 链接方案

    将索引块进行拆分,每个索引块中存储下一个索引块的指针。

    缺点:索引块之间必须采用顺序读入。

  2. 索引分配

    是基本索引分配的套娃。

    采用多层索引,则格策才能够索引大小不能超过一个磁盘块。

  3. 混合索引

    在索引分配的基础上,对于最高级的索引表包含了各个层次的索引,例如可以有直接地址(直接是磁盘块),一级间接(磁盘块上一级的地址),二级间接地址等。

文件存储空间管理(对空闲空间进行管理)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSb9pj3u-1598797484455)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598195279770.png)]

将物理磁盘分为一个个文件卷(会划分目录去和文件区)

空闲表法

有一个空闲盘块表,每个表项记录了第一个空闲盘块号,记录空闲盘块数。

适用于连续分配方式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxj6Qk42-1598797484456)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598191448832.png)]

以上的算法来自于内存连续分配的动态分配算法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JERfAVhf-1598797484456)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598191485823.png)]

空闲链表法
空闲盘块链

以盘块为单位组成一条空闲链(每一个磁盘块都有一个下一个空闲盘块的链接)

适用于离散分配方式。

空闲盘区链

以盘区为单位组成一条空闲链(将连续的磁盘块作为一个盘区,每个盘区都有一个指向下一个盘区的链接)

适用于连续分配方式和离散分配方式。

位示图法

每个二进制位对于一个盘块,比如0代表空闲,1代表已分配。因此可以用(字号(也叫行号),位号(也叫列好))对于一个盘块号。

·[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNXzW0xL-1598797484457)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598191910088.png)]

分配:直接顺序扫描位示图,找到多个盘块。

回收:根据要回收的盘号计算出字号和行号,然后修改图。

成组链接法

文件卷的目录区中专门用一个磁盘块作为超级块,当系统启动时需要将超级块读入内存,而且要保证内存与外存中的超级块数据保持一致。

超级块中存储了下一组空闲盘块数,然后记录空闲块号的块号。

若已经没有下一组空闲块,要设一个特殊值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sTLAio0W-1598797484457)(C:\Users\余伟\AppData\Roaming\Typora\typora-user-images\1598195090136.png)]

文件的基本操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值