计算机操作系统面试题总结(4)★★★★

计算机操作系统面试题总结(4)★★★★

内存

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

在多道程序环境下,给内存的存储单元编地址,这样就可以让多个并发执行的程序同时存放到内存中了。

地址长度——>多少个二进制才能表示相应数目的存储单元

进程运行的原理——指令

指令会告诉cpu应该去内存的哪个地址存/取数据

工作原理:操作码+若干参数(包含地址参数)

编译生成的指令一般是使用逻辑地址(相对地址)
相对地址(逻辑地址);绝对地址(物理地址)
PS:如 起始地址(相对的)+一个相隔间隔=绝对地址了

编译:由编译程序将用户源代码编译称若干个目标子模块(即编辑就是把高级语言翻译称机器语言)
链接:由链接程序编译后形成一组目标模块,以及把需要的库函数链接在一起,形成一个完整的装入模块装入(装载),由装入程序将装入模块装入内存运行。

一、装入的三个方式:

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

只适合单道程序环境;

  1. 静态重定位:可重定位装入,编译、链接后的装入模块的地址都是从0开始,指令中使用的地址、数据存放的地址都是相对地址(逻辑),装入模块装入到内存的适当位置时,需要对地址进行“重定位",将逻辑地址变换为物理地址

特点:在一个作业装入时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业,作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

  1. 动态重定位:动态运行时装入,编译、连接后的装入模块的地址都是从0开始,装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才运行,因此装入内存后所有的地址依然是逻辑地址,这种方式需要一个重定位寄存器的支持;

特点:允许程序在内存中发生移动;可以在运行时动态分配存储单元;

二、链接的三个方式:

  1. 静态链接:在程序装入之前,先将各目标模块及他们所需要的库函数链接成一个完整的可执行文件(装入模块),之后不再打开
  2. 装入时动态链接:将各模块装入内存时,边装入边链接的链接方式;
  3. 运行时动态链接:在程序执行中,需要该目标模块时,才对他进行链接,其优点是便于修改和更新,便于实现对目标模块的共享。
(一)、内存管理

内存中有空闲和非空闲区域,则如何管理呢?
很多位置放在哪里呢?
如何对内存进行回收呢?

虚拟技术:把实际上物理上小的内存,从逻辑上扩展成较大的内存。

管理如下方面:

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

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

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

    为了编程人员更方便,程序员写程序时应该只需要关注指令,逻辑地址到物理地址的转换应该由操作系统负责,这样就保证了程序员写程序时不需要关注物理内存的实际情况。

内存保护,让进程只访问自己的地址空间,不去访问别的空间和操作系统的内存空间(就别让他去打扰别人的空间);

方法:

  1. 在cpu中设置一对上、下限寄存器
  2. 重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器),在动态链接时,重定位使用,重定位寄存器存放其实物理地址,界地址寄存器存放最大逻辑地址;相加不越界,即可。

(二)、内存管理空间的概念:分配与回收&空间扩充&地址转换&存储保护

1.覆盖技术

IDM推出的第一台pc机最大只支持1mb大小的内存

技术思想:将程序分为多个段(多个模块),常用的段,常驻内存,不常用的内存放入覆盖区,常用放在固定区

程序的调用结构必须由程序员声明覆盖结构,早已经落伍了。
缺点:对用户不透明,增加了用户编程的附加困难。

2.交换技术

技术思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)

挂起状态:暂时换出外存,等待的进程状态,
又细分为就绪挂起、阻塞挂起

磁盘存储空间分为文件区和对换区
  1. 在具有交换功能的os中,通常把磁盘空间分为文件区和对换区,文件区用于存放文件,主要追求存储空间的利用率,因此堆文件区的空间管理使用离散分配法;对换区空间只占用磁盘的小部分,被换出的进程数据就存放在对换区,不影响系统的整体速度,因此对换区的空间管理主要追求对换入换出的速度,通常采用链接分配的方式。
  2. 综上,对换区的I/O速度比文件区更快!
  3. 在许多进程运行且内存吃紧情况下,就需要进行交换;降低系统负荷。
  4. 优先换出阻塞进程,换到外存中;或者换出优先级低的进程;或者加入考虑在内存的驻留时间
  5. pcb会常驻内存,不会换出外存

——————————————————黄金分割线————————————-

一、连续分配管理方式

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

1.单一连续分配

单一连续分配中,内存被分为 系统区和用户区,只能有一道用户程序。

优点:实现简单,无外部碎片
缺点:只适用于单用户、单任务进程,会产生内部碎片

2.固定分区分配

整个用户空间,划分为固定大小的分区,在每个分区只装入一个作业,这样形成了最早的最简单的可运行多道程序的内存管理方式。

  • 分区大小相同的话,缺乏灵活性,适用于一台计算机控制多个相同对象的场合
  • 分区大小不相同,增加了灵活性,可满足不同的需求

可以根据需要建立一个数据结构——建立一个分区说明表,实现各个分区与回收,每个表对应一个分区,通常按大小排序,每个表项包括对应的分区大小,起始地址和状态(是否已经分配)

优点:实现简单,无外部碎片
缺点:会产生内部碎片,内存利用率低

3.动态分许分配(可变分区分配)

这种分配方式,不会预先划分内存分区,而是在进程装入内存时,跟几乎进程的大小动态的建立分区,并使分区 大小刚好适合进程的需要。因此系统分区的大小和数目是可变的。

问题:

  1. 系统用什么数据结构记录内存使用?
  2. 当多个空闲分区能满足需求时,用谁合理?
  3. 如何进行分区的分配和回收?

常用数据结构——空闲分区表 && 空闲分区链
选择:当把一个新作业放入内存时,须按照一定的动态分区分配算法,从空闲分区表中选出一个分区分配给该作业,分配算法对系统性能有很大的影响。
分配:进行分配后对表或者链进行删除
回收:在空闲分区表中,需要给表的分区大小和起始地址进行新增,并且如果有相邻就进行合并;

注意:各表项的顺序不一定按地址递增排序,具体问题具体分析。

缺点:无内部碎片,但慧禅师外部碎片

内部碎片/外部碎片

内部碎片:分配给某进程的内存区域中,如果有些部分没有用上
外部碎片:是指内存中的某些空闲分区由于太小而难以利用

通过紧凑(拼凑)技术来解决外部碎片。

动态分区分配算法

再分配方式中,当很多个空闲去都满足需求时,应该选择哪个分区进行分配呢?

  • 首次适应算法
  • 最佳适应算法
  • 最坏适应算法
  • 邻近适应算法(循环)
1.首次适应算法

思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区
如何实现:空闲分区以地址递增的次序排列,每次分配内存时,顺序查找空闲分区链(或者空闲分区表),找到大小能满足需要的一个空闲分区

2.最佳适应算法

算法思想:由于动态分区分配是一种连续分配,为各进程分配的空间必须是连续的一整片分区,尽可能流出大空闲区,优先使用小空闲区。
如何实现:空闲分区按容量递增次序链接,每次分配内存时顺序查找空闲分区链,找到满足的一个分区
缺点:每次都选择最小的分区进行分配,会留下越来越多的很小难以利用的碎片。 对分区链进行排序,检查,开销较大。

3.最坏适应算法

算法思想:为了解决最佳适应算法的缺陷而生
如何实现:按照容量递减次序链接,每次按分配内存时顺序查找空闲分区链,找到满足的一个分区
缺点:每次按照最大的分区分配,可能后续来了大进程,就没有大分区分配了

4.邻近适应算法(循环)

算法思想:每次都从链头开始查找,这可能会导致低地址部分出现很多小的空闲分区,如果每次都从上次的查找结束后的位置开始检索,可解决一些问题。
如何实现:空闲分区以地址递增的顺序排列,(可排成一个循环链表),每次分配内存时从上次查找结束的位置开始查找空闲分区链,找到大小能满足的第一个空闲分区;
优点:首次适应算法会漏掉一些小碎片,邻近不会这样
缺点:但邻近,会从首个低地址分区后进行查找,可能隐含了最大适应算法的缺点,大分区用不上。

二、非连续分配管理方式(离散)

比如将一个32mb的进程,划分为10+10+12MB;或者拆的更细小;
显然,如果把分区大小设置的更小一点,内部碎片会更少,利用率会更高。

分页存储管理
  • 将内存空间分为一个大小相等的分区,每个分区就是一个“页框”(页帧、内存块、物理块),每个页框都有i个编号,从0开始;

  • 将用户进程的地址空间也划分为与页框(页帧、内存块、物理块)大小相等的区域,称为页或者页面,每个页面也有一个编号,即页号;
    (注:进程的最后一个页面可能也没有一个页框那么大,因此,页框不能太大,否则产生内部碎片)

  • OS以页框为单位,为各个进程分配内存空间,进程的每个页面分别放入一个页框,也就是说,页面与内存的页框有一个一一对应的关系,各个页面也不需要连续存放,也不需要按先后顺序来,可以放到不相邻的两个页框之中。

一个页的组成,页号和页内偏移量
为了能知道进程的每个页面在内存中的存放位置,操作系统要为每个进程建立一张页表。

  1. 一个进程对应一张页表
  2. 进程的每一页对应一个页表项
  3. 每个页表项由页号和块号组成
  4. 页表记录进程页面和实际存放的内存块之间的对应关系
  5. 每个页表项的长度是相同的,页号是隐含的
  1. 知道逻辑地址对应的页号
  2. 逻辑地址对应的页面偏移量
  3. 逻辑地址对应的页面在内存中真正存在的地方
  4. 页面起始位置和偏移量,得到最后的物理地址
(1)基本分页存储管理

基本地址变换机构:可以借助进程的页表将逻辑地址转化为物理地址

单机页表机制:

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

页表长度是指的这个页表总共由几个页表项,即总共几个页;
页表项的长度是指的页表项占有多大的存储空间;
页面的大小指的是一个页面占多大的存储空间。

  • 快表:最近使用过的页表项会放入快表;快表中存放的时页表的一部分副本——放在更高速的存储器中
  • 页表/蛮表:内存快号——存放在内存中

有的优先查快表;或者更有的同时查询两个表,若快表命中,则停止查找

两级页表机制:

PS:划分时,各级页表的大小不能超过一个页面

  • n级页表,访存次数n+1次
(2)基本分段存储管理

进程的地址空间:按照程序自身的逻辑关系,划分为若干个段,每个段都有一个段名,每个段都是从0开始编址。
内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。

由于是按逻辑功能模块划分,用户编址更方便,程序可读性更高

所以段=段号+段内地址
段号的位数决定了每个段最多可以分多少个段
段内地址位数决定了每个段的最大长度是多少

  • 段是离散的存储在内存中,会建设一个记录逻辑段的段表,记录了逻辑段到实际的逻辑段的位置。
  • 段表=起始地址(基址)+段的长度
  • 各个段表项的长度是相同的
分页VS分段
  • 是信息的物理单位,对用户是不可见的,页大小固定,进程的地址空间是一维。
  • 时信息的逻辑单位,对用户是可见的,段的长度决定于用户的编写程序,进程的地址空间是二维。
  • 分段比分页更容易实现信息的共享和保护。
  • 单机页表访问需要两次访存,第一次内存页表,第二次内存单元
  • 分段也是两次访存,第一次内存中段表,第二次时目标内存单元,当然也可以使用快表机制,将近期的访问段表项放入快表中,可以少一次访问。
(3)段页式管理方式
  • 段号决定每个进程最多可以分成几个段
  • 页号决定每个段最大多少页
  • 页内偏移量决定页面的大小、内存块大小是多少

段表寄存器——逻辑地址——段号合法——查询段表——检查页号合法——读出页号——找出页表项——内存块号+逻辑地址中的业内偏移量叠加——访问目标内存单元

  • 总共需要访问三次,才可以访问目标内存单元
  • 着重注意页内是否越界

虚拟内存的基本概念

对比传统的存储管理——王道2019ppt

高速缓冲技术的思想:将近期会频繁访问到的数据放到更高速的存储器中,暂时用不到的数据放在更低速的存储器中。

寄存器(容量小,速度快,成本高)——高速缓存——内存——外存 (容量大,速度慢,成本低)

OS的虚拟性:内存的实际物理容量是没有变的,只是逻辑上进行了扩充。
虚拟内存的最大容量是由cpu寻址范围确定,即计算机的地址结构决定

特征:

  • 多次性 (解决一次性)
  • 对换性 (解决驻留性)
  • 虚拟性 (建立在离散分配的存储管理之上)

虚拟内存——王道19PPT

请求分页存储管理

页表的四个字段

  1. 状态位:是否已经放入内存
  2. 访问字段:访问几次了
  3. 修改位 :是否更新
  4. 外存地址 :在外存存放的地址

缺页中断机制:

页面不存在——产生缺页中断——OS的缺页中断处理程序 去处理中断——缺页的进程遭到阻塞——放入阻塞队列——调页完成后——唤醒

  • 空闲块——为进程分配一个空闲块
  • 无空闲块——由页面阻塞置换算法选择一个页面淘汰——该页面在此期间修改过——将其写回外存——未修改不需要写回外存

请求分页管理方式 与基本分页管理方式 需要注意以下:

  • 缺页中断属于内中断
  • 需要判断是否在内存
  • 若不在内存,需要进行页面置换工作,腾出页面,换入内存
  • 页面访问或调出,对页表项要进行修改

产生缺页中断,会进行保护CPU现场
换入换出操作需要I/O操作,会有较大开销
调入页面激怒内存后,需要修改慢表,同时也需要将表项复制到快表中

页面置换算法

选择哪个页面进行换入换出???

四种算法,如下:

1. 最佳置换算法 (OPT) 仅理想化的算法,无法实现

每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,保证最低小的缺页率。
OPT

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

每次选择淘汰的页面是最早进入内存的页面。
缺陷:会产生Belady现象

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

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

每次淘汰的页面是最久未使用的页面

用访问字段记录该页面自上一次被访问以来所尽力的时间T

手动求解时,从后往前数,看表中最近最久未被使用
实现:实现困难,开销大

4. 时钟置换算法(CLOCK) 又叫做:最近未用算法(NRU)

(1)简单clock算法

为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接或者一个循环队列
最多会经过两轮扫描,第一轮,由0->1,置1操作,访问后,置0;

(2)改进型的时钟置换算法
在其他条件相同下,优先淘汰没有修改过的页面,避免I/O操作

(访问位,修改位)来标识
只有被淘汰的页面或修改过时,才需要写入外存

四轮访问淘汰:
1.最近没访问且没修改
2.最近没访问但修改
3.最近访问但没修改
4.最近访问且修改

页面分配、置换策略

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

分配策略:

  1. 固定分配:驻留集大小不变
  2. 可变分配

置换策略:

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

因为固定分配全局置换这种策略不存在,所以组合一下存在三种策略

  1. 固定分配局部置换
  2. 可变分配全局置换:无空闲时,选择一个未锁定的页面换出外存
  3. 可变分配局部置换:缺页时,只允许从该进程自己的物理块中选出一个换出外存

什么时候调入页面?

  • 预调页面策略:在运行前,主要用于进程的首次调入,由程序员指出应该先调入哪些部分,
  • 请求雕也策略:在运行期间,缺页时才将所缺的页面嗲偶内存

从何处调入页面?

  • 对换区空间足够大,运行前,从文件区复制到对换区
  • 缺少对换区,凡是不会被修改的数据直接从文件区调入,被修改部分进入对换区
抖动(颠簸现象)

定义:刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动。

主要是分配的进程物理块不够,才会产生抖动。

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值