资讯专栏INFORMATION COLUMN

操作系统NO.2 | 详解操作系统的非连续内存管理(清华大学 操作系统原理)

tain335 / 2272人阅读

摘要:应用程序在内存中运行有利于操作系统的有效管理,让操作系统不要考虑太多底层的原理,只需要访问一个连续地址空间,即逻辑地址空间。物理内存的控制和管理是由硬件来完成的。

 创作不易,来了的客官点点关注,收藏,订阅一键三连❤?   


系列文章目录

操作系统NO.1 | 了解操作系统的基础知识


概述

操作系统NO.2 |  详解操作系统的非连续内存管理,通过本期内容你将了解内层的层次结构、分页、分段等知识。


目录

系列文章目录

概述

操作系统思维导图

计算机系统基本结构和工作原理

计算机系统的基础结构

计算机硬件系统工作原理

内存的层次结构

内存分层体系

内存管理目标

在操作系统中管理内存的不同方法

地址空间和地址生产

地址空间的定义

地址的生成

地址安全检查

连续内存分配

内存碎片问题

分区的动态分配

第一匹配分配

最优适配分配

最差适配分配

碎片整理方法

非连续内存管理

何为非连续内存管理?

非连续内存管理的优缺点

分段

段访问机制

分段寻址方案

分页

分页地址空间

帧(frame)

页(page)

页寻址机制

页表

分页机制存在的问题

TLB(Translation Look-aside Buffer)

反向页表

分页和分段的区别


 操作系统思维导图


 

计算机系统基本结构和工作原理

计算机系统的基础结构

计算机系统是由硬件系统软件系统两大部分组成。

计算机硬件: 计算机硬件由五个基本部分组成:运算器、控制器、存储器、输入设备和输出设备。硬件是构成计算机系统各功能部件的集合。是由电子、机械和光电元件组成的各种计算机部件和设备的总称,是计算机完成各项工作的物质基础。计算机硬件是看得见、摸得着的,实实在在存在的物理实体。

计算机软件:指与计算机系统操作有关的各种程序以及任何与之相关的文档和数据的集合。其中程序是用程序设计语言描述的适合计算机执行的语句指令序列。

CPU:程序执行的地方

内存:防止程序的代码和需要处理的数据

设备:主要是外设,例如硬盘、鼠标等

计算机硬件系统工作原理

(1)计算机内部采用二进制来表示程序和数据。

(2)采用“存储程序”的方式,将程序和数据放入同一个存储器中(内存储器),计算机能够自动高速地从存储器中取出指令加以执行。

工作原理


内存的层次结构

内存分层体系

运行内存(主存) / 磁盘(虚拟内存). 主存是在运行程序时所需要保存的数据空间,而磁盘是用于持久化数据保存的数据空间

CPU可以访问的内存包括两大类 : 寄存器 / cache(L1缓存 / L2缓存)

层次如下:

微处理器(CPU访问)

|___CPU寄存器 / L1缓存

|___L2缓存

主存(程序访问)

磁盘(程序访问)

CPU寄存器到磁盘,读写速度不断降低,单位成本不断降低,大小不断增大。

内存管理目标

抽象:逻辑地址空间。应用程序在内存中运行有利于操作系统的有效管理,让操作系统不要考虑太多底层的原理,只需要访问一个连续地址空间,即逻辑地址空间

保护:独立地址空间。内存中可以运行多个不同的应用程序,应用程序相互之间可以访问别的进程的地址空间,可能造成破坏,为了保护进程间的地址空间,需要进行隔离,因此需要独立的地址空间

共享:访问相同内存。进程之间也需要交互,因此需要操作系统提供一个共享的空间,让进程来访问相同的内存

虚拟更多的地址空间。当我们在内存运行了较多进程后,内存可能不够,此时我们可以将最需要最必要的程序(进程)放到内存中,而其他程序(进程,不需要进行访问的程序)放到硬盘(磁盘)上,通过此方法可以实现更多的地址空间

图解:从图中可以看到,在操作系统管理下,有四个放在内存中的程序(P1、P2、P3、P4),而正在运行的程序是P1,而其他等待中,尤其是P4可能由于当前正在等待某个进程需要一段时间后发生,因此P4的数据没有必要放到内存中,操作系统就将P4导入到硬盘中(虚拟),这样也有利于P1、P2、P3程序的进行。


在操作系统中管理内存的不同方法

地址空间和地址生产

地址空间的定义

地址空间:地址空间分为物理地址空间和逻辑地址空间。

物理地址空间:硬件支持的地址空间。比如内存条代表的主存,以及硬盘代表的存储空间,这两种存储空间即为物理内存。物理内存的控制和管理是由硬件来完成的。( address : [0, Max_sys] )

逻辑地址空间:一个运行的程序所看到的地址空间,一维的线性地址空间。( address : [0, Max_prog] )

地址的生成

逻辑地址的生成经过了很多转换过程,该过程基本上不需要操作系统的帮助,是通过应用程序、编译器、loader等来完成,执行的程序放大内存中后,仍然是逻辑地址,不是物理地址。这两者的区别如下:

物理地址的生多了一条映射关系,图中的指令有自己的逻辑地址,需要将次逻辑地址取出来,然后放到物理内存中,而这个过程中CPU的MMU表示了此过程的映射关系,从而得到逻辑地址对应的物理地址。

因此物理地址的生成步骤如下:

1.CPU执行指令时,ALU部件会需要指令的内容,它会发出请求获取指令内容

2.CPU的MMU会查找逻辑地址的映射表,从而得出是否有对应的物理地址,找到后CPU就会给主存发送请求,告诉主存需要的物理地址

3.主存会把内存的内容通过总线传给CPU,随后CPU继续执行指令

地址安全检查

操作系统需要设置逻辑地址空间的基址和界限:

操作系统首先要确保每一个程序它可以有效访问的地址空间,即起始地址和长度,因此得到哪块区域是可以合法访问的;

一旦CPU需要执行指令时,操作系统会查找map,map会指出逻辑地址是否满足区域的限制,满足限制就会得到物理地址的位置,否则CPU就会产生内存访问异常。

连续内存分配

当一个程序准许运行在内存中时,分配一个连续的区间;

分配一个连续的内存空间给运行的程序以此访问数据。

内存碎片问题

内存碎片问题指的是空闲的内存无法被利用的情况,内存碎片问题需要有效的避免。

内存碎片又分为外部碎片和内部碎片:

外部碎片 : 分配单元间的未使用内存

内部碎片 : 分配单元内的未使用内存

分区的动态分配

简单的内存管理方法,分区的动态分配方式有以下三种 :

第一匹配分配

为了分配n字节,使用第一个可用空闲块以致块的尺寸比n大,即在内存中找到第一个比需求大的空闲块, 分配给应用程序基本原理和实现方法:重按地址排序的空闲块列表,分配需要寻找一个合适的分区,重分配需要检查,看是否自由分区能合并于相邻的空闲分区。

优势:简单;易于产生更大空闲块、想着地址空间的结尾。

劣势:容易产生外部碎片,不确定性大。

最优适配分配

为了分配n字节,使用最小的可用空闲块,以致块的尺寸比n大,即在内存中找到最小的空闲块, 分配给应用程序。

基本原理和实现方法:为了避免分割大空闲块,为了最小化外部碎片产生的尺寸。需要按照尺寸排列的空闲块列表,分配需要寻找一个合适的分区,重分配需要搜索和合并于相邻的空闲分块(若有)。

优势:当大部分分配时小尺寸时非常有效,比较简单。

劣势:外部碎片产生,重分配慢,以产生很多没用的微小碎片。

最差适配分配

为了分配n字节,使用最大可用空闲块,以致快的尺寸比n大,即在内存中找到最大的空闲块, 分配给应用程序。

基本原理和实现方法:为了避免有太多微小的碎片;按尺寸排列的空闲块列表,分配很快(获得最大的分区),重分配需要合并于相邻的空闲分区,若有,需要调整空闲块列表。

优势:假如分配是中等尺寸效果最好。

劣势:重新分配慢,产生外部碎片,易于破碎大的空闲块以致大分区无法被分配。

以上三种分配算法,并没有最好的一种的说法,根据需求不同,算法适配不同,因此三者都不能满足同时满足需求。

碎片整理方法

压缩式碎片整理

重置程序来合并孔洞,要求所有程序是动态可重置的。

注意:当程序处于等待时进行重置,同时需要考虑开销。

交换式碎片整理

运行程序需要更多的内存,抢占等待的程序并回收他们的内存。

注意:需要考虑什么时候进行程序交换


非连续内存管理

何为非连续内存管理?

连续内存存在分配的缺点:分配给一个程序的物理内存是连续的;内存利用率较低以及有外碎片和内碎片的问题。而非连续内存分配管理可以来改善连续分配的问题。

非连续内存管理的优缺点

优势:

一个程序的物理内存是非连续的;

更好的内存利用和管理;

允许共享代码和数据;

支持动态加载和动态链接。

劣势:

建立虚拟地址和物理地址的转换难度大,因此有软件方案和硬件方案。

硬件方案:分段和分页。

软件方案:虚拟内存

分段

分段的逻辑视图

段访问机制

段 : 一个段相当于一个内存“块”,即一个逻辑地址空间。在程序中会有来自不同文件的函数 ; 在程序执行时, 不同的数据也有不同的字段, 比如 : 堆 / 栈 / .bss / .data 等

图片:从左至右是硬件实现方案

分段寻址方案

逻辑地址空间连续,但是物理地址空间不连续,使用映射机制进行关联

程序访问内存地址需要:一个二维的元组(s,addr),即一个段号(S)和段内偏移(addr)

操作系统:操作系统建立并维护一张段表, 存储(段号, 物理地址中的起始地址, 长度限制)

物理地址 : 段表中的起始地址 + 二元组中的偏移地址

分页

分页地址空间

1.划分物理内存至固定大小的帧(物理页)。大小是2的幂

2.划分逻辑地址空间至相同大小页(逻辑页)。大小是2的幂

3.建立方案:转换逻辑地址为物理地址。需要页表和MMU/TLB

帧(frame)

物理内存被分割为大小相等的帧。

一个内存物理地址是一个二元组(f,o),f代表页帧号,o代表帧内偏移(S位)。

物理地址=2S*f+o

eg:16-bit的地址空间,9-bit(512byte)大小的页帧物理地址(3,6)

物理地址=(3,6)

物理地址=1542

页(page)

一个程序的逻辑地址空间被划分为大侠相等的页。

页内偏移的大小=帧内偏移的大小

一个逻辑地址是一个二元组(p,o):

p:页号(P位,2p个页)

o:页内偏移(S位,每页有2s字节)

页寻址机制

程序运行的时候,CPU会寻址(逻辑地址以及虚拟地址),CPU通过(p,o)以及页表来寻找帧号和帧内偏移,随后帧号和帧内偏移得到物理地址。

因此,我们可以得到页寻址机制:

1.页映射到帧

2.页是连续的虚拟内存

3.真是非连续的物理内存

4.不是所有的页都有对应的帧

页表

每个运行的程序都有一个页表。页表类似于一个数组的对应关系,页表的索引是页号,对应的页表项的内容是帧号。

属于程序运行状态,页表会动态变化

地址转换实例

 

内存空间的大小:逻辑地址空间(16bit即64kb),物理内存空间(32kb

页内的偏移和页帧的偏移一致,页、帧大小一样;

40:页号4,页内偏移:0

31023:页号3,页内偏移:1023

红色的01

0代表物理页帧在物理内存中不存在,CPU访问到0会产生异常。

1代表物理页帧在物理内存中存在,对应的页帧号位00100即为4,因此映射出来页号对应帧号是4,帧偏移和页偏移一致为1023.

分页机制存在的问题

1.空间代价问题

2.时间的开销问题,访问一个内存单元需要2次内存访问,一次用于获取页表项,一次用于访问数据

3.页表可能非常大,64位机器(2^64)如果每页1024字节,会需要2^54大小的页表

解决方法:

1.建立缓存(caching),把最常用的程序和内容缓存到接近CPU的地方

2.通过间接访问的方式

3.为了让页表的内存空间尽量小,我们可以通过多级多层页表来解决此问题。

TLB(Translation Look-aside Buffer)

TLB位于CPU内部(MMU里),是一种缓存(cache),它的内容是一个键值对,keyp页号和f帧号,得到f,因为页偏移和帧偏移一致,就可以得到物理内存地址。

TLB使用关联内存实现,具备快速访问性能。

如果TLB命中,物理页号可以很快备货区;未命中对应的表项,回到页表里面去查找f,随后通过(CPU或软件,具体看系统版本)执行会被更新到TLB中。

图示如下:

二级页表

二级列表:即拆分为了一级页表和二级页表。对于它的寻址过程,首先会找一级页表,将p(页号)作为index

查找一级页面对应的页表项,这个值是二级列表的起始地址,形成一个在二级页表对于P2的页表项,对应二级页表映射的帧号,随后根据页内偏移o可以得到物理内存地址。

如果映射关系不存在,就没必要再页表中存放,以此节省了空间。

多级页表

多级页表:通过把页号分位k个部分,来实现多级间接页表。

反向页表

反向页表:不是让页表与逻辑地址的大小相对应,而是让页表与物理地址空间的大小相对应,即通过帧号f来查找逻辑地址里面的p页号。

页寄存器方案的权衡

基于关联内存的方案

key:页号,value:帧号

此方案同时也存在开销过大的问题,技术复杂。

基于哈希查找方案

输入的是:页号+pid,中间通过哈希函数,输出的帧号。

在反向页表中通过哈希算法来搜索一个页对应的帧号

1.对页号做哈希计算, 为了在帧表中获取对应的帧号

2.页 i 被放置在表 f(i) 位置, 其中 f 是设定的哈希函数

3.为了查找页 i , 执行下列操作 :

计算哈希函数 f(i) 并且使用它作为页寄存器表的索引, 获取对应的页寄存器

检查寄存器标签是否包含 i, 如果包含, 则代表成功, 否则失败

分页和分段的区别

1.目的的区别

页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。分页是出于系统管理的需要而不是用户需要。

段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了更好地满足用户的需要。

2.长度的区别

页的大小固定而且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面。

段的长度不固定,决定于用户所编写的程序,通常由编译程序在对程序进行编译时,根据信息的性质来划分。

即分段时段的尺寸可以改变,而分页时的页增是不变的。

3.地址空间

页的地址空间是一维的,即单一的线形地址空间,程序员只要利用一个记忆符就可以表示一个地址。

作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名,又需给出段内地址

4.碎片的区别

分页有内部碎片无外部碎片;分段有外部碎片无内部碎片

5.绝对地址

处理器使用页号和偏移量计算绝对地址;处理器使用段号和偏移量计算绝对地址

6.管理方式

对于分页,操作系统必须为每个进程维护一个页表,以说明每个页对应的的页框。当进程运行时,它的所有页都必须在内存中,除非使用覆盖技术或虚拟技术,另外操作系统需要维护一个空闲页框列表。

对于分段,操作系统必须为每个进程维护一个段表,以说明每个段的加载地址和长度。当进程运行时,它的所有短都必须在内存中,除非使用覆盖技术或虚拟技术,另外操作系统需要维护一个内存中的空闲的空洞列表。

特别的,当使用虚拟技术是,把一页或一段写入内存时可能需要把一页或几个段写入磁盘。

7.共享和动态链接

分页不容易实现,分段容易实现

此处参考https://blog.csdn.net/zhongyangtony

创作不易,客官点个赞,评论一下吧!超超和你一起加油❤?  

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119372.html

相关文章

  • 我的阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0
  • MySQL索引

    摘要:索引的本质官方对索引的定义为索引是帮助高效获取数据的数据结构。这些数据结构以某种方式引用指向数据,这样就可以在这些数据结构上实现高级的查找算法。的查询效率更加稳定由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。 1.索引的本质 Mysql 官方对索引的定义为:索引(Index)是帮助Mysql高效获取数据的数据结构。从中可以得出索引的本质:索引说白了就是一种数据...

    junbaor 评论0 收藏0
  • 2021年8月国产数据库大事记

    摘要:本文整理了年月国产数据库大事件和重要产品发布消息。柏睿数据库加速安全卡面向全球重磅发布。月日,在全球数字经济大会成果发布会上,中国移动北京分公司与国产数据库领域新锐企业柏睿数据签署战略合作协议。本次大赛主要面向全国爱好数据库的高校学生。 本文整理了2021年8月国产数据库大事件和重要产品发布消息。目录8月国产数据库大事记TOP108月国产数据库大事记时间线产品/版本发布兼容认证8月排行榜新增...

    Scorpion 评论0 收藏0
  • 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别

    摘要:的选择器允许单个线程监视多个输入通道。一旦执行的线程已经超过读取代码中的某个数据片段,该线程就不会在数据中向后移动通常不会。 1、引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典IO(也就是常说的阻塞式IO)的API时,很快就会发现一个问题:我什么时候应该使用经典IO,什么时候应该使用NIO? 在本文中,将尝试用简明扼要的文字,阐明Java NIO和经典IO之...

    Meils 评论0 收藏0
  • JAVA GC 原理详解

    摘要:虚拟机栈区也就是通常所说的栈区,它描述的是方法执行的内存模型,每个方法被执行的时候都创建一个栈帧,用于存储局部变量表操作数栈动态链接方法出口等。每个方法被调用到完成,相当于一个栈帧在虚拟机栈中从入栈到出栈的过程。 大多数情况下我们对GC的了解都只是浅层含义上的,下面我们来详细讲解下内部的一些实现原理。讲解GC之前,我们得先了解下JVM的内存结构,才能让我们理解GC导致是干嘛的。 一.J...

    wangjuntytl 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<