一文看懂Linux内核操作系统-内存分配

1.1计算机体系结构及内存分层体系

计算机体系结构/内存分层体系内容:

1)计算机系统结构

2)内存分层体系

3)在操作系统的内存管理范例

一、计算机系统结构主要包含了三大内容:

1、cpu:完成对整个程序的控制

2、内存:放置了程序的代码和管理的数据

3、外设:配合程序发挥更大的作用

一文看懂Linux内核操作系统-内存分配_第1张图片

二、内存的层次机构:cpu要访问的指令和数据所处的位置在什么地方

一文看懂Linux内核操作系统-内存分配_第2张图片

cpu寄存器,cache:都是处于cpu内部,速度很快,容量很少,可以放的数据有限

主存,物理内存:容量大,但是速度小

硬盘:需要永久保存的数据就放在硬盘中,掉电也不会丢失,速度更慢,但是容量更大

小编推荐自己的Linux内核技术交流群: 【977878001】

一文看懂Linux内核操作系统-内存分配_第3张图片

三、操作系统到底要完成的重点事情

一文看懂Linux内核操作系统-内存分配_第4张图片

1、可以抽象出来,只需要考虑连续的地址空间,而不需要考虑细节

2、保护进程空间,有一个隔离的机制,避免应用程序破坏别人

3、进程空间的通信,共享的空间,使数据的传递安全,有效的

4、让正在运行的程序,放在内存汇总,让暂时不需要的访问的数据可以临时的放在硬盘中。(例如p4)

四、两种不同的空间

主存硬盘的物理地址空间

运行程序锁看见的空间是逻辑地址空间

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

程序重定位,分段,分页,虚拟内存,按需分页虚拟内存

ps:其实现高度依赖于硬件,必须知道内存架构,MMU(内存管理单元):硬件组件负责处理cpu的内存访问请求。

1.2地址空间与地址生成

涉及到几点:

1)地址空间定义

2)地址生成

3)地址的安全检查

一、地址空间的定义

1、物理地址空间—与硬件直接对于(例如内存条所代表的主存)

2、逻辑地址空间—程序所看见的地址空间

一文看懂Linux内核操作系统-内存分配_第5张图片

像这条指令一样,其具体的映射关系,需要操作系统来处理的

二、逻辑地址生成

一文看懂Linux内核操作系统-内存分配_第6张图片

执行文件放在内存中去,还是一个逻辑的地址

三、完成逻辑地址到物理地址的映射过程

一文看懂Linux内核操作系统-内存分配_第7张图片

当cpu需要执行这条指令的过程如下:

1、ALU运算器需要这条指令的内容

2、cpu里面的mmu(内存管理单元)查找逻辑地址的映射表,找出逻辑地址和物理地址之间的映射

3、cpu控制器会从总线发送物理地址的内存内容的请求(就是指令的内容)

4、主存会把总线拿到的物理地址内存的内容传给cpu

其中,操作系统的作用是建立起逻辑地址和物理地址之间的映射。

四、地址的安全监测的过程

一文看懂Linux内核操作系统-内存分配_第8张图片

操作系统的另一个目标是放在内存中的程序相互之间不能互相的干扰

1、操作系统首先要确保每一个程序可以有效的访问地址空间。(包括起始地址和地址的长度)。

2、map会指出逻辑地址是否满足映射关系,然后就去到相应的物理地址,将指令数据取回来。

3、如果不满足,cpu将会产生一个memory异常(内存访问异常)

1..3连续内存的分配:内存碎片与分区的动态分配

连续内存分配所涉及的问题:

内存碎片问题

分区的动态分配(第一分配,最佳适配,最差适配)

压缩式碎片整理

交换式碎片整理

一、内存碎片问题

可以理解为当给一个运行的程序分配一个空间之后,会出现一些无法进一步利用的空间。

1.外部碎片:分配单元之间无法利用的空间

2.内部碎片:运行的程序无法对所分配好的空间进一步的使用

一文看懂Linux内核操作系统-内存分配_第9张图片

二、分区的动态分配

什么时候需要分配连续的内存:

1.当一个程序准许运行在内存中时候,需要在内存中分配一个连续的区间

2.分配一个连续的内存切间给运行的程序以访问数据

一文看懂Linux内核操作系统-内存分配_第10张图片

操作系统中会有一些数据结构和算法对空余的内存空间进行有效的管理。

以下有三个简单的内存分配的算法。

1、首次适配(first fit)

2、最优适配(best fit)

3、最差适配(worst fit)

以下分别做简单的介绍:

1、首次适配算法(first fit)–第一个内存块

一文看懂Linux内核操作系统-内存分配_第11张图片

基本原理和实现:

需求:

按地址排序的空闲块列表(从0地址开始),分配需要寻找一个合适的分区重分配需要检查,看是否自由分区能合并于相邻的空闲分区(若有)。

优点:

简单,并且容易产生更大的空闲块(没有被破坏),向这地址空间的结尾

缺点:

容易产生外碎片,两个空闲块的空间因为比较小,就可以不会被使用,并且随着时间这个特性会加剧。

2、最优适配算法(best fit)–最适合分配请求的size

一文看懂Linux内核操作系统-内存分配_第12张图片

基本原理和实现:

1)按尺寸排列空闲块列表

2)分配需要寻找一个合适的分区

3)重分配需要搜索及合并于相邻的空闲分区(若有)

优点:

对于大多数小内存分配的情况比较合适,比较简单。避免了分割大的空闲块,并且最小化外部碎片产生的尺寸

缺点:

将外碎片分配得比较细,重分配慢,而且容易产生很多没用的微小碎片(不怎么好)

3、最差适配算法(worst fit)—与请求差距最大的size分配

一文看懂Linux内核操作系统-内存分配_第13张图片

大块变成了小块,小块进行保留

基本原理和实现:

1)按差距的尺寸最大进行排列空闲块列表

2)分配很快(获得更大的分区)

3)重分配需要合并相邻的空间分区(若有),然后调整空闲块列表

优点:

假如分配是中等尺寸效果最好

缺点:

易于破坏大的空闲块以致于大分区无法被分配

小结:应用请求的需求是随机的和可变的,这些算法都不可能满足全部的应用请求的。

1.4连续内存分配:压缩式与交换式碎片整理

以下两种方法减少碎片的产生

1.压缩式碎片整理

2.交互式碎片整理

一、压缩式(compression)碎片整理

重置程序以合并孔洞

要求所有程序是动态可重置的

内存拷贝前思考两个问题:

1)什么时候考虑内存的重定位是合适的

当程序处于等待的状态之中可以开始内存的重定位

2)考虑开销大不大

仅仅利用软件的移动实现开销是很大的

一文看懂Linux内核操作系统-内存分配_第14张图片

二、交换式(swap)碎片整理

一文看懂Linux内核操作系统-内存分配_第15张图片

考虑几个问题

1)考虑将那一个程序拷贝到磁盘中去?

2)什么时候做这个换入和换出的操作?

3)换入换出的开销?

需要后续的知识补充

你可能感兴趣的:(linux,运维,服务器)