操作系统简述复习笔记

前半段主要来自南京大学骆斌老师后半段主要来自浙江大学李善平老师的网课

图片内容来自教学课件,由于时间匆忙和作者水平有限,本文可能存在部分错误和描述含糊的地方,但均不影响读者理解。也希望各位可以提出批评,有空后也会加以改正。

文章目录

1.操作系统基本概述

1.1.操作系统的定义

操作系统是核心系统软件,其负责计算机计算机系统软件、硬件资源的分配、调度工作;控制并协调并发活动,实现信息的存取和保护;它提供用户接口,使用户获得良好的工作环境。操作系统使整个计算机系统实现了高效率和高度自动化、高利用率、高可靠性

1.2.现代操作系统的特征

最重要的特征是并发、共享,还有不确定性(指进程的执行顺序和执行时间的不确定性)
现代操作系统指的是多用户多任务的并发执行
并发:
并发性:指两个或者多个事件在同一时间间隔内发生。
并行性:指两个或者多个事件在同一时刻发生(同时发生)

1.3.操作系统的发展历史

  1. 手工阶段
    即用户是程序员(同时也为操作员),使用机器语言,输入纸带或卡片
    在这里插入图片描述
    特点:无操作系统、有人工干预、独占性、串行性
    缺点:效率较低,人机效率不同导致有效运行时间低
  2. 单道批处理系统(联机批处理)
    操作员将多个作业放入磁带中,形成了作业队列
    内存常驻监督程序,用于自动装入、运行、撤出作业
    一次只能运行一个作业
    在这里插入图片描述
    特点:输入输出由计算机直接控制
    缺点:仍为有效运行时间较低,不过是CPU和IO设备之间的矛盾
  3. 单道批处理系统(脱机批处理)
    即将程序放入卫星机中输入,中间结果存在磁带中
    特点:改善了联机批处理的缺点
    缺点:需要人工干预
  4. 单道批处理系统(执行系统)
    通过通道和中断技术,原有的监督程序不仅要负责调度作业自动地运行,而且还要提供I/O控制功能。它常驻主存,称为执行系统
    通道:一种设备,用于控制I/O设备与内存间的数据传输。启动后可独立于CPU运行,实现CPU与I/O的并行。
    中断:一种技术,指CPU在收到外部中断信号后,停止原来工作,转去处理该中断事件,完毕后回到原来断点继续工作。
    **上述操作系统中最大的缺点是:**程序执行是串行性的
  5. 多道批处理系统
    多道:内存中同时存放几个作业
    宏观上并行运行:都处于运行状态,但都未运行完
    微观上串行运行:各作业交替使用CPU
    多道批处理系统
    单道批处理和多道批处理对比:
    单道与多道的对比
    特点:
    IO设备、CPU、内存等运行效率高
    作业吞吐量大,完成的总工作量大
    缺点:用户交互性差,整个作业完成后或中间出错时,才与用户交互,不利于调试和修改
  6. 分时操作系统
    所谓分时技术,是让内存中的多道程序轮流使用CPU,即把CPU时间划分成很短的时间片(如几百毫秒),轮流地分配给各个程序使用,如果某个程序在分配的时间片用完之前计算还未完成,该程序就暂时中断,等待下一轮继续计算
    一个分时系统
    上述图片可知,多个终端公用一个主机,主机给各终端分配时间片,在宏观上并行执行所有终端的命令,但在微观上是并发的
  7. 实时操作系统
    软实时操作系统:实时系统就是那些从统计的角度来说,一个任务能够得到有确保的处理时间,到达系统的事件也能够在截止期限到来之前得到处理,但违反截止期限并不会带来致命的错误,与硬实时操作系统相比,其并没有那么严格,只是为了确定性的满足时间要求
    硬实时操作系统:硬实时系统指系统要有确保的最坏情况下的服务时间,即对于事件的响应时间的截止期限是无论如何都必须得到满足,否则会导致严重后果
  8. 多处理机系统
    ① 包含两个或多个功能相当的处理器
    ② 所有处理器共享一个公共内存
    ③ 所有处理器共享I/O通道、控制器和外围设备
    ④ 由一个操作系统控制
    总结:仅处理机为多个,其余如内存等均为单个共享
  9. 网络操作系统
    网络操作系统除了具备一般操作系统应具有的功能模块外 (如系统核心、设备管理、存储管理、文件系统等),还要增加一个网络通信模块。该模块由通信接口中断处理程序、通信控制程序以及各级网络协议软件组成
  10. 嵌入式操作系统
    是一种实时的、支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器Browser等
  11. 分布式操作系统
    分布式操作系统是网络操作系统的更高级的形式,它保持了网络操作系统的全部功能。除了具有网络操作系统的功能外,还能够将一个大的任务划分成许多可以并行执行的子任务,并按照一定的调度策略将他们动态分布给系统中的各个计算机,其与多处理机系统有一定相似之处,但不同点是其将一个任务交给多个主机共同处理

2.处理器

2.1.处理器和寄存器

处理器中有大量的寄存器,不同的寄存器有不同的作用,例如储存执行结果,储存数据地址等等。因此,寄存器多而复杂。寄存器不多作要求,可浏览知晓即可

2.1.1.CPU内部的寄存器

在CPU内部有一个控制单元,里面有指令暂存器IR和指令译码器ID,分别用于存储下一条要执行的指令和对指令进行翻译。在对指令进行翻译后,就会遇到算数逻辑单元,通过计算处理后,便会将处理后的结果存入标志寄存器Flag,并且会用程序计数器PC来统计执行的程序数。

上述的全部寄存器及其他硬件都连接在内部总线上,通过内部总线和内存相连。

2.1.2.内存中的寄存器

内存中有内存地址寄存器MAR和内存数据寄存器MDR。

2.1.3.系统总线与其他地方的寄存器

在高级的操作系统中,IO寄存器等其他寄存器可以直接和内部总线相连,这样就可以提高数据的交互速率,但在简单的操作系统中,这些寄存器都是集成在系统总线上的。

2.1.4.用户程序可见寄存器 and 控制与状态寄存器

用户程序可见寄存器:

这就可以让程序员直接与寄存器进行交互,减少访问主存储器的次数,以此来提高效率

控制与状态寄存器:

被操作系统程序所使用,用于控制程序执行

2.1.5.程序状态字PSW

PSW是一种概念,用于记录当前程序运行的动态信息

在部分计算机系统中,PSW是一个寄存器,为控制与状态寄存器

2.2.指令与处理器模式

2.2.1.机器指令

机器指令是计算机系统执行的基本命令,是中央处理器执行的基本单位。由一个或多个字节组成。

2.2.2.指令执行过程

指令的执行步骤如下:取指 解码 执行

取指是指PC从存储器中将指令放入IR中

解码是指解译IR中的指令来决定其执行行为

执行是指连接到CPU,执行运算,产生结果并写回

2.2.3.指令执行周期与指令流水线

执行周期就是 取指 解码 执行 这三个过程

而指令流水线是指当指令1进行解码时,指令2可以同时进行取指,以此类推执行与解码

2.2.4.特权命令和非特权命令

特权指令只可被操作系统内核所使用

非特权指令能够被所有程序使用

2.2.5.处理器模式

完整的处理器模式为

0:代表操作系统内核

1:代表系统调用

2:代表共享库程序

3:代表用户程序

通常只分为0与3两种模式,即对应内核模式和用户模式,即管理态和用户态

管态 (Supervisor mode)
在此状态下处理机可使用全部指令(包括一组特权指令);使用全部系统资源(包括整个存储区域)
用户态(User mode)
在此状态下禁止使用特权指令,不能直接取用资源与改变机器状态,并且只允许用户程序访问自己的存储区域

2.2.6.处理器模式的切换

用户态->管理态:可通过中断、异常或系统异常等触发

管理态->用户态:调用中断返回指令

2.2.7.系统调用和一般调用

系统调用示例:
在这里插入图片描述
系统调用和一般调用的区别:
在这里插入图片描述
访管中断:(在下一节中断中会出现)
当处理机执行到访管指令时发生中断,该中断称为访管中断,它表示正在运行的程序对操作系统的某种需求。即正常运行的程序为了获取某些资源等而产生的自发性中断,其只可在用户态运行,并且不属于用户指令

2.3.中断、陷阱、异常与系统异常

2.3.1.中断与陷阱

中断是指某个事件 (例如电源掉电、定点加法溢出或I/O传输结束等) 发生时,系统中止现行程序的运行、引出处理事件程序对该事件进行处理,处理完毕后返回断点,继续执行,其发生时间不固定

陷阱是指在用户态下,软件需要操作硬件,其就会通过指令从用户态陷入内核态(管理态),这是可以通过软件实现的,且其发生时间固定

引入中断的目的:解决主机和外部设备并行工作的问题
中断处理图

2.3.2.异常

指当前运行指令引起的中断事件,例如地址异常,处理器硬件故障

2.3.3.系统异常

指执行陷入指令而触发系统调用,如请求设备、请求I/O等,与异常不同的是,异常是当前运行指令出现问题,而系统异常是指当前指令请求某种资源等

2.3.4.中断源

总体可分为如下几种:

按中断功能分

  1. 输入输出中断:I/O传输结束或出错中断。
  2. 外中断:时钟中断等。
  3. 机器故障中断:电源故障、主存取指令错等。
  4. 程序性中断:定点溢出、用户态下用特权指令、越界、非法操作等。
  5. 访管中断:对操作系统提出某种需求时所发出的中断称为访管中断。

按中断方式分

  1. 强迫性中断
    这类中断事件不是正在运行的程序所期待的,而是由某种事故或外部请求信号所引起的。例如 输入输出中断、外中断、机器故障中断、程序性中断
  2. 自愿中断
    它是运行程序所期待的事件,这种事件是由于执行了某条访管指令而引起的。例如访管中断

按中断来源分
1) 外中断
由处理机外部事件引起的中断。例如输入输出中断、外中断。
2) 内中断,又称为俘获
由处理机内部事件引起的中断。例如访管中断、程序性中断、机器故障中断。

2.4.中断系统

2.4.1.中断系统的构成

包括硬件子系统和软件子系统两部分

中断响应由硬件子系统完成

中断处理由软件子系统完成

2.4.2.中断响应处理与指令执行周期

在取指 解码 执行后面有一步检测中断,若为不屏蔽中断,就需要进入中断阶段,若是屏蔽中断,那就跳过执行下一个步骤

2.4.3.中断装置

即计算机系统中响应中断/异常的硬件装置

中断装置根据不同情况而有所区别

处理器外的中断:由中断控制器发现和响应

处理器内的异常:由指令的控制逻辑和实现线路发现,也称作陷阱

处理器内的系统异常:直接触发,成为系统陷阱

中断和异常的另一个重要差别是,CPU处理中断的过程中会屏蔽中断,不接受新的中断直到此次中断处理结束。而陷阱的发生并不屏蔽中断,可以接受新的中断

中断控制器:

包含中断控制逻辑线路和中断寄存器。当外部设备请求中断时,中断寄存器中会设置已发生的中断,中断检查时就是检查寄存器中的中断是否被屏蔽,未被屏蔽就会引发中断处理程序

2.4.4.中断的处理

中断处理程序的作用:处理中断事件和恢复正常操作

总体分为两个阶段:中断响应和中断处理

过程:

1.保护未被硬件保护的处理器状态和后续指令在内存中的地址,信息均存在主存中,即保护现场,现场也称上下文

2.识别PSW中的断码字段,识别中断源,转入中断处理程序

3.分别处理发生的中断事件

4.恢复正常操作

中断的总体流程

2.5.多中断的响应和处理

2.5.1.中断屏蔽

当计算机检测到中断时,其会根据中断是否屏蔽来决定是否响应这些中断

2.5.2.中断优先级

当计算机检测到多个中断时,中断装置会有响应中断的一个顺序,其会给不同类型的中断标上不同的优先级,按照优先级来执行中断。不同的操作系统中优先级的设置也是不同的。

2.5.3.中断的嵌套处理

当计算机响应中断后,在中断处理过程中,可以再响应其他中断

为了保证计算机性能,一般嵌套层数不会太多,如三层

中断的嵌套可以改变中断处理顺序,即不一定先中断先处理,可能后处理

2.5.4.响应与处理

通过中断屏蔽,中断优先级和中断嵌套处理,可以改变中断处理的次序

2.6.进程及其状态

2.6.1.进程的概念

为了更系统的管理运行的程序,计算机会为正在运行的程序建立一个管理实体。这个实体就称为进程。

进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,简单地说,就是某个程序的依次运行。

需特别注意的是,进程是操作系统进行资源分配和调度的独立单位

进程包括以下五个实体:

数据结构P 内存代码C 内存数据D 通用寄存器信息R 程序状态字信息PSW

2.6.2.进程举例

首先介绍进程与程序的区别
1、程序是静态的概念,进程是动态的概念;
2、进程是一个独立运行的活动单位;
3、进程是系统资源分配的基本单位;
4、一个程序可以对应多个进程,一个进程至少包含一个程序。
5、程序=代码+数据,进程=程序+PCB(后面马上会讲到)

需牢记的是,进程是一个程序在一组数据上的一次执行。

因此,就算是一个程序在不同时间,同一组数据上运行,也算两个进程,其PCDR PSW都是不同的

普通进程可分成两大类:

1.在不同数据上运行的不同进程

2.在同一数据下运行的共享数据的不同进程

2.6.3.进程状态

一般的,分为运行态,就绪态和等待态(阻塞态)。

运行态:进程获得了CPU资源与其他所需要的资源

就绪态:进程获得了其他所需要的资源但没有获得CPU资源

等待态:进程未获得CPU之外的其他所有所需要的资源(与CPU资源无关)

2.6.5.进程之间的互相转换

1.运行态->就绪态:被更高优先级的进程抢占了CPU资源,时间片用完

2.就绪态->运行态:在其他资源齐全的情况下,获得CPU资源

3.运行态->等待态:当运行进程申请I/O等其他资源时,会被阻塞然后进入等待态

4.等待态->就绪态:获取了其他所有资源,等待获取CPU资源
三态转换

2.6.6.进程挂起

提出进程挂起的概念是为了解决计算机系统在运行过程中可能出现的资源不足的情况。

其表现为性能低和死锁两种情况。

进程挂起的作用:剥夺某些进程的内存与其他资源,调入OS管理的对换区,待适当时候再参与进程执行

挂起态和等待态的区别就是:后者是已占有部分资源,而前者不占有任何资源

2.6.7.进程挂起有关的状态

一般的,都选择等待态进程进入挂起等待态。

实在不得已再选择就绪态进程进入挂起就绪态。

同样的,也会先恢复挂起就绪态,再恢复挂起等待态

2.7.进程的数据描述

2.7.1.进程控制块 PCB

PCB用于记录进程状态机环境信息,便于OS对进程进行管理

PCB中的信息分为标识信息、现场信息、控制信息三块

2.7.1.1.PCB中的主要内容

① 进程标识符 进程符号名或内部 id号,简称PID

② 进程当前状态 本进程目前处于何种状态

③ 当前队列指针next
该项登记了处于同一状态的下一个进程的 PCB地址。

④ 进程优先级
反映了进程要求CPU的紧迫程度。

⑤ CPU现场保护区
当进程由于某种原因释放处理机时,CPU现场信息被保存在PCB的该区域中。

⑥ 通信信息
进程间进行通信时所记录的有关信息。

⑦ 家族联系
指明本进程与家族的联系

⑧ 占有资源清单

PCB的作用

2.7.2.进程映像

是进程在某一时刻的内容与执行状态的集合

其中包括:进程控制块、进程程序块、进程数据块与核心栈

注意,其是内存级的物理实体,也被称为进程的内存映像

2.7.3.进程上下文

先声明一点,进程的执行是需要环境支持的,包括CPU现场和Cache中的执行信息

因此,我们提出了进程上下文的概念:进程物理实体+运行环境=进程上下文

其包括用户级上下文(用户程序块、数据区、栈、共享内存)、寄存器上下文(PSW、栈指针、通用寄存器)、系统级上下文(PCB、内存区表、核心栈)

由此我们可以看到,几乎关于进程的全部信息都可在上下文中找到,因此其刻画了进程执行的具体情况

2.8.进程的管理

2.8.1.关键的进程管理软件

系统调用/中断/异常处理程序

队列管理模块

进程控制、调度、通信程序

2.8.2.进程实现的队列模型

总体的队列分为就绪队列和等待队列

CPU从就绪队列中取到就绪态的进程进行运行,若进程需要其他资源,则进入等待队列,待获得资源后再返回就绪队列。而如果是因为时间片轮转等导致的运行态剥夺,则直接回到就绪队列末尾

2.8.3.队列管理模块

这是操作系统实现进程管理的核心模块

用于管理2.8.2中的内容

2.8.4.进程的控制与管理

1.进程创建:进程表加一项进程,并申请PCB且初始化,建立标识,建立映像,分配资源,移入就绪队列

2.进程撤销:从队列中移除,归还资源,撤销标识,回收PCB,移除进程表项

3.进程阻塞:保存现场,修改PCB中的相关信息,并移入等待队列

4.资源唤醒:从等待队列中移出,修改PCB中的相关信息,移入就绪队列

5.进程挂起:修改状态并出入相关队列,回收资源
进程控制举例

2.8.5.原语与进程控制原语

由于进程控制过程是会涉及OS的核心数据结构的,为了防止与时间有关的错误,应当使用原语

同时,原语会被多个进程所使用的,应当是不可修改的精简代码,同时执行过程不能被外部中断

进程控制原语一般分为四种:
1)进程创建原语 2)进程撤消原语
3)进程阻塞原语 4)进程唤醒原语

2.9.进程间的制约关系

进程间相互制约关系分两种:
1、间接制约关系,进程之间共享资源,用户程序使用时需要先提出申请,由操作系统统一协调分配。
2、直接制约关系,是指进程之间相互协作,执行有先后顺序。

举例1:共享变量
进程制约之共享变量

举例2:进程协作(誊抄)
誊抄

2.10.进程互斥

2.10.1.临界资源

由于不同进程之间可能会访问同一变量,该变量就为临界资源。

2.10.2.临界区

进程中访问临界资源的那段程序段称为临界区

临界区

2.10.3.进程互斥机制

由于并发执行的特点是程序执行的顺序不同,最后的执行结果也会不同。因此在访问共享变量时,应当有相应的互斥操作保证共享变量(临界资源)在某一时刻只能由一个进程访问,该手段便是进程互斥机制

遵循的三个原则:
(1)保证进入
当有进程想进入临界区时,应保证其在有限的时间内进入,不能无限等待;
(2)排它性
临界区内每次最多只有一个进程,不可能有两个及多个进程同时存在临界区;
(3)有限性
进程在临界区逗留时间有限,不能无限制逗留。

2.10.4.进程同步概述

进程的互斥解决进程对临界资源的独占(互斥访问),而进程的同步解决进程间的合作,可以没有临界资源,但是在一些关键点上可以相互等待与互通消息。

进程同步定义:是指并发进程在一些关键点上可以相互等待与互通消息,这样的相互制约关系称为进程同步。

例如公交车司机和售票员之间,打印机的不同对象之间都是进程同步问题
公交车问题:
公交车问题da
打印机:
在这里插入图片描述

进程同步和进程互斥的区别:

2.11.进程互斥和同步的机制

锁和信号量

2.11.1.锁(只可是按进程互斥)

锁被定义为一个二进制变量w,其值当然
0:临界资源空闲,且没有进程进入临界区
1:表示有进程进入到了临界区,正在使用临界资源。

在这里插入图片描述

2.11.2.信号量(可实现进程同步和互斥机制)

当临界区资源量大于1时,用锁实现就很不方便了,因此需要使用信号量

信号量定义:用一个二元组(s,q)表示。

其中:s是一个初始值≥0的整型变量(-∞, +∞ );q 表示一个初始状态为空的进程等待队列,初始为空。

当信号值s≥0,进程可以继续执行(类似绿灯);
当信号量值s<0,进程停止执行,进入到q队列中等待(类似红灯)。

信号量既可以实现互斥,也可以实现同步
针对信号量的两个原语操作,分别记做P(S)和V(S)

然后,我们进一步理解

可以把信号量看成资源量,当某一进程需要某一资源时,其便获取一份信号量,当资源使用结束后,再将该信号量放回。当资源量大于0时,其可以被获取,当资源量小于等于0时,说明其已被别的进程获取完,需要等待,而小于0时的绝对值表示在等待的进程数

在这里插入图片描述
PV操作就是原本的上锁和解锁,当信号量的资源量初始化为1时,就和锁类似

2.11.3.信号同步互斥经典问题
  1. 生产者消费者问题

这边直接考虑多个生产者和消费者。

设置信号量:

设置两个同步信号量和两个互斥信号量
empty :表示缓冲区中空闲资源的数目,初值为X
full : 表示满缓冲区,即信息的数目,初值为0
mutex1, mutex2:表示互斥信号量,初值为1

其中,mutex1和mutex2分别是生产者消费者之间的互斥信号量。其目的是防止生产者或消费者在放入缓冲区资源或获取缓冲区资的时候访问同一块缓冲区。例如,生产者1和生产者2都可以向缓冲区内写入数据,此时缓冲区的空闲资源也足够,但是他们俩可能会向同一块缓冲区的空闲资源中写数据,这时就需要mutex1了,确保在写入时仅一个生产者访问一块缓冲区的空闲资源。


这里需要注意,生产者
2. 吃水果问题

前提:父亲放苹果,母亲放桔子,儿子吃桔子,女儿吃苹果

信号量设置:

在这里插入图片描述
实现代码:
在这里插入图片描述
特别注意,父亲放入苹果后释放的信号量是女儿吃苹果的信号量,母亲也类似,而儿子女儿释放的才是盘子的信号量

2.12.线程概述

2.12.1.进程的缺陷

进程创建和切换时间和空间开销较大,且随着并发进程数量的提升,时间和空间开销会逐渐增大,从而限制了系统的并发能力。

进程间高级通信效率较低,通常需要单独创建一片内存区域,也增加了时间和空间的开销

因此,线程的提出就是为了解决进程带来的时空开销较大的问题

2.12.2.线程定义

线程是比进程更小的活动单位,其可描述如下:

线程是进程中的一条执行路径;

线程有自己私用的堆栈和处理机执行环境;

线程共享所在进程已分配的资源;

线程是单个进程所创建的许多个同时存在的线程中的一个

实现线程间通信十分方便,因为一个进程创建的多个线 程可以共享整个进程的所有资源

在进程内创建多线程,可以提高系统的并行处理能力, 加快进程的处理速度

总结来说,线程包含于进程,其享受进程提供的资源来执行相应的命令操作,进程是线程的母体,线程通常不能独立产生,必须在一个进程中产生

相应数据:

TCB(Thread Control Block):线程控制块,类似PCB,记录线程所有相关的属性信息,随着线程的创建而创建,但其所占内存空间远远小于PCB。

TID:线程的ID号

在这里插入图片描述

2.12.3.线程与进程的区别

在没有线程的操作系统中,进程是操作系统资源分配与调度的基本单位

在存在线程的操作系统中,进程仅为操作系统资源分配的基本单位,而线程是操作系统调度的基本单位

在这里插入图片描述
上图很好的概括了线程和进程的区别。由图可知,一个进程中可以存在多个线程,这些线程互相调度的开销远小于进程之间的互相调度

2.12.4.资源分配和调度的单位

不是所有操作系统都存在线程

在没有线程的操作系统中,其资源分配和资源调度的基本单位都是进程

在包含线程的操作系统中,其资源分配和资源调度的基本单位分别为进程和线程

2.13.处理器调度的层次

2.13.1.层次概念

大致分为高级调度,中级调度,低级调度

2.13.2.高级调度

与创建相关

高级调度是统筹进程的调度

主要工作如下:

1.是否接受一个终端用户的连接

2.是否被系统接纳并构成进程

3.新建进程是否加入就续进程队列

2.13.3.中级调度

与挂起相关

可以提高内存利用率和作业吞吐量

因此,其可以决定哪些进程留在内存中,可以来竞争资源

2.13.4.低级调度

是最重要的调度

与状态切换相关

按照某种原则进行CPU的分配,即与三态有关

同时会记录各个进程或内核级线程的状态

实现方法:进程调度程序,也被称为所有进程的父进程,因为其决定了进程的生死等

2.14.CPU的调度算法

进程调度由调度(scheduler)和分派(dispacher)两个功能组成

这里我们介绍操作系统的几种不同的调度算法
总体来说,调度分为剥夺式和非剥夺式,即当某进程根据相应调度策略计算后发现,其计算优先级高于当前运行进程,剥夺式调度则会剥夺当前运行进程资源,转而运行优先级更高的进程,非剥夺式则是等当前进程运行结束后再执行优先级更高的进程

2.14.1.调度算法选择的原则

资源利用率:CPU或其他资源的使用效率

响应时间:任务开始执行时间-任务提交时间

周转时间:任务结束时间-任务提交时间

吞吐量:单位时间内吞吐的数据量

公平性:确保每个用户获得合理的CPU或其他资源份额

2.14.2.优先数调度算法

分为剥夺式和非剥夺式两种

优先级也分为静态和动态,静态优先级在创建后便不再发生改变,而动态优先级可以根据任务的紧迫性、等待时间长短等来调整优先数

动态优先数的改变原则:
进程使用CPU超过一定数值时,降低优先数
进程I/O操作后,提高优先数
进程等待时间超过一定数值时,提高优先数

2.14.3.与进入系统时间相关的算法

短进程优先算法SPN

剩余计算时间短进程优先算法

高响应比优先算法(响应比 = (等待时间+要求服务时间)/要求服务时间) HRRN

先来先服务算法 FCFS

2.14.4.时间片轮转调度算法

即进程进入就绪队列后,会轮流占有一定时间的CPU,在时间用完后,便排到就绪队列队尾准备下一次执行

2.14.5.分级调度算法

分级调度算法就是给进程排多个就绪队列,每个就绪队列优先级不同

同时,为了保证尽量公平,优先级越高的队列执行时间越短

2.14.6.彩票调度算法

即为每张彩票赋予同样的时间片,不同进程的初始彩票拥有数不同,优先级越高的越多

每次由系统抽取一张彩票,抽到的进程将彩票上交,并执行一个时间片的进程

这样,随着时间的发展,初始彩票少的进程的执行概率会逐渐增加,这也增加了平衡性

2.15.死锁

2.15.1.资源分配方式

资源分配方式有两种,分别为静态分配和动态分配

静态分配:在进程运行前,将其需要的资源一次性全部分配

动态分配:在进程运行中,根据进程提出的需求,进行资源的动态分配和回收

从上面可以思考以下问题:

  1. 哪种分配方式设备利用率与资源利用率高
  2. 哪种更安全

通过分析,我们可以知晓的是,静态分配在一开始就分配了所有资源,一部分资源可能是进程后期才需要的,那么只有等进程结束后,这部分资源才会被释放并且去服务其他进程。而动态分配虽然解决了上述静态分配中资源与设备利用率低的问题,但也会产生新的问题:多个进程争夺同一个资源的时候,操作系统该如何处理?这便引出了重点,死锁

2.15.2.死锁概述

两个或两个以上并发进程,如果每个进程持有某种资源,而又在等待着别的进程释放它或它们现在保持着的资源,否则就不能向前推进,这种现象称为死锁

必须重点指出的是:在死锁状态下,所有进程都处于阻塞态,解除其阻塞态的事件永远不会发生,只能通过外力解决

由上也可知,如果资源量充足,就不存在死锁问题

那么,在没有任何调度算法加持的情况下,需要多少资源才可以保证不会发生死锁呢?

假设:系统当前所拥有的某类资源总数为M,共享该资源的当前进程数为P,每个进程所需使用该资源的最大需求为N( N ≤ M)

那么所需的不会导致死锁的最小资源数为M≥P*(N-1)+1。即每一个进程都能分配到N-1个资源,剩下一个资源给谁,那么谁就可以正常执行,执行完释放N个资源后,后续就不存在死锁现象了

2.15.3.死锁的四个必要条件

死锁产生的四个必要条件为:

  1. 互斥条件(无法破坏)

指资源被独占,某资源在使用时不得由多个进程共享,有且仅有一个进程在同一时刻可以占有这个资源

  1. 不可剥夺条件

指其他的资源申请者不得从资源占有者手中剥夺该资源

  1. 占有并等待条件

进程已占用至少一个资源,且又提出资源请求,当不能满足而阻塞时,保持原资源不释放

  1. 环路条件

必有一进程–资源的环形链

在这里插入图片描述
圆形代表进程,方形代表资源(数量为1)。上图代表P1进程占有R1资源的同时,需要R2资源才可以执行进程。但P2进程占有了R2资源,且需要R1资源才可以执行。这就互相矛盾,产生死锁

2.15.4.解决死锁的策略

解决死锁分为一下四个策略

  1. 死锁预防
  2. 死锁避免
  3. 死锁检测和接触
  4. 忽略死锁
2.15.4.1.死锁预防

死锁预防就是之前讲的资源分配方法。若为静态分配(静态死锁预防策略),那么肯定不会发生死锁,其破坏了**请求和保持(占有并等待)**这两个死锁条件

若为动态死锁预防策略,则有序资源分配法工作思路如下,所有资源按类型进行线性排队,并赋予每一个资源类型不同的序号。进程对资源的请求必须按资源序号递增的次序提出。即将资源按照1,2,3,…,n标号,一个进程若需要1,4,5三种资源,只有当它拥有足够的1号资源时,其才可以申请4号资源,以此类推。这样不会出现拥有其他资源,而缺少某一种资源从而导致的资源环路

2.15.4.2.死锁避免

死锁避免与死锁预防的区别是:

死锁预防是破坏四个条件之一导致无法产生死锁

死锁避免是不破坏四条件,仅通过动态检查来决定部分资源可否分配(分配后不会产生死锁问题),重点便是银行家算法

银行家算法介绍

首先解释安全状态和不安全状态

系统中的当前所有进程能按某种顺序(如<P1,P2,…,Pn>)来为每个进程分配其所需的资源,使每个进程都可顺利完成,则称此时系统处于安全状态。若不存在安全序列,则称系统处于不安全状态

若存在进程序列<P1,P2,…,Pn>称为安全序列

若不存在安全序列,则称系统处于不安全状态

银行家算法存在以下几种资源情况:

Max(最多要几个)、Allocation(已分配的)、Available(可分配的)、Need(仍需要的)

描述成数据结构即如下:

可用资源向量Available:是含有m个元素的数组,每一元素代表一类可用资源的数目。初值为系统中该类资源的全部数目。
如:Available[j]=k,即系统中现有Rj类资源k个

最大需求矩阵Max:是n×m矩阵,定义了系统中每一进程对每类资源的最大需求。
如Max(i,j)=k,即进程i需要Rj类资源的最大数目为k

分配矩阵Allocation:是n×m矩阵,定义了每一类资源 已分配给每一进程的资源数
如: Allocation(i,j)=k,即进程i已分得Rj类资源k个

需求矩阵Need:是n×m矩阵,表示每一进程还需要的各类资源数。
如:Need(i,j)=k,表示进程i还需要Rj类资源k个

其中Available是整个系统还可分配的资源量,并不是整个系统的总资源量,总资源量应该是所有的Allocation+Available

每个进程所需的每个资源都应有相应的标识

例:

系统存在a b c三种资源,现在可分配的数量分别为(Available) 1 2 3

进程A需要a b c三种资源,情况为:

Max:2 2 5

Allocation:1 1 1

Need:1 1 4

此时由于资源c不足,进程A没法正常执行

银行家算法的相关注意点

  1. Need = Max - Allocation
  2. 某一进程执行完毕后,其资源量会释放供其他进程使用
  3. 判断所有进程是否存在安全序列,若不存在,说明系统处于不安全状态
2.15.4.3.死锁检测与解除

即允许死锁发生,在死锁发生时采取一些措施来解除死锁

主要是重新启动、撤销进程、剥夺资源、进程回退

3.存储管理

存储结构由以下四部分构成

在这里插入图片描述

3.1.存储管理的主要模式

3.1.1.逻辑地址

逻辑地址又称为相对地址,是用户在编程时所用到的地址空间。是用户的程序经过汇编或编译后的目标代码的地址

逻辑地址从0开始编号,分为以下两种形式:

1.一维逻辑地址:这是直接给地址

2.二维逻辑地址:这是给内存分段,通过段号去对应相应的内存

注意点:

首地址为0,其余指令中的地址都相对于首地址来编址

不能用逻辑地址在内存中读取信息。在实现对存储器访问之前必须转换成物理地址

用户程序处理逻辑地址,它不能看到真正的物理地址

3.1.2.物理地址

物理地址又称为绝对地址,即程序在执行时占用的地址空间。内存通常被分成若干个大小相等的存储单元(容量为一个字节),每个单元给一个编号,这个编号称为内存地址,是计算机主存单元的真实地址

CPU在执行命令时必须要按照物理地址来执行

这里来区分一下物理地址和逻辑地址:

逻辑地址是用户程序经过编译后将存储空间从0开始编号,而绝对地址是内存中各物理存储单元统一的基地址顺序编址

物理地址的集合称为物理地址空间,它是一个一维的线性空间

3.1.3.逻辑地址的好处

物理地址的程序只有装入程序所规定的内存空间上才能正确执行,如果程序所规定内存空间不空闲或不存在,程序都无法执行。在装入内存后,便通过逻辑地址寻找程序

使用物理地址编程意味着由程序员分配内存空间,这在多道程序系统中,势必造成程序所占内存空间的相互冲突,用逻辑地址可以进行重新分配排序

在多道程序系统中,程序员门无法事先协商每个程序所应占的内存空间的位置,系统也无法保证程序执行时,它所需的内存空间都空闲

为内存的共享、保护和扩充提供方便

3.1.4.地址空间与映射

静态地址映射:即在程序装入的过程中进行地址变换

动态地址映射:即在程序执行的过程中进行地址变换。在程序运行时确定地址映射关系。在程序执行期间,随着每条指令和数据的访问自动地连续地进行地址映射

在这里插入图片描述

3.1.5.主存储器的复用

内存复用是指在服务器物理内存一定的情况下,通过综合运用内存复用单项技术(内存气泡、内存交换、内存共享)对内存进行分时复用,即同一段内存在不同时间段服务不同进程。 通过内存复用,使得虚拟机内存规格总和大于服务器规格内存总和,提高服务器中虚拟机密度。 智能内存复用可提升内存资源的利用率,帮助用户节省内存采购成本,延长物理服务器升级内存的周期。

有分区复用和页架复用两种:

分区复用:

分区大小可固定也可改变,一个程序/程序段占用一个分区

页架复用:

页架大小是固定的,一个程序/程序段占用多个页架

3.1.6.存储管理的基本模式

通过两种复用方式和两种多里地址方式,可构成四种存储管理的模式

单连续存储管理:通过一维逻辑地址空间和分区复用组合,即一个程序是采用一维逻辑地址空间来存储程序,并且采取分区复用的方式复用内存**(不可虚拟|共享)**

段式存储管理:通过二维逻辑地址空间和分区复用组合,即一个程序是采用段式二维逻辑地址来存储程序,并且采用分区复用来复用内存(可虚拟|共享)

页式存储管理:通过一维逻辑地址空间和页架复用组合,即通过一维逻辑地址空间来存储程序,并通过页架的形式进行内存复用(可虚拟|共享)

段页式存储管理:通过二维逻辑地址空间和页架复用那个组合,即通过段式二维逻辑地址空间来存储程序,并且通过页架的形式来实现内存复用(可虚拟|共享)

3.2.存储管理的功能

3.2.1.地址转换

地址转换又称为地址重定位,即把逻辑地址转换为绝对地址

重定位的两种方式:

静态重定位:程序装入内存时进行地址转换,这是由装入程序执行的

动态重定位:在CPU执行程序时进行地址转换,这必须是由硬件完成的,效率较高

3.2.2.内存的分配和去配

分配:进程装入主存时,存储管理软件来进行主存分配,并设置一个表格记录空间的分配情况

去配:某个进程撤离或归还内存资源时,存储管理软件将这些资源收回并调整记录表格

3.2.3.内存的空间共享

共享有以下两种意义:

1.多个进程共享同一内存的资源:即一块内存上,多个进程分别占用不同的存储空间,即不重复或共享

2.多个进程共享主存储器的某些区域:若干个协作进程拥有公共的内存程序块或数据块

3.2.4.存储保护

由上可知,内存是有可能被干扰的,因此必须对其进行保护

对于本进程:

私有内存区:可读可写

公共内存区:根据自身权限

非本进程内存区:不可读写

存储保护极其重要,因此是由硬软件协同完成的,CPU也参与到生成地址保护中去

3.2.5.内存空间的扩充

存储扩充的意义就是把磁盘作为内存的扩充,这样就只需要在内存中装入要执行的部分进程,不需要将整个程序全部装入内存

对换技术:将不在执行的进程调出内存

虚拟技术:值调入进程的部分内容

同样的,这个功能也需要硬软件协作完成:

1.当进程决定对换时,硬件会实行调换

2.当CPU处理到不在主存的地址时,即访问到了未装入内存的程序,CPU会发出虚拟地址异常指令,将该部分进程调入内存中执行

3.3.虚拟存储器的概念

3.3.1.为什么会有虚拟存储器

物理存储器容量是有限的,用户程序的大小,可能比内存容量小,也可能比内存容量大,有时候要大得多

主存的容量大小严重影响到了用户编写程序的大小和多道程序设计的道数

同时,程序执行时具有互斥性,时间局部性,顺序性和循环性,因此可以考虑部分调入进程内容

注意,虚拟存储器不是其物理不存在的意思,而是指对于内存来说,其实虚拟存在的,即与内存无关,其大小等均只与外存大小有关

3.3.2.基本思想

总体来说为这三步:

程序的全部代码和数据存放在辅存中

将程序当前执行所涉及的那部分程序代码放入主存中

程序执行时,当所需信息不在主存,由操作系统和硬件相配合来完成主存从辅存中调入信息,程序继续执行

3.3.3.实现思路

虚拟地址空间:容纳进程装入

实际地址空间:承载进程执行

因此,对于用户来说,计算机系统具有一个容量极大的主存空间,即虚拟存储器

虚拟存储器作为一种地址空间扩展技术,通常对用户是透明的,除非用户需要进行高性能的程序设计

3.4.存储管理的硬件支撑

3.4.1.缓存Cache的概念

缓存是比内存更快的存储器,其直接位于CPU内部,且分为L1,L2,L3三级,性能依次降低

三级结构:

L1:是最快的Cache,因此最小,速度最快,其与CPU频率一致

L2:其次快的Cache,因此稍大,较好的L2缓存频率与CPU一致,也有可能稍低于CPU频率

L3:是最慢的Cache,但也最大,因此,改善总线比设置L3可能更有利于提高系统性能

3.4.2.缓存的构成

通常由高速存储器,联想存储器,地址转换部件,替换逻辑等组成

​ 联想存储器:根据内容进行寻址的存储器

地址转换部件:通过联想存储器建立的目录表来进行快速的地址转换。若命中就直接访问Chace,未命中就去内存中找相应的地址

替换逻辑:根据相应逻辑,在缓存已满的情况下进行数据块的替换,并修改地址转换部件

3.4.3.存储管理涉及的存储对象

存储管理是OS来管理内存的软件部分

有两点比较重要:

1.为了获取更好的处理性能,内存中的关键数据与程序往往被存入其中,这样就需要存储管理来对Cache进行调整,甚至包括对联想存储器的管理

2.为了获得更大的虚拟地址空间,存储管理也会对各种外放硬盘,SSD等进行管理

3.5.单连续分区存储管理

概念:每个进程占用一个物理上完全连续的存储空间

有三种:

单用户连续存储管理

固定分区存储管理

可变分区存储管理

3.5.1.单用户连续分区存储管理

如何区分系统区和用户区:通过一个栅栏寄存器分两个区域,并且通过栅栏寄存器来进行存储保护。栅栏寄存器相当于一堵墙,一旦越界,就会警报

一般采用静态重定位进行地址转换,即在将进程传入内存时,就将虚拟地址改为绝对地址

3.5.2.固定分区存储管理

支持多个分区

分区数量、大小固定

可使用静态重定位

硬件实现代价低

但由于每个分区大小固定,一定会造成部分内存的浪费,即内存的内零头,即已经分配出去,但是得不到利用的存储空间

内部有一张内存分配表:包括了起始地址,长度,标志

内存分配与去配:有一个占用标志,当被占用时,就将相关进程的标志放入其中,未被占用时,就清除标志

3.5.3.可变分区存储管理

浪费内存空间较小,仍会有小的不可用的内存分区,这些内存分区还没有被分配出去,但由于太小了无法分配给申请内存空间的新进程的内存空闲区域,称为内存外零头,外零头是不可避免的

且分区的大小、个数都是可变的

分配内存:会将内存中所有的空闲区域加起来,检查是否够进程使用,若不够,就让进程等待,若够,则会将小片的空闲区域拼成大块的内存区域,来存放新进程

数据结构描述如下:

主存中的每一个分区都有相应的分区描述器(pd)说明分区的特征信息。
flag: 为 0—空闲区; 为 1—已分配区
size: 分区大小
next:指向下一个空闲分区(只对空闲分区有用)

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

3.5.3.1.主存分配表

主存分配表分为已分配区表和未分配区表

每张表都包含起址、长度、标志三部分

3.5.3.2.动态分区管理分配算法

有最先适应分配算法,最优适应分配算法和最坏适应分配算法

最先适应分配算法(首次适应算法):从未分配区表的首地址开始查询符合的内存块,将作业放到最先找到的足够大空闲分区

最优适应分配算法:首先把空闲区队列按分区大小由小到大的顺序排列,把满足要求的最小空闲分区分配给作业(最易产生外零头

最坏适应分配算法:首先把空闲区按分区大小由大到小的顺序排列,将最大的满足要求的空闲分区分配给作业

3.5.4.内存分配过程中的地址转换与存储保护
3.5.4.1.单连续分区存储

下限寄存器中包含了分配内存的首地址和结束地址

当CPU在动态重定位时,若分配的内存绝对地址低于下限,就会报错中断

3.5.4.2.可变分区存储

其中包含了限长寄存器和基址寄存器

首先,限长寄存器会判断逻辑地址是否限长,若限长且超过长度限制,便中断

再利用基址寄存器,来判断进程的内存占用长度是否在小于分区最大长度,若超过,则中断

3.6. 页式存储管理的基本原理

由于固定分区有内碎片、内存利用率不高,且需要大片连续内存空间;可变分区有外碎片,且需要大片连续内存空间,这些碎片会导致内存利用率很低,页式存储管理就是为了解决这个问题才出现的

3.6.1.基本原理

程序(逻辑)地址空间分成大小相等的页面,编号从0开始;同时把内存也分成与页面大小相等的块,编号从0开始;当一个用户程序装入内存时,以页面为单位进行分配。页面的大小是为2n ,通常为1KB,2KB,4KB等等

相应程序或数据的逻辑地址存在页表中,页表就是一个页号及其对应的物理块号(页面号),这样就可以用于转换页架号

对页面和页的申疑:页面从基本上来说,就是内存中的一个物理块,其大小是确定的。而页则是每个作业的地址空间占用的基本单位,每个作业占用一系列页。在这里我们可以对3.6.2进行一定理解,即真正的物理地址是页面,而页号则是每个作业的逻辑地址,在访问页面前要对其页的内容进行转换

还有两点注意点:
1、页面大小等于块大小,一个块存放一个页;
2、进程有多少页就分配多少块,但不必一定是连续的块

3.6.2.页式存储管理中的地址

逻辑地址由页号和单元号两部分组成

物理地址由页面号和单元号两部分组成

逻辑地址和物理地址的变换:就是将逻辑地址的页号替换为页面号即可

3.6.3.页式存储管理的内存分配和去配

通过一个位来记录主存的分配情况,所有的存储情况都保存在一张位示图中

3.6.4.页的共享

共享分为数据共享和程序共享

数据共享:不同进程可以使用不同页号共享数据页 因为不同的数据可以存在不同的页中

程序共享:不同进程必须使用相同页号共享代码页 因为代码应当是相同的段

3.7.页式存储管理的地址转换

3.7.1.通过页表来进行地址转换

页表是用于地址转换的,即进行页号和块号的转换。每一个进程都有一张页表

页表存放在内存中,每次进行地址转换时有如下步骤:

1.按照页号读出页表中的页面号

2.计算出相应的物理地址来进行读写

由于两次读取内存,就导致速度很慢。相应的解决方法就是将页表放入缓存Cache中

在这里插入图片描述

3.7.2.利用快表来进行地址转换

快表是储存在高速存储器中的部分页表,是专门用来提高地址转换速度

这里的高速存储器是联想存储器,是按照内容寻址的,并非按照地址访问

3.7.3.利用快表进行地址转换的流程

1.记录到需要转换的页号

2.在快表中查询,若已存在于快表中,则由页面号和单元号可以直接形成绝对地址

3.若不在快表中,就需要在页表中查询并形成绝对地址,并将该页登记到快表中去

4.当快表快要填满时,就会按照一定策略淘汰一个旧的登记表

3.7.4.进程表

进程表用于记录每个进程的名称,页表起始地址和页表长度

3.8.页式虚拟存储管理

这里的虚拟也是指外存,并非不存在

总体概括为:将进程的页面装入虚拟存储器,只调用部分到内存中,随后根据执行行为,动态的调入所需要的页和进行必要的页面调出

首次只把进程第一页信息存入主存,称为请求式页式存储管理

3.8.1.页式虚拟存储管理的页表

由于存在虚拟存储器,因此需要扩充页表项来存储虚拟地址,实际地址和一系列标志(主存驻留标志,写回标志,保护标志,引用标志和可移动标志)

3.8.2.页式虚拟存储管理的实现

处理地址是交给CPU处理的。如果查询的相关页表在内存中,那么就可以直接计算出绝对地址

若查询的相关页不在内存中,则会发出CPU缺页中断,特别注意的是,这里的中断是即时中断,即一有中断发生,立刻切断程序执行中断,不会等待程序执行完

缺页中断的处理:若有空闲的页架,就可以从辅存中调入页,来进行更新等。若没有空闲的页架,就需要决定淘汰页,以此来更新页表和快表

3.8.3.虚拟逻辑地址与物理地址之间的转换

首先,逻辑地址由页号和页内偏移两部分构成(因为部分页面内有多个程序,每个程序不一定占用整个页面便会共享)

p(页号) = 逻辑地址 / 页面大小
w (页内偏移)= 逻辑地址 % 页面大小
逻辑地址=p(页号)×页大小+w(页内偏移)

然后根据页表找到对应的物理块,进行物理地址的计算

在这里插入图片描述
上图就是一个十进制的举例,我们来看看
首先计算页号:3000 / 1024 = 2
再计算偏移量:3000 % 1024 = 952
对应块号为7,那么物理地址就是7KB+952

下面介绍十六进制的举例
具体方法如下:

  1. 将十六进制数改为二进制数
  2. 页面大小自定为2的k次幂
  3. 设二进制数一共有N位,其中[k,N-1]为页号,[0,k-1]为页内偏移量
  4. 若要计算物理地址,就将页号部分的二进制数替换成块号对应的二进制数即可

在这里插入图片描述
计算物理地址:

3.8.4.反置页表

反置页表及相关硬件机制在地址转换、存储保护、虚拟地址访问中发挥了关键作用。

内存管理单元MMU是为页式存储管理设置的专门硬件机构。MMU是CPU管理虚拟/物理存储器的控制线路,把虚拟地址映射为物理地址,并提供存储保护,必要时确定淘汰页面。

反置页表是MMU用的数据结构,用来完成内存页架到访问进程页号的对应,即物理地址到逻辑地址的转换。

3.8.4.1.设计的基本思想

针对内存中的每个页架建立一个页表

反置页表中,包含:进程号、进程标志位、页号、链指针

3.8.4.2.反置页表的地址转换过程

1.MMU读取逻辑地址中的进程号和页号

2.通过哈希函数,转换成一个哈希值,通过哈希表指向反置页表的一个表目

3.若在反置页表中存在该表目,就可通过索引(页架号)直接找到物理地址的页架号

4.若无该表目,就发生中断,等待系统处理

3.9.按需调页

由上可知,当CPU进行内存访问时,有以下三种情况

1.页面已装入内存,有对应的页帧

2.非法的页面引用

3.合法引用,但是引用对象不在内存中,即在虚拟内存中

3.9.1.缺页中断

在页表中有一中断位,来反应是否缺页中断,取1时表示该页不在内存,取0表示该页在内存中。

这个时候就需要扩充页表了,之前页表中仅有页号与块号,而为了方便页面调度,通常将页表扩展成如下形式

在这里插入图片描述

是否引起缺页中断的判断步骤如下:

1.判断是非法引用导致的缺页中断还是合法引用导致的缺页中断

2.找到一个空闲页帧,这个页帧用于将所需的页面信息存入

3.从外存中调入所需的部分页表

4.更新页表内容,更新中断位

5.缺页中断返回并重新调用引起中断的那条程序

3.10.页面调度及其算法(页面置换)

但是万一页面数不够了呢?这又如何进行页面置换呢?此时就需要用到页面调度算法了

3.10.1.页面调度

页面调度是指当需要淘汰页时,该以何种方式进行淘汰,即选择淘汰页

3.10.2.页面调度算法

页面调度算法就是具体决定哪些淘汰页的算法

不理想的页面调度算法会导致刚调入的页面又立即被调出等等,这种现象被称为抖动或颠簸

这里要提一下缺页中断率

首先定义一下缺页:是指需要访问的页不在内存中

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

页面数、页面大小、用户程序的编制方法会影响缺页中断率

3.10.2.1.OPT页面调度算法(综述)

理想的调度算法是:在调入新页面时,会首先淘汰不会访问的页,然后选择距今最长时间再访问的页

但由于CPU必定无法预知后续会发生的事情,因此OPT只可模拟,不可实现

衡量页面淘汰算法的优劣:缺页中断率=f/a (a是总的页面访问次数,f是缺页中断次数)

同时为了淘汰不用的页,就需要进一步扩充页表

页号主存块号中断位辅存地址改变位引用位
////0表示最近没被访问/1表示最近被访问0 该页调入内存后没有修改/1 该页调入内存后修改过
3.10.2.2.先进先出FIFO页面调度算法

总是淘汰先调入主存的页,这是模拟程序的顺序执行,是有一定道理的,但并非最好

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

3.10.2.3.最近最少用LRU页面调度算法(最长时间不用)

淘汰最近一段时间中最久没用的页,这是比较好的页面调度算法,但是实现的代价太大了,需要维护特定的特殊序列才可以实现,可以用堆栈来进行更新

实现方法:采用压栈,但与FIFO不同的是,当某个页面被访问到的时候,该页面号被置为顶部)

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

3.10.2.4.时钟CLOCK页面调度算法

利用指针来指向要被淘汰的页

这里也是用了引用标志位:

调入内存 标志置为1

访问内存页面时 标志置为1

每次用指针扫描时,都将标志为1的置为0,标志为0的淘汰

3.10.2.5.最不常用LFU页面调度算法

制定一个计数器,一旦被访问,就将计数器加1

在计数最小的页面中淘汰即可

3.10.2.6.MFU页面调度算法

由于部分页面刚调入内存,还未被引用,先删除计数器最大的页面

3.11.页帧分配和系统抖动

3.11.1.页帧分配

一个进程在执行前,就必须拥有部分页帧,即这部分页帧可以使得该进程可以运行或初始化

这就会涉及到页帧分配 常用的页帧分配有fixed allocation和priority allocation

3.11.1.1.Fixed Allocation(固定分配)

第一个方式是相等分配,即所有进程平分页帧

第二个方式是按照进程映像占用的逻辑空间大小,按相应比例分配页帧,类似按需分配

3.11.1.2.Priority Allocation(优先级分配)

即按照进程的优先级高低进行分配

若进程出现了缺页,会从自身进程占用的页帧中选取页面调出或者从较低优先级的进程中选取页帧来换出部分页面

3.11.2.全局分配与局部分配

全局置换:即进程可从所有页帧中选取一个进行置换操作,其可以选取其他进程的页帧

局部置换:进程只能从其自己占用的一个页帧中选取页面进行置换

3.11.3.抖动

抖动就等于进程一直忙于换入换出页面

有多种情况会导致抖动:

1.本身内存中的进程数就过多

2.原先进程不多,CPU利用率低,OS便将大量进程放入内存中,导致内存中进程过多,产生抖动,CPU利用率又一次降低,OS以为进程不够多,便再加入进程量,进而造成恶性循环

3.11.4.按需调页来处理抖动

按需调页的基础是,当CPU在执行一个进程的时候不需要用到该进程的所有代码,只需要将要执行的那部分内容调入内存中即可

同时,调入是懒惰交换,即只有CPU要求调度某一部分程序且该部分程序不在内存中时,才会进行调入

3.12.段式存储管理

3.12.1.段式存储管理的概念

用户的逻辑地址空间划分为若干段,每个段定义了一组逻辑信息,每个段都有自己的名字——段名(通常用一个段号代替),段的长度由相应的逻辑信息组的长度决定

每个段都从0开始编址,并采用一段连续的地址空间

3.12.2.段式存储管理的地址映射

段式逻辑地址要用两部分组成:段号s和段内偏移地址d。在分段存储情况下,进程的逻辑地址空间是二维的

段式存储管理的内容都存在于段表中,段表包含了段号,段长,本段内存起始地址

3.12.3.段式存储管理与页式存储管理的区别
  1. 页是信息的单位,逻辑空间连续。段是信息的单位,逻辑地址空间不连续

  2. 页的大小固定且由系统确定。段的长度却不固定,取决于用户所编写的程序

  3. 分页的作业地址空间是一维的。分段的作业地址空间是二维的

4.文件系统

4.1.文件系统基本概念

4.1.1.文件类型

大致分为数据文件和程序

其中数据文件分为数字文件、文本文件与二进制文件

文件类型的区分方式有很多,其中最常用的是以文件扩展名区分

4.1.2.文件结构

分为无结构文件、简单的记录型结构、复杂结构

无结构文件:一串字节流 可以插入控制字符来模仿相关结构文件

简单的记录型结构:如行文件、固定长度文件、变长度文件

复杂结构:格式化文档、重定位可执行文件

4.1.3.文件属性

文件名:唯一一项可行性指导文件信息

文件标识:在文件系统中,该标识才是唯一的身份标识

文件类型

位置:文件内容在存储设备中的首地址

长度

保护:即读、写、执行权限

时间,日期,用户标识

4.1.4.文件操作

创建文件 读 写 文件内定位 删除 截取

这里举例打开文件与退出文件

打开文件:将文件从外存中复制一份到内存中

关闭文件:将文件从内存中保存到外存中去

4.1.5.文件访问方式

直接访问:定位要访问的数据块号直接访问

串行访问:只能从标记的开始位置开始访问

4.1.6.目录结构

目录结构与文件一样,驻留在磁盘

目录相当于一堆节点的集合,该节点包含了文件的基本信息

4.1.6.2.目录结构的分类

1.单层目录结构

即所有用户的所有文件都放置在同一层

2.二层目录结构

即为每一个用户建立一个独立目录

3.树型目录结构

即数据结构中树的类似结构

这里有绝对路径和相对路径的概念,与基本理解一致,创建新文件就是在当前目录创建一个新文件

4.有向无环图目录结构

可以实现文件的共享,即不同绝对路径下指向同一文件

操作系统用一个计数器来确定文件的共享量

当且仅当共享量-1=0时才可删除共享文件,即要删除共享文件的话,就要同时删去所有共享了该文件的目录下的该文件

5.图目录结构

即有环目录,这是必须要被避免的,方法如下:

1.保证指针不得指向子目录

2.利用算法清理孤立环

4.2.文件共享与保护

4.2.1.文件系统分区

文件系统大多是放在磁盘中的

通过RAID技术,可以将一个分区跨越多块磁盘,同时一个磁盘当然也可以分成多个分区

根分区:放置操作系统内核及其他的文件系统

在内存中有一张安装信息表:用于即时查询各种文件系统信息

4.2.2.文件系统安装

文件系统必须安装好、建立好目录才可被访问

每一个文件系统被安装在一个安装点上

4.2.3.共享

如何进行共享?那肯定是将一个文件放入一个用户组中,该用户组的用户对这个文件有一定访问权限

由上可知,我们需要两个ID来区分,User ID和Group ID分别来唯一的标识用户和用户组

4.2.4.保护

保护即对不同的用户开放不同的权限

基本权限如下:读 写 执行 附加 删除 列表

4.3.文件系统实现

4.3.1.文件系统管理的基本概念

物理块与逻辑块

物理块
文件的存储设备被格式化后常常划分为若干大小相等的物理块(通常为512B、1KB、4KB等等),并给每个存储块有个编号,称为物理块号。从而,以块作为分配和传送信息的基本单位。所有块统一编号以块为单位进行信息的存储、传输、分配

逻辑块
为了有效地利用存储设备和便于系统管理,一般把文件信息也划分为与物理存储设备的物理块大小相等的逻辑块

文件的基本逻辑单元为数据块

文件的管理信息被存在文件控制块FCB

文件控制块的结构

1.权限

2.执行的操作记录(新建,执行,读写等)

3.文件的用户,用户组

4.文件的大小

5.文件数据块或文件数据块的指针

文件系统是层次化的管理系统

文件系统多主存缓存,要求高效管理文件

磁盘的设备驱动程序仅操控物理设备,对其余如内存等硬件无关

4.3.1.1.层次化的文件系统

device(基础设备)-> I/O control(是最低层次的控制,直接与设备交互)-> basic file system(基础的文件系统,用于控制文件的读写命令)-> file-organization module(即管理逻辑块与物理块)-> logical file system(管理信息,数据结构,文件保护等)

4.3.2.文件系统的分序管理

1.每个文件都有引导块,用于将OS从磁盘引导至内存中

2.分区控制块保存分区的详细信息

3.目录结构用于组织、管理文件

4.3.3.文件系统结构

这里主要分析内存中的文件系统结构(打开与读取步骤)

1.用户申请打开一个文件

2.文件系统在内存的目录结构中查找相应的文件(目录结构原先在磁盘中,在第一次访问时会被部分或全部读入到内存中

3.可以从目录结构中查到文件在磁盘中的存储位置,及相应文件控制块的位置

4.在打开文件时,每个文件在内存中都存在一张文件打开表(保存了打开指定文件的所有信息),在该表中查到需要访问的文件索引值

5.内存中还有一张打开文件的系统总表(在该文件系统下打开的文件都会在这张表内有记录),我们通过4中的文件打开表,与总表建立连接,文件系统会将上面找到的文件控制块信息放到这张表里去,以便于记录操作信息

6.进行文件数据块的查找读取等操作

4.3.4.虚拟文件系统 VFS

虚拟文件系统是对各种不同文件系统的统一管理,使得用户可以使用VFS提供的统一系统调用界面去访问所有类型的文件系统,这大大简化了用户端的压力

4.3.5.目录实现

目录实现总体有两种方法:线性列表和哈希表

1.线性列表

除了文件名,表项内含指针,指向文件的数据块

较为简单,但时间复杂度不好

2.哈希表

哈希表是通过哈希数据结构来实现目录

时间得到了简化,但哈希冲突等问题依旧不可避免

4.3.6.外存分配方法(文件物理结构)

这里讨论三种分配方法

连续分配 链接分配 索引分配

4.3.6.1.连续分配

连续分配中有一张表(FAT),记录了文件名 起始地址 长度

逻辑地址与物理地址的关系:

物理地址=文件起始物理地址+前面的总数据块数*数据块大小+数据块内部的偏移

逻辑地址的求法:指定数据块

优点:

1.与数组一样,可以随机访问

2.实现简单

缺点:

1.不可增加长度,因为后面的数据块可能被占用

解决方案:添加一个指针,当要增加文件长度时,该指针指向另一片连续空间

2.会有许多空闲块

4.3.6.2.链接分配(串联分配)

即如链表一般,一个文件的数据块不需要连续,而是通过指针互相连接

逻辑地址与物理地址的关系:

物理地址=文件起始物理地址+前面的总数据块数*数据块大小+数据块内部的偏移

逻辑地址求法:指针指向位置

特别注意:内部偏移量=原偏移量+1,+1是因为指针,该指针指向该文件的下一个数据块

优点:

1.可以充分利用空白数据块

2.指针占据一定空间

缺点:

1.无法随机访问

优化方法:链表索引

即将所有指针的位置放入一张FAT中,这样就可以根据FAT迅速找到所需要查找的数据块的所指指针,根据该指针便可以快速得到相应数据块逻辑地址

2.太依靠指针,对磁盘设备要求高

4.3.6.3.索引分配

索引分配类似如上的链表索引

其与链表分配不同的地方就在于其抛弃了链表结构,真正通过索引块中的索引表(即表内的编号)来寻找数据块

逻辑地址与物理地址的关系:

物理地址=文件起始物理地址+前面的总数据块数*数据块大小+数据块内部的偏移

逻辑地址求法:索引编号

优点:

1.支持随机访问

2.支持动态伸缩文件长度,没有外部碎片

缺点:

1.需要建立索引数据块

2.索引数据块的访问耗时较长

索引分配的扩充办法——多重索引

当一层索引不够用时(即索引表满了但还未放下所有文件数据),可以采用二层索引,即让一层索引的每个指针再去指向一张索引表,这样就是一层索引的平方倍容量

4.3.7.空闲空间管理

通过位图来管理各个空闲块(一个一维数组)

对应下标的值来代表对应下标数据块的状态,0为空闲,1为被占用

因此,n个数据块需要n个单位长度的位图来管理,即占用n bit

5.大容量存储器

5.1.大容量存储结构

内存之外的存储器都成为大容量存储器,且一般越大读取速度越慢

5.1.1.磁盘结构

由若干面组成,每一面有一个同心圆,

每一面的同心圆可分成多个小同心圆,每一个小同心圆都是一个磁道且可等分成多个扇区

扇区是I/O的基本单位,读写均以扇区为单位

0扇区是最外边柱面的第一个磁道的第一个扇区

读写装置称为磁头,每一面上下都有磁头

与磁盘有关的数据计算:

1.平均宣传延迟时间,假设为X转/min,则该时间=60*1000/X/2,因为平均访问一个扇区对称扇区相加再相除,故要除2

2.CD-ROM的读取速率为150KB/s

5.1.2.计算机与外存储器的连接

当前有三种存储方式:

DAS随机附赠存储

NAS:网络附加存储

SAN:存储区域网

5.1.2.1.NAS的存储

通过LAN/WAN来进行存储

NAS - LAN/WAN - client

当用户需要访问时通过网络寻找

NAS不一定是盘阵,一台普通的主机就可以做出NAS,只要它自己有磁盘和文件系统,而且对外提供访问其文件系统的接口(如NFS,CIFS等),它就是一台NAS。就是将文件放在网络中,需要时通过相应的网络映射来找到该文件

5.1.2.2.SAN的存储

通过WAN/LAN存储

storage array - SAN - server - LAN/WAN - client

通过服务器等,用户可以访问SAN硬件(一个光通道交换机)来获取相关存储结构

SAN\NAS的区别:

可以这样来比作:SAN是一个网络上的磁盘;NAS是一个网络上的文件系统。其实根据SAN的定义,可知SAN其实是指一个网络,但是这个网络里包含着各种各样的元素,主机、适配器、网络交换机、磁盘阵列前端、盘阵后端、磁盘等。长时间以来,人们都习惯性的用SAN来特指FC,特指远端的磁盘。那么,一旦设计出了一种基于FC网络的NAS,而此时的SAN应该怎样称呼?所以,在说两者的区别时,用了一个比方,即把FC网络上的磁盘叫做SAN,把以太网络上的文件系统称为NAS,我们可以这样简单来理解。

普通台式机也可以充当NAS。NAS必须具备的物理条件有两条,第一,不管用什么方式,NAS必须可以访问卷或者物理磁盘;第二,NAS必须具有接入以太网的能力,也就是必须具有以太网卡。

5.2.磁盘调度

5.2.1.磁盘访问时间

由寻道时间、旋转延迟、传输时间三部分组成

寻道时间:磁头移到所需读扇区所需要的时间

旋转延迟:将磁盘所需读扇区旋转到磁头下面的时间(固定)

传输时间:读取数据的时间(固定)

三部分时间中寻道时间占比最长,而传输时间一般较短

5.2.2.不同的磁盘调度算法

当多个进程要访问磁盘时,就需要遵循一定的磁盘调度算法进行计算

5.2.2.1.FCFS先来先服务算法

根据进程要求访问磁盘的顺序来进行访问

5.2.2.2.SSTF最短寻道时间优先算法

就是离当前磁头最近的柱面先被访问

会导致较远较早申请访问的进程产生饥饿问题,对实时操作的应用如股票客户非常不友好

5.2.2.3.SCAN扫描调度算法

磁头从磁盘的一端开始向另一端移动,沿途相应访问请求,直到到达了磁盘的另一端,此时磁头反向移动并继续响应服务请求,也称为电梯算法(从上到下),但横移消耗较多时间

5.2.2.4.C-SCAN扫描调度算法

磁头从一端向另一端移动,沿途响应请求,当其到达另一端,便立刻返回开始处,即上升,在上升过程中不响应任何请求

5.2.2.5.LOOK与C-LOOK算法

即在每个方向上只移动到最远的地方(有数据请求的地方),不移到另一端

5.3.磁盘管理(了解)

5.3.1.磁盘格式化

低级格式化:吧磁盘划分为扇区,以便磁盘控制器可以进行读写

分区:把磁盘划分成一个或多个柱面组

逻辑格式化或创建文件系统

5.3.2.启动块

主引导记录:是逻辑上第一个读取的扇区,存储分区信息和小段引导代码

引导记录:在主分区或扩展分区中,会存在真正引导操作系统的程序,即主引导记录会找到引导记录,引导记录会找到需要引导的程序并解压,随后启动操作系统

5.4.RAID结构

即多个硬盘通过冗余实现可靠性

5.4.1.通过冗余实现可靠性

通过荣誉来改善可靠性,即不同的硬盘存储同样的数据拷贝,可以防止一块硬盘损坏时还有一块硬盘可以继续使用

5.4.2.镜像

存储一个副本,可以保证安全

5.4.3.通过并行处理改善性能

数据分散:在多个磁盘盘上分散数据, 可以改善传输率

6.小结

感谢你能看到这里,以上就是操作系统常考的全部内容,理论知识需要大量习题补充,所以仍需做题来获得好成绩。祝考试顺利

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值