【操作系统】内存管理概念

这篇具有很好参考价值的文章主要介绍了【操作系统】内存管理概念。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

进程运行的基本原理

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

内存管理概念

1、 内存管理的概念
① 操作系统负责内存空间的分配与回收连续与非连续分配管理方式
② 操作系统需要提供某种技术从逻辑上对内存空间进行扩充 覆盖技术、交换技术、虚拟存储技术
③ 操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换
④ 操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰。
内存保护方法:
➢ 方法一:在 CPU 中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU 检查是否越界
➢ 方法二:采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。
2、 覆盖与交换
(1) 覆盖技术
用来解决“程序大小超过物理内存总和”的问题。将程序分为多个段(多个模块),常用的段常驻内存,不常用的段需要时调入内存。
➢ 内存中分为一个“固定区”和若干个“覆盖区”。
➢ 需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束)
➢ 不常用的段放在“覆盖区”,需要用时调入内存,用不到时调出内存。
image.png
必须由程序员声明覆盖结构,操作系统完成自动覆盖。缺点:对用户不透明,增加了用户编程负担。
覆盖技术只用于早期的操作系统中,现在已成为历史。

(2) 交换技术
交换技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
➢ 暂时换出外存等待的进程状态为挂起状态
➢ 挂起态又可以分为就绪挂起、阻塞挂起两种状态
➢ 中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存
① 被换出进程在外存中的存储位置:
具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;对换区空间只占磁盘空间的一小部分,被换出的进程数据就存放在对换区。
由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式。总之,对换区的 I/O 速度比文件区的快。
② 什么时候应该交换:
交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。
③ 应该换出哪些进程:
可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间(注意:PCB 会常驻内存,不会被换出外存)
(3) 覆盖与交换的区别:覆盖是在同一程序或进程中的,交换是在不同进程(或作业)之间的

连续分配管理方式

1、 单一连续分配
在单一连续分配中,内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据
➢ 内存中同一时刻只能有一道用户程序,用户程序独占整个用户区空间
➢ 优点:实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护
➢ 缺点:只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低
内部碎片:分配给某进程的内存区域中,如果有些部分没有用上,就是“内部碎片”
2、 固定分区分配
为了能在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式
① 分区大小相等:缺乏灵活性,但是很适用于用一台计算机控制多个相同对象的场合
(比如:钢铁厂有 n 个相同的炼钢炉,就可以把内存分为 n 个大小相等的区域存放n 个炼钢炉控制程序)
② 分区大小不等:增加了灵活性,可以满足不同大小的进程需求。根据常在系统中运行的作业大小情况进行划分
➢ 操作系统需要建立一个数据结构——分区说明表,来实现各个分区的分配与回收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的大小、起始地址、状态(是否已分配)
image.png
当某用户程序要装入内存时,由操作系统内核程序根据用户程序大小检索该表,从中找到一个能满足大小的、未分配的分区,将之分配给程序,然后修改状态为“已分配”
➢ 优点:实现简单,无外部碎片
➢ 缺点:

  • a.当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采取覆盖技术来解决,但这又会降低性能;
  • b.会产生内部碎片,内存利用率低。

3、 动态分区分配
又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的(假设计算机的内存大小为 64MB,系统区 8MB,用户区共 56MB)
➢ 动态分区分配没有内部碎片,但是有外部碎片
内部碎片:分配给某进程的内存区域中,如果有些部分没有用上
外部碎片:内存中的某些空闲分区由于太小而难以利用;可以通过紧凑技术来解决外部碎片,将内存中的分区进行拼凑靠紧腾出空间,但需要时间代价
① 系统要用什么样的数据结构记录内存的使用情况?
➢ 空闲分区表
➢ 空闲分区链
image.png
② 当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?
须按照一定的动态分区分配算法,从空闲分配表/链中选出一个分区匹配给该作业。
③ 如何进行分区的分配与回收操作?
分区大小和起始地址加减操作,全部分配或回收就加减分区数或合并分区

动态分区分配算法

在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?
1、 首次适应算法(效果最好)
➢ 算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区
➢ 如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链
(或空闲分区表),找到大小能满足要求的第一个空闲分区
➢ 优点:低地址部分有更小的分区满足需求时,会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的大分区保留下来。一般不需要对空闲分区队列重新排序。
➢ 缺点:可能导致低地址部分出现很多小的空闲分区,而每次查找时都要经过这些分区,因此增加了查找的开销
2、 最佳适应算法
➢ 算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即优先使用更小的空闲区
➢ 如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区
➢ 缺点:每次都选最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多的外部碎片
3、 最坏适应算法
➢ 算法思想:为了解决最佳适应算法的问题——即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,
更方便使用
➢ 如何实现:空闲分区按容量递减的次序链接。每次分配内存时顺序查找空闲分区链
(或空闲分区表),找到大小能满足要求的第一个空闲分区
➢ 缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,但是这种方式会导致较大的连续空闲区被迅速用完,如果之后有“大进程”到达,就没有内存分区可用了
4、 邻近适应算法
➢ 算法思想:每次都从上次查找结束的位置开始检索
➢ 如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区
➢ 优点:不用从低地址开始检索,减少了算法开销
➢ 缺点:可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,这也就导致了高地址部分的大分区更可能被使用,划分为小分区,最后导致无大分区可用

非连续分配管理方式

1、 基本分页存储管理
(1) 基本概念
➢ 将内存空间分为一个个大小相等的分区,每个分区就是一个“页框”,或称“页帧”、“内存块”、“物理块”。每个页框有一个编号,即“页框号”(或“内存块号”、“页帧号”、“物理块号”)页框号从 0 开始
➢ 将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或“页面”。 每个页面也有一个编号,即“页号”,页号也是从 0 开始的
➢ 进程的最后一个页面可能没有一个页框那么大。因此,页框不能太大,否则可能产生过大的内部碎片
(2) 如何实现地址的转换?
将进程地址空间分页之后,操作系统该如何实现逻辑地址到物理地址的转换?
image.png
image.png
如何计算:
页号=逻辑地址/页面大小(取商)
页内偏移量=逻辑地址%页面大小(取余)
页面在内存中的起始位置:操作系统需要用某种数据结构记录进程各个页面的起始位置
(3) 页表
为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表
image.png
Eg:假设某系统物理内存大小为4GB,页面大小为4KB,则每个页表项至少应该为多少字节?
4GB= 232B,4KB= 212B
因此4GB的内存总共会被分为232/212= 20个内存块,因此内存块号的范围应该是0~ 20-1
因此至少要20个二进制位才能表示这么多的内存块号,因此至少要3个字节才够(每个字节8个二进制位,3个字节共24个二进制位)
image.png
(4) 基本地址变换机构
基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址
通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址 F 和页表长度 M。进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中
image.png
具体变换过程:
① 计算页号 P 和页内偏移量 W
② 比较页号 P 和页表长度 M,若 P≥M,则产生越界中断,否则继续执行。(页号是从 0 开始的,而页表长度至少是 1,因此 P=M 会越界)
③ 页表中页号 P 对应的页表项地址=页表起始地址 F+页号 P页表项长度,取出该页表项内容 b,即为内存块号。
重点区分:页表长度:这个页表中总共有几个页表项,即总共有几个页
页表项长度:每个页表项占多大的存储空间
页面大小:一个页面占多大的存储空间
④ 计算物理地址=内存块号
页面大小+页内偏移量,二进制方法:内存块号和页内偏移量用二进制拼接在一起
在分页存储管理(页式管理)的系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。因此页式管理中地址是唯一的
image.png
理论上,页表项长度为 3B 即可表示内存块号的范围,但是为了方便页表的查询,常常会让一个页表项占更多的字节,使得每个页面恰好可以装得下整数个页表项。进程页表通常是装在连续的内存块中
(5) 具有快表的地址变换机构
快表又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲寄存器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。
image.png
引入块表后,地址的变换过程:

  1. CPU 给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较
  2. 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表命中,则访问某个逻辑地址仅需一次访存即可
  3. 如果没有找到匹配的页号,则需要访问内存中的页表,找到对应页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表未命中,则访问某个逻辑地址需要两次访存(在找到页表项后,应同时将其存入快表)
  4. 快表的命中率一般可以达到 90%以上
    (6) 两级页表
    ① 单级页表存在的问题
    ➢ 页表必须连续存放,因此当页表很大时,需要占用多个连续的页框
    ➢ 进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存
    ② 如何解决单级页表的问题?
    ➢ 对于问题一:可将长长的页表进行分组,使每个内存刚好可以放入一个分组。另外要为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表
    两级页表的原理、地址结构
    ➢ 对于问题二
    应用虚拟存储技术
    ③ 需要注意的细节
    ➢ 若采用多级页表机制,则各级页表的大小不能超过一个页面
    ➢ 两级页表的访存次数分析(假设没有快表机构)
    第一次访存:访问内存中的顶级页表
    第二次访存:访问内存中的二级页表
    第三次访存:访问目标内存单元
    n 级页表需要访存 n+1 次
    2、 基本分段存储管理
    (1) 分段
    进程的地址空间按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每段从 0 开始编址
    ➢ 内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻
    ➢ 由于是按逻辑功能模块划分,用户编程更方便,程序的可读性更高
    ➢ 段号的位数决定了每个进程最多可以分几个段
    ➢ 段内地址位数决定了每个段的最大长度是多少
    image.png
    (2) 段表
    程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表,简称“段表“

分段、分页管理的对比

➢ 页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的
➢ 段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一 组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名
➢ 页的大小固定且由系统决定。
➢ 段的长度不固定,决定于用户编的程序
➢ 分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址
➢ 分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要
给出段内地址
➢ 分段比分页更容易实现信息的共享和保护
➢ 不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共
享的。可修改的代码是不能被修改的
➢ 访问一个逻辑地址需要几次访存?
分页(单级页表):第一次访存——查内存中的页表,第二次访存——访问目标内存单
元。总共两次访存
分段:第一次访存——查内存中的段表,第二次访存——访问目标内存单元。总共两
次访存,与分页系统类似,分段系统中也可以引入快表机构,将近期访问过的段表项放到快表中,这样可以少一次访问,加快地址变换速度。
image.png

段页式管理

image.png
image.png
段号的位数决定了每个进程最多可以分几个段
页号位数决定了每个段最大有多少页
页内偏移量决定了页面大小、内存块大小是多少
“分段”对用户可见,“分页”对用户不可见,段页式管理的地址结构是二维的
image.png
image.png文章来源地址https://www.toymoban.com/news/detail-460992.html

到了这里,关于【操作系统】内存管理概念的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】操作系统&&进程概念

    冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构 。数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成( 运算器、控制器、存储器、输入设备、输出设备 ),这

    2024年01月16日
    浏览(20)
  • 【Linux】操作系统与进程的概念

    目录 冯诺依曼体系 注意 为什么CPU不直接访问输入或输出设备? 跨主机间数据的传递 操作系统 管理 进程 描述进程 进程的查看和终止  bash 通过系统调用创建子进程 fork的辨析 🥖冯·诺依曼结构也称普林斯顿结构,是一种 将程序指令存储器和数据存储器合并在一起的存储器

    2024年01月18日
    浏览(20)
  • 【Linux】初步理解操作系统和进程概念

    操作系统是一款纯正的 “搞管理” 的文件 。 那操作系统为什么要管理文件? “管理” 又是什么? 它是怎么管理的? 1.操作系统帮助用户,管理好底层的软硬件资源; 2.为了给用户提供一个良好,安全的环境 即操作系统通过管理好底层的软硬件资源,为用户提供一个良好

    2024年02月15日
    浏览(14)
  • 【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解

    1、概念 (1)什么是冯诺伊曼体系结构? 数学家冯·诺伊曼于 1946 年提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。 冯·诺伊曼理论的要点是:计算机的数制采用二进制逻辑;计算机应该按照程序顺序执行。人们把冯·诺伊曼的

    2024年02月22日
    浏览(23)
  • [操作系统] 进程的详细认识----从概念到调度

    目录 前言 一.进程的概念  二.进程和程序之间的关系 2.1二者的关系  2.2资源的占用 三.进程的任务  四.进程的管理 五.PCB中的信息 5.1pid进程标识 5.2内存指针 5.3文件描述符表 六.进程的调度 6.1CPU的简单认识  6.2调度的方式 6.3PCB中调度相关属性 七.进程的通信与隔离 总结 🎁个

    2024年02月14日
    浏览(20)
  • 【Linux】进程概念I --操作系统概念与冯诺依曼体系结构

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 计算机是由两部分组成的: 硬件+软件 .与硬件相关的为 冯诺依曼体系结构 ,与软件相关的为: 操作系统 . 如今大多数计算机(笔记本,服务器等)大多数都遵守冯诺依曼体系结构.实际中

    2024年02月09日
    浏览(13)
  • 【Linux】冯诺依曼体系结构 && 操作系统 && 进程概念

    目录 一、冯诺依曼体系结构 二、操作系统  1、概念  2、设计OS的目的 三、进程  1、基本概念  2、描述进程-PCB  3、组织进程  4、查看进程和终止  5、通过系统调用获取进程标识符  6、通过系统调用创建进程-fork  7、进程状态  8、特殊进程    8.1 僵尸进程    8.2 孤儿进

    2024年02月10日
    浏览(33)
  • 操作系统:4、进程管理之进程同步

    上述过程,若并发执行就会出现缓冲区数据出错 “哲学家进餐问题中会发生极端情况,所有哲学家都饿死,也就是所有进程都陷入等待状态” “生产者消费者问题”以及“哲学家进程问题”的根源问题是:彼此相互之间没有通信。 若生产者通知消费者我已经完成一件产品生

    2023年04月26日
    浏览(19)
  • 操作系统——进程管理

    操作系统入门知识合集 目录 0.关注博主有更多知识 4.1进程概念 4.1.1进程基本概念 思考题: 4.1.2进程状态 思考题: 4.1.3进程控制块PCB 4.2进程控制 思考题: 4.3线程 思考题: 4.4临界资源与临界区 4.4.1临界资源与临界区 思考题: 4.4.2锁机制 4.5同步和P-V操作 4.5.1同步和互斥的概

    2024年02月02日
    浏览(22)
  • 【操作系统】02.进程管理

    多道就是将多个程序同时装入内存,使之并发运行。操作系统也是基于多道产生的,提高了资源利用率和系统吞吐量。 进程是程序的一次执行 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位 在引入线程后,线程成为调度的基本单位,进程仍是资源分

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包