秋招保驾护航系列文章正在持续更新,往期文章如下,需者自取:
- html、css:秋招保驾护航——HTML、CSS篇
- js:秋招保驾护航——js面试篇(上)、秋招保驾护航——js面试篇(下)
- 浏览器:秋招保驾护航——浏览器篇
- vue:秋招保驾护航——vue篇
- 计算机网络:秋招保驾护航——计算机网络
- 操作系统:秋招保驾护航——操作系统篇
- 数据库:秋招保驾护航——数据库篇
操作系统
作为基础课程,需要了解常见的知识
基本概念:
- 操作系统的概念、特征、提供的服务
- 特权指令、非特权指令、操作系统的内核
- 中断和异常
- 系统调用
进程管理:
- 进程的定义、组成、组织方式、特征
- 进程的状态和转换(5中状态、7种状态)
- 进程的通信:共享存储、管道通信、消息传递
- 进程和线程的区别
- 处理机的调度:高级调度(作业调度)、中级调度(虚拟存储技术)、低级调度(进程调度)
- 进程调度算法: FCFS、短进程优先调度、时间轮片调度算法、不可剥夺优先级调度算法、可剥夺优先级调度算法
- 进程的同步、互斥
- 进程互斥的实现:软件层面、硬件层面、信号量、管程
- 死锁的概念、产生条件、发生时机
- 死锁的处理方法:预防死锁、避免死锁(银行家算法)、死锁的检测和解除
存储管理:
- 负责内存空间的分配和回收
- 提供某种技术从逻辑上对内存空间进行扩充(虚拟内存技术)
- 地址转换功能,逻辑地址到物理地址的转换,程序员只要关心逻辑地址上的变化
- 绝对装入:编译器负责地址转换(单批道,无操作系统)
- 可重定位装入:装入程序负责地址转换(早期多批道处理阶段)
- 动态运行时装入:运行时才进行地址转换(现代操作系统)
- 操作系统需要提供内存保护功能,保证各个进程在各自存储空间内运行,互不干扰
- 设置上下限寄存器
- 利用重定位寄存器、界地址寄存器进行判断
文件管理:
- 文件内部数据如何组织起来?
- 文件之间如何组织起来?
- 从下往上看,os应该提供哪些功能来方便用户使用?
- 从上往下看,文件数据应该如何被存放到外存磁盘上?
基本概念
1. 操作系统的基本概念
下面从几个方面来看操作系统提供的服务:
(1)作为系统资源管理者
- 处理机管理
- 存储管理
- 文件管理
- 设备管理
(2)作为用户和计算机硬件之间的接口
- 命令接口
- 程序接口
- GUI
(3)作为最接近硬件的层次
- 实现对硬件机器的拓展
2. 操作系统的特征
(1)并发
- 并发:两个或多个事件在同一时间段内同时发生。宏观上是同步的,微观上是交替的。
- 并行:两个或多个事件在同一时刻发生。
(2)共享
资源共享,系统中的资源可以同时给多个并发的进程使用。有两种共享方式:
- 互斥共享:一个时间段内只能一个进程访问。
- 同时共享:一个时间段内可以多个进程访问。宏观上是同步的,微观上是交替的。
(3)虚拟
将物理上的实体,即实际存在的,转换成逻辑上的对应物,即用户感知的。
(4)异步
进程的执行不是连续的,而是走走停停的。
进程管理
1. 进程的概念
进程由PCB、程序段和数据段组成。
- 进程是程序的一次执行
- 进程是系统调用和进行资源分配的独立单位
2. 进程的状态以及转换
引入交换技术前的进程调度:
引入交换技术后的进程调度:
3. 进程的通信
进程是独立的资源分配单位,一次进程之间信息的交换需要进行通信。
(1)共享存储方式
- 这种方式中进程对空间的访问必须是互斥的
(2)管道通信
- 管道通信是半双工的,如果想要全双工,需要两个管道
- 各进程互斥访问管道
(3)消息传递
- 由操作系统提供的“发送消息/接受消息”的原语完成
4. 进程和线程
早期系统是单批道,会导致系统资源处于空闲。在引入操作系统后提供了进程的管理和控制,因此可以并发的运行多个程序。而一个进程内部可能也需要并发运行的制度,比如我们使用qq需要同时进行视频和聊天两项功能,因此出现了一种轻量级的进程,也就是线程。
- 进程是系统资源分配的最小单位,线程是cpu调度的最小单元
- 线程是轻量级的进程,同一个进程的线程可以共享资源
- 线程提高了并发度,且开销比进程小。
5. 处理机的调度
由于系统资源有限,处理机需要按照某种规则来处理任务的顺序。
处理机的调度有三个层次:
- 高级调度(作业调度)
- 中级调度(面向进程)
- 低级调度(进程调度)
5.1 高级调度
高级调度是面向作业的。由于内存空间有限。需要按照一定的规则从后备作业挑选一个或多个作业进行资源分配,建立相应的进程。
5.2 中级调度
中级调度是面向进程的。这里面涉及到了虚拟存储技术,就是将暂时不能运行的进程调至外存。等待其重新具备了运行的条件后在重新调入内存,而这种调至外存的状态叫做挂起状态
5.3 低级调度
按照某种方法和策略从就绪队列中选取一个进程,并为其分配cpu
一些常见的进程调度算法:
- 先来先服务算法(FCFS)
- 非剥夺的优先级调度
- 剥夺的优先级调度
- 时间片轮转调度算法(RR)
- 短进程有限调度算法(SPF)
存储管理
操作系统作为资源的管理者,需要负责的事情如下:
- 负责内存空间的分配和回收
- 提供某种技术从逻辑上对内存空间进行扩充(虚拟内存技术)
- 地址转换功能,逻辑地址到物理地址的转换,程序员只要关心逻辑地址上的变化
- 绝对装入:编译器负责地址转换(单批道,无操作系统)
- 可重定位装入:装入程序负责地址转换(早期多批道处理阶段)
- 动态运行时装入:运行时才进行地址转换(现代操作系统)
- 操作系统需要提供内存保护功能,保证各个进程在各自存储空间内运行,互不干扰
- 设置上下限寄存器
- 利用重定位寄存器、界地址寄存器进行判断
1. 内存扩充技术
1.1 覆盖技术
核心思想: 将程序分成多段,常用的段常驻内存,不常用的段需要调用的时候调入内存。
实现方法: 内存中分为一个固干区,和若干个覆盖区。
- 常住内存的段进入固干区,调入后就不调出
- 不常用的段进入覆盖区,需要调用时调入内存,不需要时调出内存
缺点:必须由程序员声明覆盖结构,操作系统完成自动覆盖。已经退出历史的舞台。
1.2 交换技术
交换技术的设计思想:内存紧张时,系统将内存中的某些进程暂时换出至外存,把外存中已经具备运行条件的进程换入内存。(处理机调度——中级调度,进程在内存和磁盘间动态调度,需要使用虚拟内存的技术)
引入交换技术前的进程调度:
引入交换技术后的进程调度:
问题:
- 应该在外存的什么位置保存被换出的进程?
- 什么时候应该交换?
- 应该换出哪些进程?
1. 应该在外存的什么位置保存被换出的进程?
在具有交换功能的操作系统中,通常把磁盘分为文件区和对换区两部分。
- 文件区主要用于存放文件。主要追求存储空间利用率,因此文件区的空间管理采用离散分配的方式。
- 对换区空间只占磁盘的一小部分,被换出的进程数据就放在这里。因为追求的换入换出速度,因此对换区空间管理采用连续分配的方式。
- 因为文件区的空间管理采用离散分配的方式,对换区空间管理采用连续分配的方式,所以交换区的I/O操作更快。
2. 什么时候应该交换?
在很多进程执行,内存比较不够用时可以进行交换。
- 在发现许多进程运行时经常发生缺页,说明内存紧张,此时可以换出一些进程。
- 如果缺页率明显下降,可以暂停换出。
3. 应该换出哪些进程?
这考虑调度的策略,各有优劣
- 可以优先换出阻塞的进程
- 可以换出优先级低的进程
ps:PCB会常驻内存,不会换出外存。
2. 内存空间的分配与回收 —— 连续分配
内存空间的分配主要有两种方式
- 连续分配管理:为进程分配的必须是一个连续的内存空间
- 单一连续分配
- 固定分区分配
- 动态分区分配
- 非连续分配管理:为进程分配的可以是一个离散的内存空间
- 基本分页存储管理
- 基本分段存储管理
- 段页式存储管理
2.1 单一连续分配
2.2 固定分区分配
操作系统需要建立一个数据结构 —— 分区说明表,来实现各个分区的分配与回收。每个表项包括对应分区的大小、起始地址、状态(是否被分配)
优点: 实现简单,无外部碎片
缺点: a. 当用户程序太大时,可能所有分区都不满足要求,此时不得不采用覆盖技术来解决,而这又会降低性能。 b. 会产生内部碎片,内存利用率低。
2.3 动态分区分配
动态分区分配不会预先划分内存区分,而是在进程装入内存时,根据进程的大小动态的建立分区,使分区的大小刚好适合进程的需要。
考虑的问题:
- 采用什么样的数据结构记录内存使用情况?
- 当很多个空闲区满足需求时,应该选择哪个分区进行分配?
1. 采用什么样的数据结构记录内存使用情况?
2. 当很多个空闲区满足需求时,应该选择哪个分区进行分配?
把一个新作业装入内存时,需要按照一定的动态分区分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。我们后面会接触到四种动态分区分配算法:
- 首次适应算法(First Fit)
- 最佳适应算法(Best Fit)
- 最坏适应算法(Worst Fit)
- 邻近适应算法(Next Fit)
3. 内存空间的分配与回收 —— 非连续分配
内存空间的分配主要有两种方式:
- 连续分配管理:为进程分配的必须是一个连续的内存空间
- 单一连续分配
- 固定分区分配
- 动态分区分配
- 非连续分配管理:为进程分配的可以是一个离散的内存空间
- 基本分页存储管理
- 基本分段存储管理
- 段页式存储管理
上面我们学习了连续分配,它存在一些缺点
- 固定分区分配:缺乏灵活性,会产生大量的内部碎片,内存利用率低
- 动态分区分配:会产生很多外部碎片,虽然可以使用“紧凑”技术解决,但是“紧凑”技术的时间代价很高
3.1 分页存储管理
核心思想: 根据固定分区的大小,将进程拆分成不同大小的部分。当固定分区较小时,产生的内部碎片会很小,从而提高了内存的利用率。
考虑问题: 如何实现逻辑地址到物理地址的转换?
先回顾一下,在连续分配内存中逻辑地址到物理地址的转换是通过模块在内存中的起始地址 + 目标单元相对于起始地址的偏移量
来计算得到的。
再考虑在分页技术中,其实和连续分配的方式类似。不同的地方在于,在分页技术中进程被分成多段,不连续的存储在不同的内存中。具体过程如下:
- 计算出逻辑地址对应的页号:
页号 = 逻辑地址 / 页面长度
- 找到该页号在内存中的起始地址:
查页表
- 算出逻辑地址在页面的偏移量:
偏移量 = 逻辑地址 % 页面长度
- 物理地址 = 页面起始地址 + 页面偏移量
逻辑地址结构: 页号 + 页内偏移量
页表: 操作系统为每一个进程建立一个页表,这样就可以根据页号查询对应页号在内存中的起始地址
3.2 分段存储管理
核心思想: 分段类似分页,段表类似页表。不同的是不同的段大小不同,页的大小是相同的。
分段: 按照程序自身划分为若干段,每个段都有段名,每个段从0开始编址。
内存分配规则: 以段为单位分配,每个段在内存中占连续空间,但是各段可以不相邻
逻辑地址结构: 段号 + 段内偏移量
段表: 操作系统为每一个进程建立一个段表,这样就可以根据段号查询对应段号在内存中的起始地址
3.3 段页式存储管理
先来看看分页管理和分段管理的优缺点:
方法 | 优点 | 缺点 |
---|---|---|
分页管理 | 内存利用率高,不会产生外部碎片。当页大小够小时,只会产生一小部分的页内碎片 | 不方便按照逻辑实现信息的共享和保护 |
分段管理 | 方便按照逻辑实现信息的共享和保护 | 段长过大,为其分配过长的连续内存空间不方便。其次,会产生外部碎片 |
段页式管理:结合段式管理和页式管理
4. 虚拟内存
4.1 虚拟内存的基本概念
传统存储管理存在的问题:
上面我们学习了传统的存储管理方式:连续内存分配和非连续内存分配两种方式。
-
一次性:作业必须一次性装入内存才能开始运行。
- 作业很大时,内存不够,导致大作业不能运行
- 大量作业要求运行时,内存无法容纳所有作业,并发度下降
-
驻留性:一旦作业被装入内存,就会一直驻留在内存中,直到作业结束。而实际情况是,一个时间段内只需要访问一小部分数据就可以,驻留会导致内存资源的浪费。
局部性原理:
- 时间局部性:
- 如果执行到了程序中的某条指令,那么不久后这条指令可能会再次执行
- 如果某个数据被访问了,不久后该数据还可能被访问
- 空间局部性:
- 一旦程序访问了某个存储单元,不久后,其附近的存储单元也有可能被访问。(因为很多数据是连续存储的)
高速缓存思想: 将近期频繁访问的数据放到高速缓存器中,暂时用不到的放到低速缓存中。
虚拟内存的定义: 根据局部性原理和高速缓存的思想,我们可以将一些不常用的数据放到外存中。
- 当访问的信息不在内存中时,操作系统负责调入
- 当内存空间不够时,操作系统负责调出 在这种管理模式下,用户看起来有一个比实际内存大很多的内存,这就是虚拟内存。
虚拟内存的特点:
- 多次性:解决了一次性的问题,不需要一次性将作业全部装入内存
- 对换性:作业运行时无需常驻,会根据使用频率来找到何使的存储位置。频率越高的约接近寄存器,反之越接近外村。
- 虚拟性:从逻辑上扩充了内存的容量。
文件管理
文件是一组有意义的信息/数据的结合。
思考问题:
- 文件内部数据如何组织起来?
- 文件之间如何组织起来?
- 从下往上看,os应该提供哪些功能来方便用户使用?
- 从上往下看,文件数据应该如何被存放到外存磁盘上?
文件内部数据如何组织起来?
- 无结构文件:如文本
- 有结构文件:如数据库
文件之间如何组织起来?
类似一个树状的结构,用户可以创建一层一层的目录(文件夹),目录中可以存放各个文件。
从下往上看,os应该提供哪些功能来方便用户使用?
- 创建文件(create 系统调用)
- 读文件(delete 系统调用)
- 写文件(read 系统调用)
- 删除文件(write 系统调用)
- 打开文件(open 系统调用):读写之前需要打开文件
- 关闭文件(close 系统调用):读写完毕后需关闭文件
从上往下看,文件数据应该如何被存放到外存磁盘上?
- 与内存类似,外存也是一个个存储单元组成,每个存储单元对应一个物理地址。
- 外存也会被分成一个个块,每个磁盘块的大小是相同的
1. 文件的逻辑结构
- 无结构文件
- 有结构文件
- 顺序文件
- 索引文件
- 索引顺序文件
1.1 无结构文件
1.2 有结构文件
2. 磁盘
2.1 磁盘的结构
磁盘、磁道、扇区:
盘面、盘柱:
2.2 磁盘调度算法
- 先来先服务算法(FCFS)
- 最短寻找时间优先(SSTF)
- 扫描算法(SCAN)
- 循环扫描算法(C-SCAN)