操作系统入门 -- 内存管理

操作系统入门 – 内存管理

1.内存种类

1.1 虚拟内存(VIRT)

  • 进程需要的虚拟内存大小,包括进程使用的库、代码、数据以及malloc、new分配的堆空间和栈空间等。
  • 若进程申请了10MB内存但实际使用了1MB,则物理空间会增长10MB。

1.2 常驻内存(RES)

  • 进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和栈空间,不包括sawp out量。其中还包含其他进程的共享。
  • 若申请10MB则实际使用1MB

1.3 共享内存(SHR)

  • 除了自身进程的共享内存,也包括其他进程的共享内存。
  • 进程只使用了几个共享库的函数,但包含了整个共享库大小。
  • 计算某个进程所占物理内存大小为RES - SHR.
  • swap后会降下来。

2.操作系统内存管理

2.1 内存管理的意义

目前计算机硬件发展很快,内存容量也越来越大。但是仍然不可能将所有用户进程和系统所需要的全部程序和数据放入主存中,所以操作系统必须将内存空间进行合理地划分和有效地动态分配。操作系统对内存的划分和动态分配,就是内存管理的概念。

2.2 内存管理的内容

操作系统中内存管理主要负责内存分配与回收(malloc:申请内存 , free:释放内存),同时将逻辑地址映射到物理空间也是内存管理的内容。其中主要有以下四个功能:

  • 内存空间分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。
  • 地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
  • 内存空间扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
  • 存储保护:保证各道作业在各自的存储空间内运行,.互不干扰。

2.3 内存管理目的

提高内存利用率。所谓提高利用率就是尽可能让更多进程沾满内存。进程在内存中的分布又可以分为连续和非连续。

2.4 程序装入与链接

2.4.1 程序装入过程

创建进程首先要将程序和数据装入内存。将用户源程序变为能在内存中执行的程序需要以下步骤:

  • 编译:由编译程序将用户源代码编译为若干个 目标模块
  • 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的 装入模块
  • 装入:由装入程序将模块装入内存运行。

2.4.2 程序链接

  • 静态链接:在程序运行之前,先将各个目标模块及所需函数库链接成一个完整的可执行程序,以后不再拆开。
  • 装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,采用变装入边链接的方式。
  • 运行时动态链接:对某些目标模块的连接,是在程序执行中需要该目标模块时,才对其进行链接。优点在于便于修改和更新,便于实现对目标模块的共享。

2.5 地址映射

程序在编译后,每个目标模块都是从0号单元开始编址,称为该目标模块的相对地址(逻辑地址)。当链接程序将各个模块链接为一个完整可执行的目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。简单来说就是该条链接是从0号开始顺序往下编址。

物理地址空间是指内存中物理单元的集合,它是地址转换后的最终结果。进程在运行时执行指令和访问数据最后都需要通过物理地址从主存中存取。当装入程序将可执行代码装入内存中时,必须通过地址转换将逻辑地址转换为物理地址。

2.5 内存保护

内存在分配前,需要保护操作系统进程不受影响,同时保护用户进程不受其他用户进程影响。采用重定位寄存器和界地址寄存器来实现这种保护。重定位寄存器含有最小的物理地址值,界地址寄存器含逻辑地址值。每个逻辑地址值必须小于界地址寄存器。内存管理机构动态地将逻辑地址与界地址寄存器比较,若未发生越界,则加上重定位寄存器的值后映射为物理地址,最后送交内存单元。


3.内存覆盖与交换

3.1 内存覆盖

3.1.1 问题产生

早期计算机内存空间较小,且其中需要存放一道用户程序,但由于内存空间有时连用户进程都放不下,因此采用覆盖来解决。

3.1.2 实现过程

程序运行时不是任何时候都要访问程序和数据的各个部分,因此可以把用户空间分为一个固定区域和若干覆盖区域。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先把将要方位的段放入覆盖区,其余部分放入外存,在需要调用前载入覆盖区替换原来的数据。

3.2 内存交换

3.2.1 实现过程

交换是把等待状态下的进程从内存中换出至外存,腾出内存空间,把就绪的进程从外存换入内存中准备执行。

3.2.2 注意事项

  • 交换需要备份存储,需要磁盘空间足够大,并提供对内存映像的直接访问。
  • 为有效使用CPU,需要每个进程的执行时间比较长,影响交换时间的是转移时间。转移时间与所交换的内存空间成正比
  • 换出进程必须确保该进程完全处于空闲状态。
  • 交换的空间通常为磁盘上一整块区域,且独立于文件系统。
  • 内存交换一般发生于内存空间不足的时候,当内存负荷降低后暂停。

3.3 总结

交换主要是不同进程之间,而覆盖则是在同一程序或进程中。目前操作系统主流采用内存交换技术。


4.内存分配

4.1 内存连续分配

连续分配方式,是指为一个用户程序分配一个连续的内存空间。它主要包括单一连续分配、固定分区分配和动态分区分配。

4.1.1 单一连续分配

内存在该分配模式下分为系统区和用户区,系统区为操作系统提供使用,通常为低地址部分、用户区为除系统区外的内存空间。

  • 优点:简单、无外部碎片、可以采用覆盖技术,无需额外技术支持。
  • 缺点:只能用于单用户、单任务的操作系统,内部有碎片,存储利用率低。

4.1.2 固定分区分配

固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。当存在空闲分区时,便可以再从外存的后备作业队列中选择适当大小的作业装入该分区。

  • 分区方式
    • 分区大小相等:用于一台计算机控制多个相同对象的场合,缺乏灵活性。
    • 分区大小不等:划分为含多个较小的分区、适量的中等分区及少量大分区
      但这种存储方式存在以下问题:
    • 程序可能太大而无法放进任一分区,此时只能使用覆盖技术
    • 主存利用率低,当程序体积小于固定分区大小时,放进去也需要占用这一分区,造成浪费。

4.1.3 动态分区分配

动态分区分配不会先划分内存,而是在进程装入内存时动态分配空间,分区大小和数量是可变的。动态分区刚开始没有什么问题但之后会出现许多小内存块,随着内存块增多,利用率下降。

如果内存空间足够大,则操作系统必须明确分配哪个内存给进程使用,即动态分区分配策略,其算法如下:

  • 首次适应算法:空闲分区以地址递增的次序链接。分配内存时顺序查找,找到第一个能满足大小的分区。
  • 最佳适应算法:空闲分区安容量递增形成分区链。找到第一个能满足大小的分区。
  • 最坏适应算法:空闲分区按容量递减次序链接。找到第一个能满足要求的空闲分区。
  • 邻近适应算法:由首次适应算法演变。不同之处是分配内存时从上次查找结束的位置开始继续查找。

4.2 内存非连续分配

非连续分配允许一个程序分散地装入不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式和分段存储管理方式。

4.2.1 基本分页存储管理方式

分页是将主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。分页本身不会产生外部碎片,但是块的大小相对分区要小很多,且进程也按照块进行划分,进程运行按块申请内存。因此进程只会在为最后一个不完整的块申请一个主存储块时才会产生碎片。

4.2.2 分页存储的基本概念

  • 页面和页面大小:进程中的块称为页,内存中的块称为页框。外存也以同样方式划分,称为块。进程执行时申请内存空间,即为每个页面分配页框。
  • 页面大小:为方便地址转换,页面大小应是2的整数幂。页面大小适中,若页面过小则进程页面数过多,页表会过长,占用大量内存。页面过大则页内碎片增多,降低利用率。
  • 地址结构:由两部分组成,前一部分为页号P,后一部分为页内偏移量W,地址长度为32 位,其中011位为页内地址,即每页大小为4KB;1231位为页号,地址空间最多允许有220页。
  • 页表:为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般存放在内存中。

4.2.3 基本地址变换机构

地址变换机构的任务是将逻辑地址转为内存中的物理地址,该机构通过页表实现。

alt text

4.2.4 基于快表的地址变换机构

若页表全部放在内存中,则存取一个数据或一条指令至少要访问两次内存,因此在地址变换机构中增加一个高速缓冲器即快表来存放当前访问的若干页表项,以加速地址变换的过程。
alt text

4.2.4 多级页表

于引入了分页管理,进程在执行时不需要将所有页调入内存页框中,而只要将保存有映射关系的页表调入内存中即可。但是我们仍然需要考虑页表的大小。
以32 位逻辑地址空间、页面大小4KB、页表项大小4B为例,若要实现进程对全部逻辑地址空间的映射,则每个进程需要220,约100万个页表项。也就是说,每个进程仅页表这一项就需要4MB主存空间,这显然是不切实际的。而即便不考虑对全部逻辑地址空间进行映射的情况,一个逻辑地址空间稍大的进程,其页表大小也可能是过大的。
alt text

5.总结

从内存种类再到内存的管理方式,本文并未深入介绍,只是了解了基本的工作原理,未来将持续更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Resource punkt not found.的解决方法

这个问题本来不想记录,但是在好几个机子上都碰到了(用到了LangChain读Word文档)。简单记录一下。看到报错以后运行: import nltk # nltk.set_proxy(http://192.168.1.68:10811) nltk.download() 中间这句我注释掉了,…

接轨国际安全标准:等保认证在提升企业全球竞争力中的核心作用

随着全球化进程的加速和数字经济的蓬勃发展,信息安全已成为企业拓展国际市场、参与国际竞争的重要基石。网络安全等级保护(简称“等保”)认证,作为衡量企业信息安全管理水平的重要标尺,不仅体现了企业的技术实力和合规…

速盾:ddos攻击类型有哪些?

DDoS攻击(分布式拒绝服务攻击)是一种通过利用多个被感染的计算机或网络设备,以大量的请求或数据包来占用目标系统资源,导致其无法正常提供服务的攻击方式。DDoS攻击常常被黑客用来影响目标的可用性,造成经济损失或打击…

如何以智能方式安装 Python

Python易于使用,对初学者友好,功能强大,几乎可以为任何应用程序创建强大的软件。 但与任何其他软件一样,Python 的设置和管理可能很复杂。 在本文中,我们将介绍如何正确设置 Python。 您将学习如何选择合适的版本、…

学习笔记——动态路由——RIP(附加度量值配置)

六、附加度量值配置 RIP协议cost开销值:默认值为0,路由信息每传递一次,值增加1,最大15,(路由器不能超过15台)16代表不可达。 入接口附加度量值 rip metricin 5 //可以修改开销改变路径。只能增加,不能减小 …

count(*) over (partition by ……)用法详解

select id,count(*) over(partition by pro_id) from sal; 以pro_id分组,统计分组后每个pro_id的记录总数及对应的id; 类似还有count(*) over(order by ……)、sum(amount) over(partition by ……)等,略有区别

降低企业运营成本的API服务有哪些?

通过API服务,企业可以实现许多功能和服务的自动化和优化,从而有效降低企业的运营成本。API服务可以帮助企业简化流程、减少人工操作、提高效率,并提供数据支持和决策依据,从而实现成本的有效控制和降低。无论是人力资源管理、客户…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(一)

译注 由于 1.2.2 小节介绍 SVG 的篇幅过多,为了方便查阅,后续将分多个小节依次进行翻译。为了确保整个 1.2.2 小节的完整性,特意将上一篇包含的 SVG 小节的内容整理出来重新编排。敬请留意。 1.2.2 SVG - 可缩放矢量图形 可伸缩矢量图形&…

kaoYan-English

英语的提高是个日积月累,可以花一个月时间突击政治。但英语不可。关键在于单词和阅读理解 提高英语成绩的捷径,多做阅读题。阅读理解的分值高,阅读理解在巩固词汇,培养语感有不可替代作用。 选资料,贴合考研难度的&a…

x264 编码器 i_intra_cost 计算过程

介绍 是uint16_t类型指针变量,用来存储每个宏块的帧内代价值,在 frame.h 文件中x264_frame_t结构体中声明。在*frame_new 函数中将lowres_costs[0][0]指向给i_intra_cost,并 memset 为-1;//代码有删减 frame->i_intra_cost = frame->lowres_costs[0][0]; memset( fra…

Raspbian命令行连接WiFi网络

Raspbian命令行连接WiFi网络 1. 源由2. 环境3. 信号4. 连接5. 检查6. 断开 1. 源由 “懒人”多福,是什么原因,大家知道不,哈哈。 如果大家关注过之前《Ardupilot开源代码之Rover上路计划》,为了笔记本电脑在不断网的情况下进行配…

Rust 中使用 :: 这种语法的几种情况

文章目录 1. 访问模块成员:2. 访问关联函数或静态方法:3. 访问 trait 的关联类型或关联常量4. 指定泛型类型参数 1. 访问模块成员: mod utils {pub fn do_something() { /* ... */ } }let result utils::do_something();2. 访问关联函数或静…

【Spring Cloud Alibaba AI】简单使用

本文基于官方文档。 Spring AI 官方文档:Spring AI :: Spring AI Reference 中文文档:Spring AI 简介 - spring 中文网 (springdoc.cn) Spring AI 是 Spring 官方社区项目,旨在简化 Java AI 应用程序开发,让 Java 开发者像使用…

达梦数据库死锁排查和解决

达梦数据库死锁排查和解决 链接: 达梦数据库死锁排查和解决

道路元素位置和方向的坐标系统: 点 线 面 连接点

道路元素位置和方向的坐标系统: 下图道路元素在地球坐标系中的位置,该位置由三个坐标轴(x, y, z)组成的笛卡尔坐标系来确定。这种描述特别适用于三维建模和地理信息系统(GIS)中,其中道路被视为一个三维模型…

XSLT 转换:深入解析与实际应用

XSLT 转换:深入解析与实际应用 引言 XSLT(Extensible Stylesheet Language Transformations)是一种用于将XML文档转换为其他格式(如HTML、XML或文本)的语言。它由W3C制定,是XML技术栈的重要组成部分。XSLT转换不仅限于格式转换,还可以用于数据提取、报告生成、复杂计算…

陈皓(左耳朵皓子):程序算法与人生选择

写于2012,虽然过去很久了,现在读来依然很受启发,或许这就是好文的标准吧,不随着时间的流逝而减弱。 每年一到要找工作的时候,我就能收到很多人给我发来的邮件,总是问我怎么选择他们的offer,去腾…

使用 position:absolute; 定位的元素在ios上被遮盖

在ios上一个元素使用position:absolute;定位后,被其它元素遮盖 在使用absolute的元素上加一行代码 -webkit-transform: translate3d(0, 0, 0);

[渗透测试] 任意文件读取漏洞

任意文件读取漏洞 概述 漏洞成因 存在读取文件的功能(Web应用开放了文件读取功能)读取文件的路径客户端可控(完全控制或者影响文件路径)没有对文件路径进行校验或者校验不严格导致被绕过输出文件内容 漏洞危害 下载服务器中的…

Linux下反汇编相关工具

Linux下反汇编相关工具 程序出现崩溃堆栈,如果事先没有装调试包或者以调试模式编译,则打出的堆栈中看不到函数名,或者显示 n/a。此时往往需要根据 backtrace 打印的函数偏移地址来确定调用的是什么函数,这里就涉及到比较高级的调…