一、虚拟内存

设想一个场景,如果两个进程都会内存进行写入操作,那么会发生一个问题,进程一在写入完数据后,进程二会将进程一写入的数据给覆盖掉,这是我们非常不愿意看到的,这样会造成程序的崩溃。

为了解决这个问题,必须给每个进程分配不同的内存空间来进行操作,这样不同的进程在执行的时候就不会产生冲突了,而实现这一功能就需要引入虚拟内存。

即操作系统会为每个进程分配一个虚拟内存,操作系统内部会维护一张表,用于记录虚拟内存和实际内存地址之间的映射。这样进程在执行数据写入的时候,操作系统可以通过虚拟地址和实际内存地址之间的映射来确定要操作的内存地址。

具体过程可以参考这张图。

二、内存分页和内存分段

操作系统为了管理虚拟内存和实际内存之间的关系,采用内存分页和内存分段。

2.1 内存分段

内存分段机制下的虚拟地址主要由两部分组成:段选择因子和段内偏移量

可以参考上面这张图,段选择子用于定位段表,进而找到内存中段对应的实际地址的起始地址,而段内偏移量用于定位内存地址在段中的位置 。

也可以这么理解,段选择因子用于定位你住在哪栋楼,段内偏移量用于定位你住在这栋楼的哪一户。

比如我要访问段号3中偏移量为500的内存空间,那么这个内存空间对应的实际物理地址的为7000+500 = 7500。

但内存分段带来两个问题:

一是内存碎片的产生。

二是内存交换的效率较低。

首先来看第一个问题:

如图,内存中游戏,浏览器和音乐的程序分别占用512MB,128MB,256MB内存,但浏览器退出后,物理内存中会多处128MB内存,此时一个200MB的新程序试图加入内存中,此时内存中有256MB的空闲空间,理论上来说可以容纳新的程序,但是因为这256MB的内存空间是不连续的,在新程序不支持不连续存储的情况下,无法为其分配内存。

为了给新来的程序分配内存,必须要将内存中的部分程序移出至交换空间,然后才可以为新来的程序分配内存。但这样也会存在一个问题,如果内存交换移出的是一个很大的程序,那么将造成长时间的卡顿,用户体验非常不好。

因此,为了解决内存分段带来的问题,操作系统还有一种内存管理方式,叫做内存分页。

2.2 内存分页

内存分页是把整个虚拟内存和整个内存空间切成一段段固定的大小。将这样连续且尺寸固定的空间成为页。

⻚表是存储在内存⾥的,内存管理单元 (MMU)就做将虚拟内存地址转换成物理地址的⼯作。

由于内存空间都是预先划分好的,也就不会像分段会产⽣间隙⾮常⼩的内存,这正是分段会产⽣内存碎⽚的原因。⽽采⽤了分⻚,那么释放的内存都是以⻚为单位释放的,也就不会产⽣⽆法给进程使⽤的⼩内存。
如果内存空间不够,操作系统会把其他正在运⾏的进程中的最近没被使⽤的内存⻚⾯给释放掉,也就是暂时写在硬盘上。⼀旦需要的时候,再加载进来。所以,⼀次性写⼊磁盘的也只有少数的⼀个⻚或者⼏个⻚,不会花太多时间,内存交换的效率就相对⽐较⾼。

分页管理下,虚拟地址和物理地址之间的映射方式与分段管理类似。

同样是通过起始地址 + 偏移量的方式来确定。

但简单的分页放在实际的操作系统中运行是会有问题的。因为页的内存空间大小相对较小,页表的大小较大,因此占用了大量的内存空间。于是出现了多级页表和段页式管理。

2.3 多级页表

多级页表的结构如图所示,一级页表中将不再存储页号信息而是存储着二级页表的地址,二级页表也将存储着下一级页表结构的地址,直到最后一级页表中会存储着对应的物理页号。

可以把多级页表理解为树结构,下级页表是上级页表的子结点,物理页号存储在叶子结点中。

只有在子页表结构中有存储物理页号时,才会创建这个子结点,否则,将不进行子结点的创建,这样将大大节省内存空间。

2.4 段页式管理

如图所示,段页式管理的原理如下:

1.先将内存划分成多个段

2.将每个段划分成多个页

3.通过段表映射到每个段对应的段页表

4.通过每个段对应的段页表查找到物理内存中的对应地址。

三、linux系统中的内存管理

linux中的内存结构如下:

通过这张图你可以看到,⽤户空间内存,从低到⾼分别是 6 种不同的内存段:
1.程序⽂件段,包括⼆进制可执⾏代码;
2.已初始化数据段,包括静态常量;
3.未初始化数据段,包括未初始化的静态变量;
4.堆段,包括动态分配的内存,从低地址开始向上增⻓;
5.⽂件映射段,包括动态库、共享内存等,从低地址开始向上增⻓(跟硬件和内核版本有关);
6.栈段,包括局部变量和函数调⽤的上下⽂等。栈的⼤⼩是固定的,⼀般是 8 MB 。当然系统也提供了参数,以便我们⾃定义⼤⼩;

操作系统内存及内存管理方式相关推荐

  1. 47.内存连续分配管理方式有哪几种?

    1.单一连续分配-单用户单任务 2.固定分区分配-内部碎片 3.动态分区分配-外部碎片

  2. 操作系统-课堂笔记-内存管理(南航)

    文章目录 内存管理 回顾 内存管理的作用是什么? 如何分配物理内存 物理内存分配方案 1.连续分配存储管理(可应用于嵌入式设备) 1.1单一连续分配 1.2固定分区分配 1.3可变分区分配 连续分配存 ...

  3. 操作系统——内存分配与管理

    内存的定义: 内存是用于存放数据的硬件.程序在执行前需要先放到内存中才能被CPU处理. 按字编址: 如果字长为16位的计算机"按字编址",则每个存储单元大小为1个字;每个字的大小为 ...

  4. 计算机操作系统:存储器的管理

    程序的几种装入方式: 1.绝对装入方式:用户程序编译后将产生绝对地址的目标代码,绝对装入程序按照装入模块的地址将程序和数据装入内存.程序中所使用的绝对地址既可以在编译或汇编时给出,也可由程序员直接赋予 ...

  5. 操作系统--内存管理方式

    "碎片的内存"描述一个系统中所有不可用的空闲内存.这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用.这一问题通常都会发生,原因在于空闲内存以小而不连续方式出 ...

  6. 13 操作系统第三章 内存管理 虚拟内存 请求分页管理方式 页面置换算法 页面分配策略

    文章目录 1 虚拟内存 1.1 传统存储管理方式的特征.缺点 1.2 局部性原理 1.3 虚拟内存主要特征 1.4 如何实现虚拟内存技术 1.5 虚拟内存的基本概念小结 2 请求分页管理方式 2.1 ...

  7. 12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理

    文章目录 1 基本分页存储管理 1.1 什么是分页存储 1.2 重要的数据结构--页表 1.3 基本地址变换机构 1.4 具有快表的地址变换机构 1.4.1 什么是快表(TLB) 1.4.2 引入快表 ...

  8. 11 操作系统第三章 内存管理 内存的基本知识 内存管理 内存空间扩充 连续分配管理方式

    文章目录 1 内存概念 1.1 内存作用 1.2 逻辑地址VS物理地址 1.3 装入的三种方式 1.3.1 绝对装入 1.3.2 可重定位装入 1.3.3 动态重定位装入 1.4 链接的三种方式 1. ...

  9. (王道408考研操作系统)第三章内存管理-第二节2:请求分页管理方式

    文章目录 一:页表机制 二:缺页中断机构 三:地址变换机构 虚拟内存的实现需要建立在离散分配的内存管理方式的基础上.主要有以下三种 请求分页存储管理 请求分段存储管理 请求段页式存储管理 与传统的非连 ...

  10. (王道408考研操作系统)第三章内存管理-第一节6-1:非连续分配管理方式之基本分页存储管理

    文章目录 一:分页存储管理基本思想 二:分页存储管理基本概念 (1)页框和页 (2)页框和页关系 (3)分页的优点 三:分页存储管理实现地址转换 (1)借鉴连续分配管理方式中的动态重定位 (2)分页管 ...

最新文章

  1. mass Framework在后端的核心模块
  2. 对比学习simSiam(一)--Exploring Simple Siamese Representation Learning总体理解
  3. 解决win11 WSL下通过systemd无法启动docker的问题:改为dockerd手动启动
  4. OpenGL 投光物Light casters
  5. Git 使用帮助(下)
  6. redis实现简单限流
  7. 奇怪的匿名函数之争EventHandler
  8. IE6下margin-left双倍bug问题
  9. 【bfs】神殿(jzoj 2296)
  10. Ubuntu 和 Centos 的一点差别
  11. mysql 报错5 拒绝访问_linux上装mysql
  12. 【排序算法】堆排序——常规方法
  13. TYVJ1613 不和谐的公司
  14. Spring.Net学习笔记(3)-创建对象
  15. .text urlRewrite介绍
  16. 十六进制转二进制c语言程序,c语言中十六进制转为二进制
  17. Mac操作指南:访问Windows共享文件
  18. Java 类对象基础知识--科普
  19. lnmp下配置PHP虚拟主机vhost
  20. (修改完善)SpringBoot+Mybatis-Plus使用webSocket实现一对一聊天

热门文章

  1. matlab继续截止频率,关于-3db截止频率
  2. greenplum小版本升级
  3. CentOS7安装FTP服务器及默认21端口修改
  4. 聚合支付系统设计(三)
  5. 京东联盟api获取数据
  6. python 拆分excel 随机分组
  7. HBase2.4.10 踩坑笔记
  8. 股票 - - 常用指标【上】
  9. 数学建模好学吗?半年带出几十位省奖和十几位国奖
  10. 微信小程序云函数发天气预报