操作系统 -- 内存与内存管理

内存

定义:
内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。
逻辑地址与物理地址:
编译时产生的指令只关心“相对地址”(逻辑地址),实际放入内存中再想办法根据起始位置得到“绝对地址”(物理地址)。
进程运行的基本原理:

  • 编译:由编译程序将用户源码编译成若干个目标模块,就是把高级语言翻译成机器语言。
  • 链接:由链接程序将编译后形成的一组目标模块,以及需要的库函数链接在一起,形成一个完整的装入模块。
  • 装入:由装入程序将装入模块装入内存中运行。
  • 在这里插入图片描述

链接方式
1:静态链接
在程序运行前,先将各目标模块以及他们所需要的库函数链接成一个完整的可执行文件(装入模块)之后不在拆开。
2:装入时动态链接
将各目标模块装入内存时,边装入边链接的链接方式。
3:运行时动态链接
在程序执行中需要该目标模块时。才对它进行链接,其优点是便于修改和更新,便于实现对目标模块的共享。
装入方式(逻辑地址到物理地址的转换)
1:绝对装入
在编译时,如果知道程序将放到内存中的那个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
2:静态重定位
编译,链接后的装入模块地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行重定位,将逻辑地址变换为物理地址。(地址变换是在装入时一次完成的)。
作业在装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能在申请内存空间。
3:动态重定位
编译,链接后的装入模块地址都是从0开始的,装入程序吧装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟待程序真正执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
采用动态重定位时,允许程序在内存中发生移动。并且可以将程序分配到不连续的存储区;在程序运行前只需要装入他的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大的多的地址空间。

内存管理

一:内存空间的分配和回收
连续分配:指为用户进程分配的必须是一个连续的内存空间。
1:单一连续分配
内存被分为系统区和用户区,系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户空间。
在这里插入图片描述

无外部碎片,有内部碎片

2:固定分区分配
为了能够在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的,最简单的一种可运行多道程序的内存管理方式。
在这里插入图片描述

无外部碎片,有内部碎片

3:动态分区分配
不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。
无内部碎片,有外部碎片

动态分区分配算法:在动态分区分配中,当很多个空闲分区都能满足需求时,应该选择那个分区进行分配。

算法算法思想分区排列顺序优点缺点
首次适应算法从头到尾找合适的分区空闲分区以地址递增次序排列综合看性能最好,算法开销小,回收分区后一般不需要对空闲队列重新排序
最佳适应算法优先使用更小的分区,以保留更多大分区空闲分区以容量递增次序排列会有更多的大分区被保留下来,更能满足大进程的需要会产生很多太小的,难以利用的碎片。算法开销大,回收分区后可能需要对空闲分区队列重新排序
最坏适应算法优先使用更大的分区,以防止产生太小的不可用的碎片空闲分区以容量递减次序排列可以减少难以利用的小碎片大分区容易被用完,不利用大进程,算法开销大。
临近适应算法由首次适应演变而来的,每次从上次查找结束位置开始查找空闲分区以地址递增次序排列(可排列成循环链表)不用每次都从低地址的小分区开始检索,算法开销小

非连续分配:指为用户进程分配的可以是一些分散的内存空间
1:基本分页存储管理
把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分。
在这里插入图片描述

将内存空间分为一个个大小相同的分区,每个分区就是一个页框,或称页帧、内存块、物理块。每个页框有一个编号即页框号,页框号从0开始
将用户进程也分为于页框大小相等的一个个区域,称为页或页面。每个页面也有一个编号,即页号也是从0开始
操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。
各个页面不必连续存放,也不便先后顺序来,可以放到不相邻的各个页框中。

将进程地址空间分页后,操作系统该如何实现逻辑地址到物理地址的转换?
2:基本分段存储管理
与分页最大的区别是–离散分配时所分配地址空间的基本单位不同。
在这里插入图片描述

  • 分段:

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

  • 段表:

将程序分为多个段,各段离散地装入内存,为了保证程序能够正常运行,就必须能从物理内存中找到各个逻辑段的存放位置,为此,需要为每个进程建立一张段映射表,简称段表

段号段长基址
07K80K
13K120K
26K40K
  • 地址变换

(1)由逻辑地址得到段号、段内地址
(2)段号与段表寄存器中的段长度比较,检查是否越界
(3)由段表始址,段号找到对应段表项
(4)根据段表中记录的段长,检查段内地址是否越界
(5)由段表中的基址+段内地址得到最终的物理地址
(6)访问目标单元
3:段页式存储管理
分页与分段的管理的结合

优点缺点
分页管理内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片不翻边按照逻辑模块实现信息的共享和保护
分段管理很方便按照逻辑模块实现信息的共享与保护如果段长过大,为其分配很大的连续空间会很不方便。另外段式管理会产生外部碎片
在这里插入图片描述
  • 地址变换

(1)由逻辑地址得到段号、页号、页内偏移量
(2)段号与段表寄存器中的段长度比较,检查是否越界
(3)由段表始址、段号找到对应段表项
(4)根据段表记录的的页表长度,检查页号是否越界
(5)由段表中的页表地址、页号得到查询页表,找到相应页表项
(6)由页面存放的内存块号、页内偏移量的到最终的物理地址
(7)访问目标单元

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

二:内存空间扩充
1:覆盖技术
用来解决程序大小超过鼓励内存总和的问题。将程序分为多个段,常用的段常驻内存,不常用的段在需要时调入内存。内存中分为一个“固定区”和若干个“覆盖区”。需要常驻内存的段放在“固定区”,掉入后就不在调出,除非运行结束。不常用的段放在“覆盖区”。需要用到时调入内存,用不到时调出内存。
在这里插入图片描述

必须由程序员声明覆盖结构,操作系统完成自动覆盖,缺点是对用户不透明,增加用户编程负担。
2:交换技术
内存空间紧张时系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存。
暂时换出外存等待的进程状态为挂起状态,挂起状态又可以进一步细分就绪挂起和阻塞挂起两种状态。
磁盘分为文件区和对换区,换出的进程放在对换区
3:区别
覆盖是在同一个程序或进程中。交换是在不同进程之间。
三:地址转换
四:内存保护
1:在CPU中设置一对上,下限寄存器。存放进程的上下限地址。进程指令要访问某个地址时,CPU检查是否越界。
2:采用重定位寄存器和界地址寄存器,进行越界检查。重定位寄存器存放的是进程的起始物理地址。界地址寄存器存放的是进程的最大逻辑地址。

内存速度

请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值