本文是对王道计算机408操作系统+王道2025操作系统考研复习指导部分的提炼总结,个人心得,包含视频内容和课后习题的提炼.
本人是26届408考生,本文属于考研复习的笔记,会持续更新~
建议搭配视频和指导书食用~ ~ 视频课请看王道计算机考研408操作系统
本文是操作系统第三章 第一节内容
总目录2026考研408 操作系统
第一节: 内存管理概念
3.1 内存管理概念
3.1.1 内存管理的基本原理和要求
- 内存管理的概念
- 内存可以存放数据,程序执行前需要先放入内存中才能被
CPU
处理 - 在多道程序环境下如何管理多个程序的数据。内存用于临时存储数据和程序,以便CPU能够快速处理。
- 在多道程序环境下,多个程序需要同时在内存中运行,这就涉及到如何区分和管理这些程序的数据。
- 内存的存储单元地址
- 内存从0开始,每一个地址对应一个存储单元
- 如果计算机按字节编址,那么每个存储单元的地址就是一个字节,即
1B
,8个二进制位
- 如果是按字编址,那么每个存储单元的地址就是一个字,存储单元大小得看字长为多少的计算机
- 如果是一个字长为
16位
的计算机,那么一个存储单元就是16位
,即2B
- 如果是一个字长为
- 补充知识
- 计算机的单位换算
- 位(
Bit
):最小的数据单位,表示一个二进制数位,可以是0
或1
。 - 字节(
Byte
):基本的存储单位,通常用于表示一个字符。- 1 Byte = 8 Bits
- 1 KB = 2^10 Bytes
- 1 MB = 1,024 KB = 2^20 Bytes
- 1 GB = 1,024 MB = 2^30 Bytes
- 位(
- 计算机的单位换算
- 内存可以存放数据,程序执行前需要先放入内存中才能被
- 内存管理的主要功能
- 内存空间的分配和回收
- 为正在运行的程序分配内存空间。这包括为程序代码、数据和堆栈分配内存。
- 当程序结束或不再需要某些内存时,操作系统负责回收这些内存,以便它们可以被其他程序使用。
- 地址转换
- 内存管理单元(
MMU
)负责将逻辑地址转换为物理地址。逻辑地址是程序生成的地址,物理地址是内存中的实际地址。
- 内存管理单元(
- 内存空间的扩充
- 利用虚拟存储技术,操作系统可以将磁盘空间用作内存扩展,以便在内存不足时继续运行程序。
- 内存共享
- 允许多个程序共享内存中的数据,以便它们可以相互通信。
- 存储保护
- 保证各个进程之间的内存空间不会相互干扰,以及保护操作系统的内存空间不受用户程序的影响。
- 内存保护的两种方法
- 在
CPU
中设置上,下限寄存器,进程如果要访问地址要先检查是否越界 - 采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器),重定位寄存器存放进程起始地址,界地址寄存器存放进程最大逻辑地址
- 在
- 内存空间的分配和回收
程序的链接与装入
- 创建进程首先要将程序和数据装入内存,将用户源程序变为可用在内存中执行的程序,需要以下步骤
- 编译
- 由编译程序将用户源程序编译成若干目标模块
- 链接
- 由链接程序将若干目标模块以及他们所需的库函数链接在一起,成一个完整的装入模块
- 装入
- 由装入程序将装入模块装入内存,并为其分配内存空间
- 编译
- 当一个装入模块装入内存时,有三种装入方式
- 绝对装入
- 在绝对装入方式中,程序在编译时就确定了其在内存中的绝对位置,编译器会生成包含绝对地址的目标代码。
- 装入程序按照这些绝对地址将程序和数据装入内存。
- 特点
- 它适用于单道程序环境,灵活性很低
- 可重定位装入(静态重定位)
- 它允许程序在编译时使用相对地址,而在装入内存时根据内存的当前情况,将程序装入到内存的适当位置。
- 通常起始地址从0开始。当程序被装入内存时,所有逻辑地址都需要根据程序在内存中的实际起始地址进行调整,这个过程称为重定位。重定位确保了程序中的指令和数据引用在内存中的正确位置。
- 特点
- 适用于多道程序环境,灵活性高
- 作业装入内存时,必须分配其所需的全部内存空间,如果没有足够内存就不装入
- 作业一旦进入内存后,在运行期间不能移动,也不能再申请空间
- 动态运行时装入(动态重定位)
- 动态重定位是一种在程序执行过程中进行地址重定位的技术
- 它允许程序在装入内存时不进行任何修改(不把逻辑地址转为实际地址)
- 而是在程序要真正执行的时候,通过硬件支持的地址变换动态地将相对地址转换为绝对地址。
- 这种技术需要硬件的支持,如重定位寄存器,来实现地址的动态转换。
- 特点
- 可以将程序分配到不连续的存储区内
- 在程序允许前只需要装入他的部分代码即可投入允许
- 在允许期间根据需要动态申请分配内存
- 便于程序段的共享,可以向用户提供一个比存储空间大的多的地址空间
- 绝对装入
- 链接的三种方式
- 静态链接
- 在程序运行之前,将各个模块以及库函数链接在一起,形成一个完整的装入模块,之后不再拆开
- 装入时动态链接
- 在装入内存的时候,边装入边链接,形成一个完整的装入模块
- 运行时动态链接
- 在程序运行的时候,只有需要用到该模块的时候才链接,优点是便于修改和更新,便于实现目标模块的共享
- 静态链接
内存空间的扩充
- 覆盖技术
- 早期计算机内存很小,引入覆盖技术来解决程序大小超过内存大小的问题
- 核心思想:将程序分为多个段(多个模块),常用的段(模块)常驻内存使用,不常用的段(模块)在需要的时候再装入内存
- 内存分为一个固定区和一个覆盖区,固定区存放常驻内存的段,并且调入之后不再调出(除非运行结束),覆盖区存放不常驻内存的段
- 缺点
- 必须由程序员来声明覆盖结构,对用户不透明,增加变成负担
- 交换技术
- 在内存紧缺的时候,系统将内存中某些进程暂时换出到外存上,把外存具备运行条件的进程换入内存
- 将进程调出到外存中,其PCB保留在内存的挂起队列中,中级调度
- 在具有对换功能的操作系统中,通常把磁盘分为文件区和对换区
- 文件区用来存放文件,为了追求存储空间的利用率,文件的存放是离散存储的
- 而对换区只占磁盘存储空间很小一部分,被内存调出的进程数据就存放在对换区,为了追求对换的速度,对换区采用连续存储方式
- 交换技术一般可换出阻塞进程,可换出优先级低的进程,为了方式优先级低的进程刚调入内存就被换出,有的操作系统会考虑进程在内存驻留时间
3.1.2 连续分配管理方式
连续分配分类
- 单一连续分配
- 内存被分为系统区和用户区,系统区一般位于内存低地址,用户区位于内存高地址
- 在同一时刻只能有一个用户程序在内存中运行
- 优点
- 简单,无外部碎片
- 不一定需要采取内存保护
- 缺点
- 只能用于单用户单任务的操作系统,并且会产生内部碎片,储存器利用率低
- 内部碎片:分配给进程的内存空间大于进程所需的内存空间,多余空间浪费
- 只能用于单用户单任务的操作系统,并且会产生内部碎片,储存器利用率低
- 固定分区分配
- 为了能在用户空间中装入多道程序,将用户空间分为若干个固定大小的区域,每个区域只能装入一个程序
- 分区大小相等特点
- 缺乏灵活性,但是适用于一台计算机控制多个相同对象的场景
- 操作系统需要建立一个数据结构–分区说明表,来实现各个分区的分配和回收,每一个表项对应一个分区,通常按照分区大小排列,每个表项包括对应分区的大小,起始地址,分配情况等信息
- 优点
- 无外部碎片
- 缺点
- 当程序太大,会采用覆盖技术,降低性能
- 会产生内部碎片,利用率低
- 动态分区分配(可变分区分配)
- 不会预先划分区域,而是在进程装入内存的时候根据进程的大小动态的建立分区,并且每个分区的大小会正好适合进程的需要
- 两种常用数据结构
- 空闲分区表
- 空闲分区链
- 新作业调入内存会采用动态分区分配算法进行分配
- 内部碎片:分配给某进程的内存空间中如果有部分没用上
- 外部碎片:是指内存当中某些空闲分区由于太小而难以利用
- 可以采用紧凑技术来解决外部碎片
动态分区分配算法
- 首次适应算法
- 思想
- 从低地址开始查找,找到第一个能满足进程需要的分区就分配
- 如何实现
- 空闲分区表以地址递增的次序排列,找到第一个大小满足要求的分区就分配
- 思想
- 最佳适应算法
- 思想
- 从所有空闲分区中找到一个最小的能满足进程需要的分区
- 如何实现
- 空闲分区表以容量递增的次序排列,找到第一个大小满足要求的分区就分配
- 缺点
- 每次都选最小的分区,会产生很多小的外部碎片
- 思想
- 最坏适应算法
- 思想
- 从所有空闲分区中找到一个最大的能满足进程需要的分区
- 如何实现
- 空闲分区表以容量递减的次序排列,找到第一个大小满足要求的分区就分配
- 缺点
- 导致较大的连续空间被较快用完,如果之后有大进程到达将无法分配
- 思想
- 邻近适应算法
- 思想
- 从上次分配的位置开始查找,找到第一个能满足进程需要的分区就分配
- 如何实现
- 空闲分区表以地址递增的次序排列(可排成一个循环链表),每次从上次查找结束的位置开始查找,找到能满足要求的第一个分区就分配
- 缺点
- 和最坏适应算法一样,会导致较大的连续空间被较快用完
- 优点
- 和最佳适应算法一样,更有可能把高地址部分的大分区留给大进程
- 思想
3.1.3 基本分页存储管理
分页存储的基本概念
- 将内存空间分为一个个大小相等的分区,每一个分区就是一个页框(页框=页帧=物理块=内存块=物理页面),每一个页框有一个编号,称为页号从零开始
- 将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个页或者页面,每一个页面有一个页面号从零开始
- 操作系统以页框为单位为各个进程分配内存空间,进程的每个页面都一一对应的放入内存中的一个页框中
- 操作系统如何记住一一对应关系? 通过页表
- 操作系统会为每一个进程建立一个页表,这个页表一般存放在PCB中
- 进程的每个页面对应一个页表项
- 每个页表项由两部分组成,一部分是页号,一部分是页框号(块号)
- 页表记录的是页面和实际存放的内存块之间的映射关系
- 重要考点:
- 计算机中内存块数量->页表项中页框号至少占多少字节
- 页号不占存储空间类比数组,我们只需要知道页框号的占用大小就可以算出页号为i的存放地址
(X+3*i)
- 如果页表有n页,由于每个页表项占3B存储整个页表至少需要
3(n+1)B
- 注意,页表中记录的是块号不是地址,如果要在内存中的地址还需要计算(块号*块大小)
- 计算
- 页号=逻辑地址/页大小(取整数部分)
- 页内偏移量=逻辑地址%页大小
- 通过页号查询页表知道页框号,通过页框号算出内存中起始地址,实际的物理地址=页面在内存中的起始地址+页内偏移量
- 在计算机内部,地址是用二进制表示的,如果页面大小刚好是2的整数幂,则计算机硬件会很快的把逻辑地址拆分成页号页内偏移量
-
结论:如果每个页面是2的k次幂,用二进制数表示逻辑地址,则末尾k位是页内偏移量,剩下的是页号
-
如果有
k
位表示页内偏移量,则说明系统一个页面大小为2^k
-
如果有
m
位表示页号,则说明系统最多有2^m
个页面
-
如果有些奇葩题中页面大小不是2的整数次幂,那么就需要自己计算了
-
基本地址变换机构PTR
- 基本地址机构可以借助进程的页表将逻辑地址转化为物理地址
- 通常会在系统设置一个页表寄存器(
PTR
),存放页表在内存中的起始地址F
和页表长度M
- 执行未进行的时候,页表的起始地址和页表长度存放在
PCB
中 - 当进程被调度的时候,操作系统内核会把他们放到页表寄存器当中
- 执行未进行的时候,页表的起始地址和页表长度存放在
- 从逻辑地址转化到物理地址的变换过程:
- 操作系统把内存分为系统区和用户区,进程控制块
PCB
也是存放在系统区当中 - 如果一个进程需要被调度上处理机运行的话,负责进程切换的相关内核程序将负责进程运行环境的恢复
- 在
PCB
当中的页表的起始地址和页表长度会被加载到页表寄存器当中 - 页表寄存器存放进程页表的起始地址
F
和页表长度M
,程序计数器PC
存放这个进程下一条指令执行的逻辑地址A
- 接下来操作系统如何将逻辑地址
A
转化成物理地址 - 在采用分页存储管理方式的操作系统当中,逻辑地址结构是固定不变的,高位是页号,低位是页内偏移量
- 接下来会对页号
P
的合法性进行检查,在页表寄存器当中的页表长度M
表示这个进程总共有M
页(M
个页表项)- 如果页号
P
大于等于M
,则说明这个页号是非法的,会产生一个越界中断(内中断,异常) - 如果页号
P
小于M
,则说明这个页号是合法的,会根据页号P
在页表中查找对应的页表项,最终得到物理地址E
- 如果页号
- 页式管理中地址是一维的,要让操作系统帮我们找到物理地址只需提供逻辑地址就行
- 在操作系统得到一个逻辑地址
A
到实际访问到物理地址A'
的过程中总共需要两次访问内存的操作- 第一次访问内存是在查询页表的时候
- 第二次是在实际访问目标内存单元进行的
- 操作系统把内存分为系统区和用户区,进程控制块
具有快表的地址变换机构
-
是基本地址变换机构的改进版本
-
快表(联想寄存器
TLB
),是一种访问速度比内存快很多的高速缓存(TLB
并不是内存),用来存放最近访问过的页表项的副本,可以加快地址变换的速度 -
与此对应内存中的页表常称为慢表
-
访问速度金字塔
CPU
中- 寄存器
- 高速缓存(
Cache
)
- 内存(
RAM
) - 外存(硬盘)
-
快表是一个专门的硬件,当进程切换的时候,快表的内容也需要被清除
-
具有快表的地址变换过程
- 当
CPU
要访问一个逻辑地址时,首先会和页表寄存器中页表长度M
进行比较,判断是否越界 - 判断没有越界之后,操作系统会在快表中查找
- 如果在快表中没有找到对应的页表项,则说明这个逻辑地址没有被访问过,需要根据页表寄存器的页表始值和逻辑地址访问内存中的页表,并同时将其复制一份存入快表
- 这样存取数据需要两次访存
- 如果快表已满,则需要按照特定算法淘汰一个旧页表项
- 如果在快表中找到了对应的页表项,则说明这个逻辑地址已经被访问过,可以直接得到物理地址
- 这样存取数据仅一次访存
- 如果在快表中没有找到对应的页表项,则说明这个逻辑地址没有被访问过,需要根据页表寄存器的页表始值和逻辑地址访问内存中的页表,并同时将其复制一份存入快表
- 当
-
快表中存放的是页表的一部分副本
-
一般快表的命中率高达
90%
以上,快表的有效性基于局部性原理
-
局部性原理
- 它描述了程序访问内存时的一种倾向性,即在一段时间内,程序倾向于访问最近访问过的数据。局部性原理通常分为两种类型:
- 时间局部性:如果一个数据项被访问,那么在不久的将来它很可能再次被访问。这通常发生在循环和递归中,其中相同的数据会被多次访问。
- 空间局部性:如果一个数据项被访问,那么在不久的将来,其附近的数据项也很可能被访问。这通常发生在数组和数据结构的遍历中,其中连续的数据项会被顺序访问。
- 它描述了程序访问内存时的一种倾向性,即在一段时间内,程序倾向于访问最近访问过的数据。局部性原理通常分为两种类型:
两级页表
-
单级页表的缺点
- 光一个页表就需要
1024
个连续的页框用来存放 - 根据局部性原理,一个进程只会访问其中的一部分页表项,大部分页表项都是空闲的,因此没有必要让所有页表项都在内存中
- 可以在需要访问页面时才把页面调入内存(虚拟存储技术)
- 可以在根目录页表项增加一个标志位,用来标记是否在内存中
- 如果想访问的页面不存在内存中,则产生缺页中断(内中断),将目标页面调入内存
- 光一个页表就需要
多级页表
- 设计目的
- 减少页表占用的物理内存
- 特点
- 在采用多级页表的情况下,页目录表(外表页表,顶级页表)确实需要驻留在内存中,因为它包含了指向其他层级页表的指针
- 但是,并不是所有的次级页表都需要常驻内存中。实际上,只有那些对应于活跃页面的次级页表才会被加载到内存中。
- 只有当一个特定的虚拟页面被使用时,对应的次级页表才会被加载到内存中
- 如果某些虚拟页面从未被访问过,那么它们对应的次级页表条目就不会存在于内存中,从而节省了内存空间
- 操作系统会根据需要动态地加载和卸载次级页表。
- 当一个进程首次尝试访问一个尚未映射的虚拟页面时,会触发一个缺页中断
- 此时操作系统会分配物理内存并更新相应的页表项
- 如果采用多级页表机制,则各级页表大小不能超过一个页面
- "各级页表大小不能超过一个页面"时,并不是指整个页表结构的大小,而是指每一级页表中的单个页表项集合(即一个页表)
- 每个页表的大小应该控制在一个页面的大小之内,通常是
4KB
(具体大小取决于系统的页面大小设置) - 页表应该尽可能小,以便可以一次性加载到高速缓存(
TLB
)中。
- 采用多级页表的访存次数也会增多每多访问一级页表就会增加一次访存
- 但由于减少了不必要的页表条目在内存中的存储,从而提高了内存的使用效率,并且通过使用
TLB
转址后备缓冲器)等硬件技术,可以有效缓解地址翻译带来的性能影响。 - 在没有快表机制情况,
n
级页表的访存次数为n+1
3.1.4 基本分段存储管理方式
-
与"分页"最大的区别就是–离散分配时所分配地址空间的基本单位不同
-
按照进程程序自身的逻辑划分成若干段,每个段都有一个段名,每个段都是从0开始编址的
-
操作系统以
段
为单位分配内存,每个段在内存中占据连续空间,但是段与段之间不一定连续 -
用户编程更方便,程序的可读性更高
-
逻辑地址结构
-
段号的位数决定了系统最多能够支持多少个段
-
段内偏移量的位数决定了每个段最大能够存放多少个字节
-
每一个进程会建立一个段表
-
每一个对应一个段表项,其中记录了该段的起始位置(基址) 和段的长度
-
各个段表想的长度是相同的
-
逻辑地址转化成物理地址过程
-
当一个进程要上处理机运行之前,进程切换相关内核程序负责恢复进程的运行环境,通过
段表寄存器
- 段表寄存器存放着段表的起始地址和段表的长度
- 在进程没有上处理机运行的时候是存放在系统区的
PCB
中
-
系统根据逻辑地址得到段号和段内地址
-
得到的段号要和段表寄存器中的段表长度进行比较,判断是否越界
- 如果段号大于等于段表长度,则说明这个段号是非法的,会产生一个越界中断
- 如果段号小于段表长度,则说明这个段号是合法的,会根据段号在段表中查找对应的段表项
-
检查段内地址是否超过段长,如果超过执行越界中断否则就执行
-
最终段基址
b
+段内地址w
就可以的到物理地址
-
-
分页分段对比
- 页是信息的物理单位,分页的主要目的就是离散分配,提高内存的利用率,完全是系统行为,对用户不可见
- 段是信息的逻辑单位,分段的目的是更好的满足用户要求,一个段通常包含着一组属于一个逻辑模块的信息,分段对用户是可见的
- 页的大小固定且由系统决定,段的长度不固定,由用户编写的程序决定
- 分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址
- 分段的用户进程地址空间是二维的,程序员在标识一个记忆符时,既要给出段名也要给出段内地址
- 分段相对于分页最大的优点是更容易实现信息的共享和保护
- 不能被修改的代码称之为纯代码或者可重入代码(不属于临界资源)
- 与页表类似,分段也可以引入快表系统,将最近访问的段表项存放在快表中,以提高地址变换的速度,减少访存次数
3.1.5 段页式存储管理
-
段号的位数决定了最多有几个段号,也就是每个进程最多可以分成几个段
-
页号位数决定了有多少页号,也就是每个段最多有多少页
-
页内偏移量的位数决定了页面大小,内存块大小
-
分段对用户来说是可见的,程序员编程的时候需要显式的给出段号,段内地址
-
而将各个段分页对用户是不可见的,系统会根据段内地址自动划分页号和页内偏移量
-
因此段页式管理的地址结构式二维的
-
先根据逻辑地址得到段号和段内地址,然后根据段表找到该段的页表,再根据页表找到对应的页号和页内地址,最后根据页号和页内地址得到物理地址
-
一个进程对应一个段表,一个段表对应一个页表,所以一个进程可能会对应多个页表
-
逻辑地址转换成物理地址的具体过程
- 当一个进程要上处理机运行之前,进程切换相关内核程序负责恢复进程的运行环境,通过
段表寄存器
- 段表寄存器存放着段表的起始地址和段表的长度
- 在进程没有上处理机运行的时候是存放在系统区的
PCB
中
- 系统根据逻辑地址得到段号和页号和页内偏移量
- 得到的段号要和段表寄存器中的段表长度进行比较,判断是否越界
- 如果段号大于等于段表长度,则说明这个段号是非法的,会产生一个越界中断
- 如果段号小于段表长度,则说明这个段号是合法的,会根据段号在段表中查找对应的段表项
- 找到段表项之后需要对页号的合法性进行检查,若页号大于等于页号长度则发生越界中断,否则继续
- 根据页表存放的块号找到页表,再根据页号查询页表找到目标块号
- 根据目标块号和页内偏移量得到最终物理地址
- 当一个进程要上处理机运行之前,进程切换相关内核程序负责恢复进程的运行环境,通过
-
整个过程需要三次访存
- 第一次访问内存是在查询段表的时候
- 第二次访问内存是在查询页表的时候
- 第三次访问内存是在实际访问目标内存单元进行的
-
如果引入快表机制,用段号和页号作为快表的索引,若快表命中则仅需一次访存
3.1 习题提炼
- 在虚拟内存系统中,只要磁盘内存无限大,作业就能拥有任意大的编址空间,这是
错误
的- 编址空间的大小取决于硬件的访存能力 ,一般由地址总线宽度决定
- 内存保护需要操作系统和硬件机构合作完成
- 内存保护是内存管理的一部分,是操作系统的任务,但是处于安全性和效率的考虑,必须由硬件实现比如
CPU
中的上下限寄存器- 重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)
- 内存保护是内存管理的一部分,是操作系统的任务,但是处于安全性和效率的考虑,必须由硬件实现比如
- 加载重定位寄存器和界地址寄存器必须使用特权指令,只有操作系统内核才可以加载这两个寄存器,这种方案允许操作系统内核修改这两个寄存器的值,而不允许用户程序修改
- 硬件地址变换机构一般用于动态重定位的情况
- 静态重定位
- 在程序运行之前,内存地址就已经确定,并且在整个程序执行过程中不会改变
- 当一个作业装入内存时,必须给他分配要求的全部内存空间,若没有足够内存空间,则无法装入,作业一旦装入,整个运行期间就不能在内存中移动,也不能再申请空间
- 这种重定位通常与静态分区分配相关,其中内存被划分为固定大小的区域,每个程序在编译或链接时就被分配了固定的内存区域。
- 所以单一连续分配和固定分区分配采用的时静态重定位,就不需要硬件地址变换机构,只需要装入程序和操作系统即可完成地址转换
- 而页式存储管理,动态分区分配,页式虚拟存储管理,分段存储管理需要硬件地址变换
- 静态重定位
- 动态重定位允许程序在内存中移动,系统只有一个重定位寄存器
- 动态重定位的过程依赖于
- 可重定位装入程序
- 重定位寄存器
- 硬件地址变换机构
- 在可变分区管理(动态分区分配)中采用拼接技术的目的是对空闲区进行合并
- 页表是操作系统在程序装入的时候建立的
- 在段式存储管理中,若有些段可被多个进程共享,则可用一个单独的共享段表来描述这些段
- 而不需要在每个进程的段表中都保存一份
- 共享段表的作用是实现多个进程共享同一段代码或数据
- 这样做即能节省内存空间,又便于对共享段的更新和维护
- 多个进程共享同一段物理内存空间不需要用到共享段表,只需要在各自的段表中指向相同的物理地址即可
- 多个进程共享同一段逻辑地址是不可能的,因为每个进程的逻辑地址空间都是相互独立的
- 段式存储管理中,并不要求各个进程中相同功能的段必须有相同的段号
- 系统提供给用户的物理地址空间大小为总空间大小减去页表或者段表的长度,由于页表和段表都不能确定,所以用户的物理地址空间大小也不能确定
- 分页管理是硬件和操作系统层面实现的对用户,编译系统,装配系统等上层是不可见的
- 在页式存储管理中,
CPU
将逻辑地址分解成页号和页内偏移量,然后通过硬件中页表寄存器和内存管理单元(MMU
)将页号转化为物理地址,再拼上页内偏移量,得到最终物理地址,这一过程由硬件自动完成不需要操作系统或者其他软件干预 - 程序的动态链接与程序的逻辑结构相关,分段存储管理将程序按照逻辑段进行划分因此有利于其动态链接
- 当编程人员编好的程序经过编译转化成目标文件后,各条指令的地址编号起始地址一般定为
0
称为逻辑地址 - 页面大,用于管理页面的页表就小.但是页内碎片就会变大
- 页面小,用于管理页面的页表就会变大,但是页内碎片小
- 页面一旦确定就不变(一般取2的幂次方)
- 引入段式存储方式主要是为了满足用户的下列要求
- 方便编程
- 分段共享
- 分段保护
- 动态链接和动态增长
- 对主存的访问是以字节或者字为单位进行的,对主存的分配随存储器的管理方案不同而异
- 如果
OS
采用分页存储方式每一个进程都会有一个页表,其进程的页表会驻留在内存中- 系统中设置一个==页表寄存器(
PTR
)==他存放内存中的页表始值和长度 - 进程未执行时,页表始值和页表长度均放在本进程的
PCB
中,而PCB
常驻在系统分区中 - 当调度到该进程的时候,才将
PCB
中的页表始值和页表长度放入页表寄存器中
- 系统中设置一个==页表寄存器(
- 分段方式对低级语言程序员和编译器来说是可见的(不是透明的)
- 页是信息的物理单位,分页的主要目的就是离散分配,提高内存的利用率,完全是系统行为,对用户不可见(透明)
- 段是信息的逻辑单位,分段的目的是更好的满足用户要求,一个段通常包含着一组属于一个逻辑模块的信息,分段对用户是可见的(不透明)
- 分段存储方式按程序实际的段来分配主存,所以分配后的存储块是可变长的
- 用分段的方法管理用户地址空间,用分页的方法管理物理存储空间
- 逻辑地址空间指的是用户地址空间也称为虚拟地址空间
- 逻辑地址空间是操作系统为每个进程提供的抽象的内存空间
- 它允许程序使用一组连续的地址来访问内存,而不需要关心这些地址如何映射到物理内存上
- 在逻辑地址空间中,每个进程都认为自己拥有整个内存空间
- 而实际上,操作系统通过内存管理单元(MMU)和页表将这些逻辑地址映射到物理内存地址。
- 这种映射是动态的,可以根据需要进行调整
- 例如,当进程需要更多的内存时,操作系统可以为其分配更多的物理内存
- 或者在内存不足时,将某些不常用的数据从物理内存中移除,存储到磁盘上。
- 分页式存储管理有内部碎片,分段式存储管理有外部碎片
- 只要是固定的分配就会产生内部碎片,其余的都会产生外部碎片
- 若固定和不固定同时存在(段页式)视为固定
- 分页虚拟存储管理,每页的长度都一样(固定),会产生内部碎片
- 分段虚拟存储管理,每段的长度都不一样(不固定),会产生外部碎片
- 若对经典的页式存储管理方式的页表做出稍稍的改造,允许不同页表的页表项指向同一个页帧,则会
- 这将允许多个进程共享同一块物理内存区域
- 如果多个进程需要相同的数据(可重入的),它们可以共享同一块物理内存,而不是每个进程都复制一份。这可以减少内存的使用,提高内存的利用率
- 只需修改页表项就能实现内存"复制"效果
- 当多个进程需要通信的时候,可用采用共享内存的方式,它们是通过让各个进程页表的页表项指向相同的页帧实现的
- 编译后的程序需要经过链接才能转载,而链接后形成的目标程序中的地址也就是逻辑地址