【知识点总结】计算机操作系统

2023-05-16

第一章 操作系统引论

操作系统的特征

  • 并发

  • 共享

  • 虚拟

  • 异步

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

1、并发与并行

并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。

并行:指两个或多个事件在同一时间同时发生。

操作系统的并发性是指计算机系统中同时存在着多个运行着的程序。

2、共享

共享:即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。

共享方式

  • 互斥共享方式:系统中某些资源,一个时间段内只允许一个进程访问该资源。
  • 同时共享方式:系统中某些资源,允许一个时间段内由多个进程“同时”对它们进行访问。

3、虚拟

虚拟:是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的,而逻辑上的对应物是用户感受到的。

虚拟技术

  • 空分复用技术(如虚拟存储器技术)

  • 时分复用技术(如虚拟处理机)

    没有并发性,就谈不上虚拟性。

4、异步

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

只有系统拥有并发性,才可能导致异步性。

操作系统的发展与分类

  • 手工操作阶段
  • 批处理阶段
  • 分时操作系统
  • 实时操作系统
  • 网络操作系统
  • 分布式操作系统
  • 个人计算机操作系统

1、手工操作阶段

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

2、批处理阶段

单道批处理系统

引入脱机输入/输出技术(用磁带完成),并监督程序负责控制作业的输入、输出。

优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升。

缺点:内存中仅能有一道程序运行。CPU有大量的时间是在空闲等待I/O完成。资源利用率依然很低。

多道批处理系统

优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源保持“忙碌”状态,系统吞吐量增大。

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

3、分时操作系统

分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,各个用户可以通过终端与计算机进行交互。

优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人存在。

缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一个时间片,不区分任务的紧急性。

4、实时操作系统

优点:能够优先响应一些紧急任务,某些紧急任务不需要时间片排队。

在实时系统控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。

特点:及时性、可靠性

分类

  • 硬实时系统:必须在绝对严格的规定时间内完成处理
  • 软实时系统:能接受偶尔违反规定

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

1、指令

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

  • 特权指令
  • 非特权指令

2、处理器状态

  • 用户态(目态):只能执行非特权指令
  • 核心态(管态)

3、程序

  • 内核程序:系统的管理者,既可以执行特权指令,也可以执行非特权指令,运行在核心态。
  • 应用程序:只能执行非特权指令,运行在用户态。

4、操作系统的内核

  • 时钟管理
  • 中断处理
  • 原语
  • 对系统资源进行管理的功能

内核:是计算机上配置的底层软件,是操作系统最基本最核心的部分。

分类:大内核、微内核。

定义优点缺点
大内核将操作系统的主要功能模块都作为系统内核,运行在核心态高性能内核代码庞大,结构混乱,难以维护
微内核只把最基本的功能保留在内核内核功能少,结构清晰,方便维护需要频繁的在核心态和用户态之间切换,性能低

中断

中断可以使CPU从用户态切换为核心态,使操作系统获得计算机的控制权。

  • 内中断(也称异常、例外、陷入)
  • 外中断(中断)

系统调用

  • 设备管理:完成设备的 请求/释放/启动 等功能
  • 文件管理:完成文件的 读/写/创建/删除 等功能
  • 进程控制:完成进程的 创建/撤销/阻塞/唤醒 等功能
  • 进程通信:完成进程之间的 消息传递/信号传递 等功能
  • 内存管理:完成内存的 分配/回收 等功能

第二章 进程

进程的定义、组成、组织方式、特征

1、进程的定义

程序:就是一个指令序列

进程实体(进程映像):PCB(进程存在的唯一标志)、程序段、数据段。

进程:是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

2、进程的组成

  • 程序段
  • 数据段
  • PCB:进程标识符、处理机状态、进程调度信息、进程控制信息。

3、进程的组织方式

  • 链接方式
  • 索引方式

链接方式

按照进程状态将PCB分为多个队列

操作系统持有指向各个队列的指针

  • 执行指针
  • 就绪队列指针
  • 阻塞队列指针

索引方式

按照进程状态不同,建立几张索引表

操作系统持有指向各个索引表的指针

  • 执行指针
  • 就绪表指针
  • 阻塞表指针

4、进程的特征

  • 动态性:进程是程序的一次执行过程,是动态地产生、变化、和消亡的。(最基本特征)
  • 并发性:内存中有多个进程实体,各进程可并发执行。
  • 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位。
  • 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题。
  • 结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成。

进程的状态与转换

1、进程的状态

三种基本状态

  • 运行态:占有CPU,并在CPU上运行。
  • 就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行。
  • 阻塞态:因等待某一事件而暂时不能运行。

另外两种状态

  • 创建态(新建态):进程正在被创建,操作系统为进程分配资源、初始化PCB。
  • 终止态(结束态):进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB。

2、进程状态的转换

在这里插入图片描述

进程控制

用原语实现进程控制。

原语采用“关中段指令”和“开中段指令”实现。

原语是一种特殊的程序。

进程控制相关的原语

  • 进程的创建(创建原语)
  • 进程的终止(撤销原语)
  • 进程的阻塞(阻塞原语)
  • 进程的唤醒(唤醒原语)
  • 进程的切换(切换原语)

注:阻塞和唤醒必须成对出现。

进程通信

  • 共享存储
  • 管道通信
  • 消息传递

1、共享存储

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

  • 基于数据结构的共享
  • 基于存储区的共享

2、管道通信

1、管道只能采用半双工 通信,某一时间段内只能实现单向的传输。

2、各进程要互斥地访问管道。

3、数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。

4、如果没写满,就不允许读。如果没读空,就不允许写。

5、数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

3、消息传递

进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

  • 直接通信方式:消息直接挂到接收进程的消息缓冲队列上。
  • 间接通信方式:消息要先发送到中间实体(信箱)中。

线程概念和多线程模型

线程是一个基本的CPU执行单元,也是程序执行流的最小单位。

1、线程的属性

  • 线程是处理机调度的单位
  • 多CPU计算机中,各个线程可占用不同的CPU
  • 每个线程都有一个线程ID、线程控制块(TCB)
  • 线程也有就绪、阻塞、运行三种基本状态
  • 线程几乎不拥有系统资源
  • 同一进程的不同线程间共享进程的资源
  • 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
  • 同一进程中的线程切换,不会引起进程切换
  • 不同进程中的线程切换,会引起进程切换
  • 切换同进程内的线程,系统开销很小
  • 切换进程,系统开销较大

2、线程的实现方式

  • 用户级线程:由应用程序通过线程库实现。
  • 内核级线程:由操作系统内核完成。

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

3、多线程模型

多对一模型

内容:多个用户级线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。

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

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

一对一模型

内容:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。

优点:当一个线程被阻塞后,别的线程还可以继续运行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多对多模型

内容:n用户级线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。

克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

处理机调度

1、基本概念

2、三个层次

高级调度(作业调度)

内容:按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给它们分配内存等必要资源,并建立相应的进程(PCB),以使他(们)获得竞争处理机的权利。

高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。

高级调度主要是指调入问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。

中级调度(内存调度)

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

目的是为了提高内存利用率和系统吞吐量。

暂时调到外存等待的进程状态为挂起状态。值得注意的是,PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中存放的位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到挂起队列中。

低级调度(进程调度)

内容:按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。

进程调度是操作系统中最基本的一种调度。发生频率最高。

进程调度的时机、切换与过程、方式

1、进程调度的时机

进程在操作系统内核程序临界区中不能进行调度与切换。

内核程序临界区:一般是用来访问某种内核数据结构的,比如进程的就绪队列。

2、进程调度方式

非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。

剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要更紧迫的那个进程。

3、进程的切换与过程

狭义的进程调度:指的是从就绪队列中选中一个要运行的进程。

广义的进程调度:包含了选择一个进程和进程切换两个步骤。

进程切换:指一个进程让出处理机,由另一个进程占用处理机的过程。

进程切换的过程主要完成了:

1、对原来运行进程各种数据的保存

2、对新的进程各种数据的恢复

调度算法的评价指标

  • CPU利用率
  • 系统吞吐量
  • 周转时间
  • 等待时间
  • 响应时间

1、CPU利用率

CPU利用率:CPU“忙碌”的时间占总时间的比例

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

2、系统吞吐量

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

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

3、周转时间

周转时间:指从作业被提交给系统开始,到作业完成为止的这段时间间隔。

包括:

  • 作业在外存后备队列上等待作业调度(高级调度)的时间
  • 进程在就绪队列上等待进程调度(低级调度)的时间
  • 进程在CPU上执行的时间
  • 进程等待 I/O操作完成的时间

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

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

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

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

4、等待时间

等待时间:指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。

进程:等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。

作业:不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间

等待时间=周转时间-运行时间-(I/O操作的时间)

5、响应时间

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

调度算法

  • 先来先服务(FCFS)
  • 短作业优先(SJF)
  • 高响应比优先(HRRN)
  • 时间片轮转调度算法(RR)
  • 优先级调度算法
  • 多级反馈队列调度算法

1、先来先服务

先来先服务(FCFS)
算法思想从“公平”的角度考虑
算法规则按照作业/进程到达的先后顺序进行服务
用于作业/进程调度用于作业调度:考虑哪个作业先后到达后备队列;
用于进程调度:考虑哪个进程先后到达就绪队列
是否可抢占非抢占式算法
优缺点优点:公平、算法实现简单
缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即,FCFS算法对长作业有利,对短作业不利
是否会导致饥饿不会

2、短作业优先

短作业优先(SJF)
算法思想追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周转时间
算法规则最短的作业/进程优先得到服务
用于作业/进程调度几颗用于作业调度,也可用于进程调度。用于进程调度时成为“短进程优先(SPF)算法”
是否可抢占SJF和SPF是非抢占式算法。但是也有抢占式版本——最短剩余时间优先算法(SRTN)
优缺点优点:“最短的”平均等待时间、平均周转时间
缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提高的,并不一定真实,不一定能做到真正的短作业优先
是否会导致饥饿会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”

3、高响应比优先

高响应比优先(HRRN)
算法思想要综合考虑作业/进程的等待时间和要求服务的时间
算法规则在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务
响应比=(等待时间+要求服务时间)/要求服务时间
用于作业/进程调度既可用于作业调度,也可用于进程调度
是否可抢占非抢占式算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比
优缺点综合考虑了等待时间和运行时间(要求服务时间)
等待时间相同时,要求服务时间短的优先(SJF的优点)
要求服务时间相同时,等待时间长的优先(FCFS的优点)
对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题
是否会导致饥饿不会

4、时间片轮转调度算法

时间片轮转调度算法(RR)
算法思想公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
算法规则按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队
用于作业/进程调度用于进程调度
是否可抢占SJF和SPF是非抢占式算法。但是也有抢占式版本——最短剩余时间优先算法(SRTN)
优缺点优点:公平;响应快,适用于分时操作系统
缺点:由于高频率的进程切换因此有一定的开销;不区分任务的紧急程度
是否会导致饥饿不会

5、优先级调度算法

  • 静态优先级
  • 动态优先级
优先级调度算法
算法思想随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序
算法规则调度时选择优先级最高的作业/进程
用于作业/进程调度既可用于作业调度,也可用于进程调度。甚至,还会用于在之后会学习的I/O调度中
是否可抢占抢占式、非抢占式都有。做题时的区别在于:非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。
优缺点优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。
缺点:若源源不断地有高优先级进程到来,则可能导致饥饿
是否会导致饥饿

6、多级反馈队列调度算法

高响应比优先(HRRN)
算法思想对其他算法的折中权衡
算法规则1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
2.新进程到达时先进入第1级队列,按FCFS原 则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一-级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾
3. 只有第k级队列为空时,才会为k+1级队头的进程分配时间片
用于作业/进程调度用于进程调度
是否可抢占抢占式的算法。在k级队列的进程运行过程中,若更上级的队列(1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾。
优缺点对各类型进程相对公平(FCFS的优点) ;
每个新到达的进程都可以很快就得到响应(RR的优点) ;
短进程只用较少的时间就可完成(SPF的优点) ;
不必实现估计进程的运行时间( 避免用户作假) ;
可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程
(拓展:可以将因I/0而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级)
是否会导致饥饿

进程同步、互斥

1、进程同步

并发性带来了异步性,有时候需要通过进程同步解决这种异步问题。

有的进程之间需要相互配合地完成工作,各进程的工作推进需要遵循一定的先后顺序。

2、进程互斥

对临界资源的访问,需要互斥的进行。即同一时间段内只能允许一个进程访问该资源。

四个部分:

  • 进入区:检查可否进入临界区,若可进入,需要上锁
  • 临界区:访问临界资源的那段代码
  • 退出区:负责解锁
  • 剩余区:剩余代码部分
遵循的原则:
  • 空闲让进:临界区空闲时,应允许一个进程访问。
  • 忙则等待:临界区正在被访问时,其他试图访问的进程需要等待。
  • 有限等待:要在有限时间内进入临界区,保证不会饥饿。
  • 让权等待:进不了临界区的进程,要释放处理机,防止忙等。

进程互斥的软件实现方法

  • 单标志法
  • 双标志先检查
  • 双标志后检查
  • Peterson算法

1、单标志法

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

主要问题:违背了“空闲让进”原则。

2、双标志先检查法

算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0] = ture"意味着0号进程PO现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设true,之后开始访问临界区。

主要问题:违反“忙则等待”原则。进入区的“检查”和“上锁”两个处理不是一气呵成的。“检查”后,“上锁”前可能发生进程切换。

3、双标志后检查法

算法思想:双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁",但是这两个操作又无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁"后"检查”的方法,来避免.上述问题。

主要问题:解决了“忙则等待”的问题,但又违背了“空闲让进”和“有限等待”原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。

4、Peterson算法

算法思想:双标志后检查法中,两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。Gary L. Peterson想到了一种方法,如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”,主动让对方先使用临界区。

主要问题:未遵循让权等待的原则。

进程互斥的硬件实现方法

  • 中断屏蔽方法
  • TestAndSet(TS指令/TSL指令)
  • Swap指令(XCHG指令)

1、中断屏蔽方法

利用“开/关中断指令”实现。

优点:简单、高效

缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程

2、TestAndSet指令

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

优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境。

缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致忙等。

3、Swap指令(Exchange指令、XCHG指令)

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

优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境。

缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行Swap指令,从而导致忙等。

信号量机制

  • 整型信号量
  • 记录型信号量

wait、signal原语常简称为P、V操作

1、整型信号量

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

存在“忙等”问题。

2、记录型信号量

用记录型数据结构表示的信号量。

P操作中,一定先S.value–,之后可能需要执行block原语。

V操作中,一定先S.value++,之后可能需要执行wakeup原语。

遵循了“让权等待”原则。

用信号量实现进程互斥、同步、前驱关系

1、信号量机制实现进程互斥

  1. 分析并发进程的关键活动,划定临界区
  2. 设置互斥信号量mutex,初值为1
  3. 在临界区之前执行P(mutex)
  4. 在临界区之后执行V(mutex)

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

2、信号量机制实现进程同步

  1. 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作
  2. 设置同步信号量S,初始为0
  3. 在“前操作”之后执行V(S)
  4. 在“后操作”之前执行P(S)

3、信号量机制实现前驱关系

  1. 要为每一对前驱关系各设置一个同步变量
  2. 在“前操作”之后对相应的同步变量执行V操作
  3. 在“后操作”之前对相应的同步变量执行P操作

生产者—消费者问题

多生产者—多消费者问题

吸烟者问题

读者—写者问题

哲学家进餐问题

管程

1、管程的定义和基本特征

组成:

  1. 局部于管程的共享数据结构说明
  2. 对该数据结构进行操作的一组过程
  3. 对局部于管程的共享数据设置初始值的语句
  4. 管程有一个名字

基本特征:

  1. 局部于管程的数据只能被局部于管程的过程所访问
  2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
  3. 每次仅允许一个进程在管程内执行某个内部过程

死锁

1、死锁、饥饿、死循环

死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF) 算法中,若有源源不断的短进程到来,则长进程将一直 得不到处理机,从而发生长进程“饥饿”。

死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑bug导致的,有时是程序员故意设计的。

区别
死锁死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态。
饥饿可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到需要的I/O设备),也可能是就绪态(长期得不到处理机)
死循环可能只有一个进程发生死循环。死循环的进程可以上处理机运行(可以是运行态),只不过无法像期待的那样顺利推进。死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的。死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题

2、死锁产生的必要条件

  • 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)
  • 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
  • 请求和保持条件:进程已经保持了至少-一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
  • 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

注:发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)

当对不可剥夺资源的不合理分配,可能导致死锁。

3、死锁的处理策略

  1. 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
  2. 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)。
  3. 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生然后采取某种措施解除死锁。

死锁的处理

1、预防死锁

破坏互斥条件

内容:如果把只能互斥使用的资源改造成允许共享使用,则系统不会进入死锁状态。

缺点:并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保护这种互斥性。因此,很多时候都无法破坏互斥条件。

破坏不剥夺条件

内容:

  1. 方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件。
  2. 方案二:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)

缺点:

  1. 实现起来比较复杂。
  2. 释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如CPU。
  3. 反复地申请和释放资源会增加系统开销,降低系统吞吐量。
  4. 若采用方案一,意味着只要暂时得不到某个资源,之前获得的那些资源就都需要放弃,以后再重新申请。如果一直发生这样的情况,就会导致进程饥饿。

破坏请求和保持条件

内容:可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。

缺点:有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。

破坏循环等待条件

内容:采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。

原理分析:一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。

缺点:

  1. 不方便增加新的设备,因为可能需要重新分配所有的编号;
  2. 进程实际使用资源的顺序可能和.编号递增顺序不一致,会导致资源浪费;
  3. 必须按规定次序申请资源,用户编程麻烦。

2、避免死锁

安全序列:指如果系统按照这种序列分配资源,则每个进程都能顺序完成。只要能找出一个安全序列,系统就是安全状态。

如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁。

在资源分配之前预先判断此次分配是否会导致系统进入不安全状态,以此决定是否答应资源的分配请求。

银行家算法步骤:

  1. 检查此次申请是否超过了之前声明的最大需求数
  2. 检查此时系统剩余的可用资源是否还能满足这次请求
  3. 试探着分配,更改各数据结构
  4. 用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤:
检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。

不断重复上述过程,看最终是否能让所有进程都加入安全序列。

3、死锁的检测和解除

死锁的检测

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

数据结构:资源分配图

在这里插入图片描述

算法:

1)在资源分配图中,找出既不阻塞又不是孤点的进程Pi (即找出一-条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量。如下图中,R1没有空闲资源,R2有一个空闲资源。若所有的连接该进程的边均满足上述条件,则这个进程能继续运行直至完成,然后释放它所占有的所有资源)。消去它所有的请求边和分配变,使之称为孤立的结点。在下图中,P1是满足这一条件的进程结点,于是将P1的所有边消去。

2)进程Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。在下图中,P2 就满足这样的条件。根据1)中的方法进行一系列简化后,若能消去途中所有的边,则称该图是可完全简化的。

死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁。

死锁的解除

  1. 资源剥夺法。挂起( 暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
  2. 撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏- -篑,以后还得从头再来。
  3. 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

第三章 内存

内存的基础知识

内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。

装入的三种方式

绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。(只适用于单道程序环境)

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

动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。(允许程序在内存中发生移动)

链接的三种方式

静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块)之后不再拆开。
装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。

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

内存管理的概念

1、操作系统负责内存空间的分配与回收

2、操作系统需要提供某种技术从逻辑上对内存 空间进行扩充

3、操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换

4、操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰。

  1. 设置一对上下限寄存器
  2. 采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)

重定位寄存器:放的是起始物理地址。

界地址寄存器:放的是最大逻辑地址。

内存空间的扩充

覆盖技术

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

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

交换技术

设计思想:内存空间紧张时,系统将内存中某些进程暂时换出(挂起)外存,把外存中某些已具备运行条件的进程换入内存。

磁盘分为文件区和交换区,换出的进程放在对换区。

区别

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

交换时在不同进程(或作业)之间的。

内存空间的分配与回收

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

连续分配管理方式

单一连续分配

内存分为系统区和用户区。

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

用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户区空间。

优点:实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护。

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

固定分区分配
  • 分区大小相等
  • 分区大小不等

使用分区说明表来实现对各个分区的分配与回收。每个表包括对应分区的大小,起始地址,状态。

优点:实现简单,无外部碎片。

缺点:a.当用户程序太大时,可能所有分区都不能满足需求,此时不得不采用覆盖技术来解决,但这又会降低性能;b.会产生内部碎片,内存利用率低。

动态分区分配

不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态的建立分区。

数据结构:空闲分区表/空闲分区链

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

紧凑技术

动态分区分配算法

首次适应算法

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

实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

最佳适应算法

算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的–整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。

实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

缺点:每次都选择最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多外部碎片。

最坏适应算法

又称最大适应算法( Largest Fit)
算法思想:为了解决最佳适应算法的问题–即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。

实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。

邻近适应算法

算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。

实现:空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

首次适应算法每次都要从头查找,每次都需要检索低地址的小分区。但是这种规则也决定了当低地址部分有更小的分区可以满足需求时,
会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的大分区保留”下来(最佳适应算法的优点)

邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使
用,划分为小分区,最后导致无大分区可用(最大适应算法的缺点)

基本分页存储管理的基本概念

思想:把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分。

每个分区就是一个页框/页帧/内存块/物理块。每个页框有一个编号,即”页框号“,页框号从0开始。

将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或“页面”。每个页面也有一个编号,即“页号”,页号也是从0开始。

地址转换

页号=逻辑地址/页面长度

页内偏移量=逻辑地址%页面长度

页表

页表项由”页号“(隐含)和”块号“组成。

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

基本地址变换机构

具有快表的地址变换机构

局部性原理

时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。( 因为程序中存在大量的循环)

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

快表

快表,又称联想寄存器(TLB) ,是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。

在这里插入图片描述

两级页表

为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表。

多级页表中,各级页表的大小不能超过一个页面。若两级页表不够,可以分更多级。

多级页表的访存次数——N级页表访问一个逻辑地址需要N+1次访存。

基本分段存储管理方式

分段

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

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

分段系统的逻辑地址结构:由段号和段内地址所组成。

段表

段表记录了该段在内存中的起始位置(基址)和段的长度。

在这里插入图片描述

页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的。

段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。

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

分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。

分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。

分段比分页更容易实现信息的共享和保护。

不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的(比如,有一个代码段中有很多变量,各进程并发地同时访问可能造成数据不一致)

分页(单级页表)、分段访问一个逻辑地址都需要两次访存,分段存储中也可以引入快表机构。

段页式管理方式

优点缺点
分页管理内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片不方便按照逻辑模块实现信息的共享和保护
分段管理很方便按照逻辑模块实现信息的共享和保护如果段长过大,为其分配很大的连续空间会很不方便。另外,段式管理会产生外部碎片

段页式系统的逻辑地址结构:由段号、页号和页内地址所组成。

在这里插入图片描述

引入快表后仅需一次访存。

虚拟内存

基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。

特征:

  • 多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
  • 对换性:在作业运行时无需一-直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
  • 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。

实现

  • 请求分页存储管理
  • 请求分段存储管理
  • 请求段页式存储管理

请求分页管理方式

缺页中断机构

在请求分页系统中,每当要访问的页面不在内存时,便产生-一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。

缺页中断属于内中断。

地址变换机构

页面置换算法

  • 最佳置换算法(OPT)
  • 先进先出置换算法(FIFO)
  • 最近最久未使用置换算法(LRU)
  • 时钟置换算法(CLOCK)
  • 改进型时钟置换算法

1、最佳置换算法(OPT)

内容:每次选择淘汰的页面将是以后永远不使用,或者在最长时间内不再被访问的页面。

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

内容:每次选择淘汰的页面是最早进入内存的页面

实现方法:把调入内存的页面根据调入的先后顺序排成一一个队列,需要换出页面时选择队头页面即可。队列的最大长度取决于系统为进程分配了多少个内存块。

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

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

内容:每次淘汰的页面是最近最久未使用的页面

实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。

4、时钟置换算法(CLOCK)

内容:最佳置换算法性能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用置换算法性能好,是最接近OPT算法性能的,但是实现起来需要专门的硬件支持,算法开销大。时钟置换算法是一-种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,Not Recently Used)。

实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描)。

5、改进型时钟置换算法

简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要执行I/0操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。
因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进型的时钟置换算法的思想。
修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。
为方便讨论,用(访问位,修改位)的形式表示各页面状态。如(1, 1)表示一个页面近期被访问过,且被修改过。

算法规则:将所有可能被置换的页面排成一个循环队列
第一轮:从当前位置开始扫描到第-一个(0, 0)的帧用于替换。本轮扫描不修改任何标志位
第二轮:若第一轮扫描失败,则重新扫描,查找第- -一个(0, 1)的帧用于替换。本轮将所有扫描过的帧访问位设为0
第三轮:若第二轮扫描失败,则重新扫描,查找第-一个(0,0) 的帧用于替换。本轮扫描不修改任何标志位
第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0, 1)的帧用于替换。
由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择–个淘汰页面最多会进行四轮扫描。

页面分配策略

驻留集:指请求分页存储管理中给进程分配的物理块的集合。

固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集大小不变
可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即,驻留集大小可变

局部置换:发生缺页时只能选进程自己的物理块进行置换。
全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。

固定分配局部置换:系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面。这种策略的缺点是:很难在刚开始就确定应为每个进程分配多少个物理块才算合理。( 采用这种策略的系统可以根据进程大小、优先级、或是根据程序员给出的参数来确定为一个进程分配的内存块数)
可变分配全局置换:刚开始会为每个进程分配一定数量的物理块。操作系统会保持一个空闲物理块队列。当某进程发生缺页时,从空闲物理块中取出一块分配给该进程;若已无空闲物理块,则可选择一个未锁定的页面换出外存,再将该物理块分配给缺页的进程。采用这种策略时,只要某进程发生缺页,都将获得新的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。
可变分配局部置换:刚开始会为每个进程分配一定数量的物理块。当某进程发生缺页时,只允许从该进程自己的物理块中选出一个进行换出外存。如果进程在运行中频繁地缺页,系统会为该进程多分配几个物理块,直至该进程缺页率趋势适当程度;反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。

可变分配全局置换:只要缺页就给分配新物理块。

可变分配局部置换:要根据发生缺页的频率来动态的增加或减少进程的物理块。

何时调入页面

  1. 预调页策略
  2. 请求调页策略

从何处调入页面

  1. 系统拥有 足够的对换区空间: 页面的调入、 调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出速度很快。在进程运行前,需将进程相关的数据从文件区复制到对换区。
  2. 系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。
  3. UNIX 方式:运行之前进程有关的数据全部放在文件区,故未使用过的页面,都可从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入。

抖动(颠簸)现象

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)

工作集

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

驻留集不能小于工作集的大小,否则进程运行过程将频繁缺页。

第四章 文件管理

文件的逻辑结构

无结构文件

文件内内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。

有结构文件

由一组相似的记录 组成,又称“记录式文件”。每条记录由若干给数据项组成。

顺序文件

文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储。

  • 串结构:记录之间的顺序与关键字无关
  • 顺序结构:记录之间的顺序按关键字顺序排列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLiJgAfF-1608120518632)(D:\桌面\QQ截图20201216162003.png)]

索引文件

索引表本身是定长记录的顺序文件。因此可以快.速找到第i个记录对应的索引项。可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找每当要增加/删除–个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。

索引顺序文件

索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。

多级索引顺序文件

文件目录

文件控制块

目录结构

单级目录结构

实现了“按名存取”,但不允许文件重名。

两级目录结构

分为主文件目录(MFD)和用户文件目录(UFD)。

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

用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间用“/”隔开。从根目录出发的路径称为绝对路径。

树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。为此,提出了“无环图目录结构”。

无环图目录结构

可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。 需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。只有共享计数器减为0时,才删除结点。
注意:共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。

索引节点(FCB改进)

  • 除文件名之外所有信息都放到索引节点中,每个文件对应一个索引节点
  • 目录项中只包含文件名、索引结点指针

文件的物理结构

文件块、磁盘块

磁盘块的大小与内存块、页面的大小相同。

文件分配方式

连续分配

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

优点:支持顺序访问和直接访问(即随机访问) ;连续分配的文件在顺序访问时速度最快

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

链接分配

链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。

隐式链接:除文件的最后-一个盘块之外,每个盘块中都存有指向下一一个盘块的指针。文件目录包括文件第一块的指针和最后-块的指针。
优点:很方便文件拓展,不会有碎片问题,外存利用率高。
缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。

显式链接:把用于链接文件各物理块的指针显式地存放在一张表中,即文件分配表(FAT, FileAllocation Table)。一个磁盘只会建立一张文件分配表。开机时文件分配表放入内存,并常驻内存。
优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
缺点:文件分配表的需要占用一定的存储空间。

索引分配

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表, 索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。

①链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来。

②多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。

③混合索引:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。

文件存储空间管理

存储空间管理

空闲表法

空闲链表法

  • 空闲盘块链:以盘块为单位
  • 空闲盘区链:以盘区为单位

位示图法

成组链接法

文件的基本操作

文件共享

  • 基于索引结点的共享方式(硬链接)
  • 基于符号链的共享方式(软链接)

文件保护

  • 口令保护
  • 加密保护
  • 访问控制

口令保护

为文件设置-一个“口令”(如: abc112233) ,用户请求访问该文件时必须提供“口令”。

优点:保存口令的空间开销不多,验证口令的时间开销也很小。

缺点:正确的“口令”存放在系统内部,不够安全。

加密保护

使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。

优点:保密性强,不需要在系统中存储“密码”

缺点:编码/译码,或者说加密/解密要花费一定时间

访问控制

在每个文件的FCB ( 或索引结点)中增加一个访问控制列表(Access-Control List, ACL),该表中记录了各个用户可以对该文件执行哪些操作。

文件系统的层次结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PoBcnLls-1608120518634)(D:\桌面\QQ截图20201216180847.png)]

磁盘的结构

磁盘、磁道、扇区

盘面、柱面

磁盘的分类

  • 活动头磁盘

  • 固定头磁盘

  • 可换盘磁片

  • 固定盘磁片

磁盘调度

一次磁盘读/写操作需要时间

寻找时间(寻道时间) Ts:在读/写数据前,将磁头移动到指定磁道所花的时间。
①启动磁头臂是需要时间的。假设耗时为s;
②移动磁头也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为m,总共需要跨越n条磁道。则:

寻道时间Ts=s+ m*n

延迟时间Tp:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为r (单位: 转/秒,或转/分),则:

平均所需的延迟时间T。= (1/2)*(1/r)= 1/2r

传输时间T;:从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速为r,此次读/写的字节数为b,每个磁道上的字节数为N。则:

传输时间T[= (1/r) * (b/N) = b/(rN)

先来先服务算法(FCFS)

最短寻找时间优先(SSTF)

SSTF算法会优先处理的磁道是与当前磁头最近的磁道。可以保证每次的寻道时间最短,但是并不能保证总的寻道时间最短。(其实就是贪心算法的思想,只是选择眼前最优,但是总体未必最优)

优点:性能较好,平均寻道时间短

缺点:可能产生“饥饿”现象

扫描算法(SCAN)

SSTF算法会产生饥饿的原因在于:磁头有可能在一个小区域内来回来去地移动。为了防止这个问题,可以规定,只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。这就是扫描算法(SCAN) 的思想。由于磁头移动的方式很像电梯,因此也叫电梯算法。

优点:性能较好,平均寻道时间较短,不会产生饥饿现象

缺点:

①只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了。
②SCAN算法对于各个位置磁道的响应频率不平均(如:假设此时磁头正在往右移动,且刚处理过90号磁道,那么下次处理90号磁道的请求就需要等磁头移动很长一段距离; 而响应了184号磁道的请求之后,很快又可以再次响应184号磁道的请求了)

LOOK调度算法

扫描算法(SCAN) 中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了。LOOK调度算法就是为了解决这个问题,如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边察, 因此叫LOOK )

优点:比起SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短

循环扫描算法(C-SCAN)

SCAN算法对于各个位置磁道的响应频率不平均,而C-SCAN算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。

优点:比起SCAN来,对于各个位置磁道的响应频率很平均。
缺点:只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了;并且,磁头返回时其实只需要返回到18号磁道即可,不需要返回到最边缘的磁道。另外,比起SCAN算法来,平均寻道时间更长。

C-LOOK调度算法

C-SCAN算法的主要缺点是只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定需要返回到最边缘的磁道上。C-LOOK 算法就是为了解决这个问题。如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

优点:比起C-SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短

减少磁盘延迟时间的算法

交替编号

错位命名

磁盘地址结构设计

磁盘管理

磁盘初始化

  1. 低级格式化(物理格式化)
  2. 将磁盘分区
  3. 进行逻辑格式化

引导块

自举程序

坏块的管理

坏块链、扇区备用

第五章 设备管理

I/O设备的分类

按使用特性分类:

  • 人机交互类外部设备
  • 存储设备
  • 网络通信设备

按传输速率分类:

  • 低速设备
  • 中速设备
  • 高速设备

按信息交换的单位分类:

  • 块设备
  • 字符设备

I/O控制器

  • 电子部件(I/O控制器、设备控制器)
  • 机械部件

功能

  • 接受和识别 CPU发出的命令(控制寄存器)
  • 向CPU报告设备的状态(状态寄存器)
  • 数据交换(数据寄存器)
  • 地址识别

组成

  • CPU与控制器之间的接口(实现控制器与CPU之间的通信)
  • I/O逻辑(负责识别CPU发出的命令,并向设备发出命令)
  • 控制器与设备之间的接口(实现控制器与设备之间的通信)

两种寄存器编址方式

  • 内存映射I/O
  • 寄存器独立编址

I/O控制方式

  • 程序直接控制方式
  • 中断驱动方式
  • DMA方式
  • 通道控制方式

I/O软件层次结构

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【知识点总结】计算机操作系统 的相关文章

  • 基于BERT的知识库问答系统(KBQA)

    基于BERT的知识库问答系统 xff08 KBQA xff09 简介 知识库问答系统主要要做的两点分别是识别问题中的实体和提取问题中我们需要从知识库中查找的属性 xff0c 针对这两个方面我采用了NLP预训练模型BERT分别训练了基于BER
  • libc6-dev : 依赖: libc6 (= 2.23-0ubuntu3) 但是 2.23-0ubuntu10 正要被安装

    无法安装libc6 dev 如果出现下面错误 xff1a 在装libc6 dev时下列的软件包有不能满足的依赖关系 xff1a libc6 dev 依赖 libc6 61 2 23 0ubuntu3 但是 2 23 0ubuntu10 正要
  • VScode使用sftp远程修改文件

    一 下载插件 二 创建任意一个文件夹 sftp插件是在文件夹下生效的 因为你要在文件夹下进行sftp的配置 以及打开远程文件 三 配置远程连接配置 快捷键 Ctrl 43 Shift 43 P 打开config span class tok
  • iOS 上接入Lottie动画 接入Json动画

    iOS设备上的动画借助官方SDK xff1a CoreAnimation那一套已经比较强大了 xff0c 基本上的动效都能实现 xff0c 就是1 开发这边比较累 xff1b 2 安卓那边也比较累况且 俩平台最后展示的可能有些细节还不一样
  • 安装pysyft联邦框架和pysyft代码案例

    pysyft联邦框架 1 新建虚拟环境2 安装pysyft3 安装jaxlib4 安装完成5 安装结果测试6 注意事项7 pysyft框架联邦案例8 一些优秀教程9 报错解决办法 1 新建虚拟环境 由于pysyft和pytorch之间有版本
  • Ps1终端提示符的参数设置

    1 了解PS1 PS1 61 u 64 h W PS1的常用参数以及含义 d xff1a 代表日期 xff0c 格式为weekday month date xff0c 例如 xff1a Mon Aug 1 H xff1a 完整的主机名称 h
  • Python3 实现简单的生命游戏

    Python3 实现简单的生命游戏 生命游戏是英国数学家约翰 何顿 康威在1970年发明的细胞自动机 生命游戏原理 细胞自动机 xff08 又称元胞自动机 xff09 xff0c 名字虽然很深奥 xff0c 但是它的行为却是非常美妙的 所有
  • 图论

    图是数据结构和算法学中最强大的框架之一 xff08 或许没有之一 xff09 图 xff08 graph xff09 并不是指图形图像 xff08 image xff09 或地图 xff08 map xff09 通常来说 xff0c 我们会
  • 【Python】【Pygame】游戏:抓球

    来源 xff1a Python编程 从入门到实践 13 5 14 1 14 2 我感觉这个题目继续学习还可以优化 xff0c 是一个不错的小游戏 等我学了记分再来继续改进 抓球 xff08 13 5 xff09 碗在底部左右移动 xff0c
  • Linux MariaDB 主从复制

    安装MariaDB 安装MariaDB教程 主从复制 搭建主从复制数据库不能先建数据库 xff0c 有数据库 xff0c 需要先删除 xff01 xff01 xff01 Master主数据库 主从复制详细参数列表 主服务器MariaDB的
  • Linux MariaDB使用OpenSSL安装SSL证书

    进入到证书存放目录 xff0c 批量删除 pem证书 警告 xff1a 确保已经进入到证书存放目录 find span class token punctuation span span class token operator span
  • Windows Server 2016创建用户、授权、其他用户远程登录、禁止/恢复administrator远程登录

    创建用户和授权管理员 win 43 s搜索控制面板 用户账户 更改账户类型 添加用户账户 完成 更改账户类型 管理员 更改账户类型 允许其他用户远程登录 win 43 s搜索高级系统设置 远程 远程桌面 允许远程连接到此计算机和勾选仅允许运
  • 使用kotlin扩展插件/依赖项简化代码(在最新版本4.0以后,此插件已被弃用,故请选择性学习,以了解为主。)

    1 添加取代findViewById XXX 的插件 xff1b id 39 kotlin android extensions 39 取代findViewById XXX 可以在kotlin代码中直接使用View上的控件id 2 扩展插件
  • 华为Fusion Compute通过存储LUN快照恢复数据

    上一篇博客里边写到了VMware虚拟化通过存储LUN快照恢复数据 xff0c 在里边提到华为虚拟化和其他KVM有区别 xff0c 这是真的血泪史呀 事情是这样的 xff0c 一个客户用的华为云桌面 xff0c 就是普通架构 xff0c 传统
  • 【转】ubuntu linux取消软件密码环和取消输入开机密码

    所用版本 xff1a ubuntu18 xff08 亲测16也成功了 xff09 取消软件密码环 win键打开菜单 gt 搜索pass word gt login选项 gt 右键删除某个密码环 转自 https www cnblogs co
  • 2_3-numpy-cnn-mnist手写数字识别

    numpy实现神经网络系列 工程地址 xff1a https github com yizt numpy neuron network 基础知识 0 1 全连接层 损失函数的反向传播 0 2 1 卷积层的反向传播 单通道 无padding
  • python获取threading线程返回结果

    python获取threading线程返回结果 span class token keyword class span span class token class name MyThread span span class token p
  • ADX的计算方式

    平均趋向指数是衡量趋势的技术工具 xff0c 简称ADX average directional indicator xff0c 它是由韦尔斯 怀尔德在1978年提出 xff0c 与其他技术分析工具不同的是 xff0c ADX并不能判断多空
  • uni app项目中实现vue和html通信

    vue实现 web view 是一个 web 浏览器组件 xff0c 可以用来承载网页的容器 xff0c 会自动铺满整个页面 个人业务 xff08 需要实现一个本地的html文件的内嵌 xff09 xff0c 由于web view是自动铺满
  • uni app实现中英文语言切换

    因为业务需求很多app都是可以多种语言进行切换的 xff0c 以此来方便用户的使用 做语言的切换一定要开发开始的时候就规划好 xff0c 不然确实太麻烦了 xff0c 我是后期开发的语言切换 xff0c 好多个页面都需要进行修改 main

随机推荐

  • uniapp一套代码开发app和微信小程序

    为什么选择uniapp开发 xff1f 为什么选择uniapp进行开发 xff1f 1 uniapp对于独自开发是相当友好的 xff0c 一套代码可以兼容app xff08 安卓 xff0c ios xff09 小程序 xff0c h5等
  • python + selenium的使用 - mac可能出现的问题

    注意服务器部署selenium时 xff0c 代码中一定要添加关闭浏览器驱动的语句 xff08 代码执行结束后不会自动关闭浏览器驱动 xff09 xff0c 否则会导致服务器磁盘被占满 1 安装selenium pip span class
  • 使用Truffle 和 Ganache编译、发布智能合约

    文章目录 Truffle开发框架步骤1 安装Truffle2 查看安装是否成功3 创建没有合约的空工程 xff0c 可以使用 truffle init4 编译Truffle项目的合约truffle compile编译问题 5 构建文件Art
  • 基于Ganache和MetaMask搭建以太坊私有网络

    使用Truffle 和 Ganache 编译 发布智能合约 请参考作者博客https blog csdn net weixin 43958804 article details 109576016 操作步骤 下载ganache https
  • python面试题--统计文件中字母出现的次数

    统计字母出现的次数 fp span class token operator 61 span span class token builtin open span span class token punctuation span span
  • 迁移EFI分区至固态硬盘

    接上回 加装SSD后的第二天 xff0c 我发现原来20s开机的电脑居然变成了30s开机 于是我就开始思考什么问题导致了这个情况 xff0c 根据启动顺序问题 xff0c 我发现可能是安装系统时 xff0c 我没拔下HDD的SATA0接口的
  • go defer,panic,recover详解 go 的异常处理

    转载 https www jianshu com p 63e3d57f285f golang中defer panic recover是很常用的三个特性 xff0c 三者一起使用可以充当其他语言中try catch 的角色 xff0c 而de
  • 重新在虚拟机上安装了centOS7系统

    参考教程 xff1a VMware 安装 Centos7 超详细过程 菜鸟教程
  • centOS安装

    1 安装ImageMagick yum install y ImageMagick 2 安装GhostScript yum install y ghostscript 验证是否安装成功 gs version 3 安装libreoffice
  • 10问10答:你真的了解线程池吗?

    Java开发手册 中强调 xff0c 线程资源必须通过线程池提供 xff0c 而创建线程池必须使用ThreadPoolExecutor 手册主要强调利用线程池避免两个问题 xff0c 一是线程过渡切换 xff0c 二是避免请求过多时造成OO
  • TensorRT 加载模型onnx报错: Error Code 10: Internal Error (Could not find any implementation for node

    1 背景 在TensorRT加载ONNX文件 bert模型 xff09 过程出现如标题所示的错误信息 在相同的代码 xff0c 相同的TensorRT版本 xff0c 在3090 xff08 43 win10 xff09 可以进行正常加载和
  • 【Git】在IDEA拉取master分支到你的开发分支上

    git checkout到master2 git pull xff0c 拉去master最新代码 3 git checkout到你的开发分支 右键项目 选择远程master 确定后如果有冲突 xff0c 则解决冲突即可 弄完最后git pu
  • UNIX环境高级编程-第一章

    1 UNIX体系结构 xff1a 严格意义上说 xff0c 可将操作系统定义为一种软件 xff0c 它控制计算机硬件资源 xff0c 提供程序运行环境 我们通常将这种软件称为内核 xff0c 因为它相对较小 xff0c 而且位于环境的核心
  • AP6275S移植总结

    RK3308B 43 AP6275S移植 在rk3308b平台移植rtl8821cs rlt8821cs是wifi 43 bt一体的模组 xff0c 主要记录下移植过程中需要注意的地方 移植驱动 将rtl8821cs的驱动包复制到rk的SD
  • float类型

    float类型遵循IEEE754标准 xff0c 该标准为32位浮点数规定了二进制表示形式 IEEE754采用二进制的科学计数法来表示浮点数 对于float浮点数 xff0c 用1位表示数字的符号 xff08 浮点数正负性 xff0c 0正
  • 判断点与直线的位置关系

    判断点与直线的位置关系是计算几何里面的一个最基本算法 xff0c 可以使用向量来判断 定义 xff1a 平面上三个点A x1 y1 B x2 y2 C x3 y3 xff0c 判断点C与 A B overr
  • 【知识点总结】大数据技术原理与应用

    大数据技术原理与应用 本文是对 大数据与云计算导论 课程知识点的应试总结 基本涵盖了 大数据技术原理与应用 的重点内容 思维导图由 64 福尔摩东整理 第一章 大数据概述 1 三次信息化浪潮 信息化浪潮发生时间标志解决的问题代表企业第一次浪
  • BlockingQueue

    BlockingQueue 一 阻塞队列基本方法介绍 谈到线程池 xff0c 不得不谈到生产者 消费者模式 xff0c 谈到生产者 消费者 xff0c 就不得不谈到对应的数据结构 xff0c 谈到对应的数据结构不得不言 BlockingQu
  • 【Python爬虫】猫眼电影榜单Top100

    这是一个入门级的Python爬虫 xff0c 结构易于理解 本文对编写此爬虫的全过程进行了讲述 希望对大家的Python爬虫学习有所帮助 一 目标 爬取猫眼电影榜单Top100 xff0c 将数据存入Excel文件中 xff0c 并利用py
  • 【知识点总结】计算机操作系统

    第一章 操作系统引论 操作系统的特征 并发 共享 虚拟 异步 并发和共享是两个最基本的特征 xff0c 二者互为存在条件 1 并发与并行 并发 xff1a 指两个或多个事件在同一时间间隔内发生 这些事件宏观上是同时发生的 xff0c 但微观