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

内存

定义:
内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被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
    评论
### 回答1: 操作系统课设实验七是关于nachos内存地址扩展的实验。在操作系统中,内存地址扩展是为了解决内存空间不足的问题,能够扩大可用的内存地址范围。 在这个实验中,我们需要实现内存地址扩展的功能。首先,我们需要修改内核代码,以支持更大的内存空间。这包括对页表、内存管理和地址映射等方面的修改。 接下来,我们需要修改操作系统的编译选项,以允许nachos使用扩展后的内存地址。这可能涉及到修改编译器、链接器和加载器等工具链的配置。 然后,我们需要运行一系列的测试用例来验证内存地址扩展的功能。这些测试用例涵盖了不同的场景,包括进程的创建与销毁、内存的分配与释放、页表的更新等。通过这些测试用例的运行,我们可以验证内存地址扩展是否成功地被实现。 最后,我们还需要撰写一份实验报告,详细描述我们在实验中遇到的问题、解决的方法以及实验结果。这份报告应包括实验设计、实验步骤、结果分析和总结等内容。 总的来说,实验七的目标是通过对nachos内核代码的修改和配置,实现内存地址的扩展功能,并验证其正确性和可行性。通过这个实验,我们可以更深入地理解操作系统内存管理机制,并且加深对nachos操作系统的理解和熟悉程度。 ### 回答2: 在操作系统课设实验七中,我们将学习如何扩展Nachos操作系统中的内存地址空间。 内存地址扩展是指增加系统能够使用的内存地址范围。在Nachos操作系统中,默认的内存地址范围是32位,即可以寻址的内存大小为2^32个字节。然而,随着计算机系统的发展和应用的需求增加,这样的内存地址范围已经不足以满足现代计算机系统的要求。 在扩展内存地址空间之前,首先需要了解操作系统是如何管理内存的。在Nachos中,操作系统使用页表来实现虚拟内存的管理。每个进程都有自己的页表,其中记录了虚拟页面和物理页面之间的映射关系。操作系统通过访问页表来确定虚拟地址对应的物理地址。 实现内存地址扩展需要进行以下几个步骤: 1. 修改页表的结构:为了支持更大的内存地址范围,我们需要修改页表的数据结构。可以考虑使用更长的物理地址字段或者增加页表的层次结构来扩展内存地址范围。 2. 修改地址翻译机制:修改地址翻译机制,使其支持新的页表结构。这涉及到对地址翻译机制的修改和扩展,确保能够正确地将虚拟地址转换为物理地址。 3. 修改内存管理:修改内存管理模块,以支持更大的内存地址范围。这可能涉及到对缺页异常处理、页面替换算法和内存分配算法等方面的修改。 4. 修改其他相关模块:可能还需要修改其他相关模块,以适应新的内存地址扩展。 通过以上步骤的修改,我们可以成功地扩展Nachos操作系统内存地址空间。这样做可以提高系统的性能和资源管理能力,更好地满足现代计算机系统的需求。 ### 回答3: 操作系统课设实验七是关于Nachos内存地址扩展的。在实验中,我们需要扩展Nachos操作系统内存地址空间。 首先,为了理解内存地址扩展的必要性,我们需要了解Nachos操作系统内存地址限制。在默认情况下,Nachos操作系统内存地址空间是有限的,这意味着我们只能使用有限的内存来运行程序。然而,在实际应用中,我们经常需要处理更大规模的问题,这就需要更大的内存空间来存储和运行程序。 为了扩展内存地址,我们可以采用虚拟内存的方法。虚拟内存是一种计算机系统的内存管理技术,它可以将物理内存和逻辑内存分开,从而使得程序可以使用比物理内存更大的地址空间。在Nachos中,我们可以使用页面替换算法来实现虚拟内存。 页面替换算法是一种将内存中的页面与硬盘中的页面进行交换的技术。当内存空间不足时,在Nachos中,我们可以选择将一部分不常用的页面从内存中换出到硬盘中,从而腾出内存空间来加载更多的页面。当需要访问被换出的页面时,我们可以将其从硬盘中换入到内存中,这样就可以实现对更大内存地址的访问。 在实验中,我们可以使用Nachos操作系统提供的一些接口来实现内存地址扩展。例如,我们可以使用Nachos的PageTable来管理页面的映射关系,使用TranslationEntry来表示页面的状态。我们还可以使用SwapSpace来管理页面的换入和换出。 总之,操作系统课设实验七主要涉及了Nachos内存地址扩展的实现。通过虚拟内存和页面替换算法,我们可以扩展Nachos操作系统内存地址空间,以满足处理更大规模问题的需求。实验中,我们可以使用Nachos提供的接口来管理页面的映射、状态和换入换出操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全栈游戏开发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值