| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 操作系统连续内存分配和非连续内存分配 -> 正文阅读 |
|
[系统运维]操作系统连续内存分配和非连续内存分配 |
目录 一、连续内存分配1、内存碎片问题内存碎片指的是空闲内存不能被利用。内存碎片又分外部碎片和内部碎片,外部碎片是指在分配单元之间的未使用内存,而内部碎片是指在分配单元中的未使用内存。 2、分区的动态分配分区的动态分配就是简单的内存管理方法,当一个程序准许运行在内存中时,就会给这个程序分配一个连续的区间,当一个程序需要更多的空间时,也会分配一个连续的内存区间给运行的程序以访问数据。 3、连续内存分配策略一、首次适配 首次适配就是当一个程序需要分配n字节大小的空间时,使用第一个比n大的可用空闲块 优点:简单,易于产生更大的空闲块 缺点:容易产生外碎片 二、最优适配 最优适配就是当一个程序需要分配n字节大小的空间时,使用比n大的最小的可用空闲块 优点:当大部分分配是小尺寸时,非常有效,避免分割大空闲块,比较简单 缺点:容易产生外碎片和很多没用的微小碎片 三、最差适配 最差适配就是当一个程序需要分配n字节大小的空间时,使用比n大的最大的可用空闲块 优点:如果分配是中等尺寸效果最好 缺点:重分配慢,易产生外碎片,容易破坏大的空闲块以致大分区无法被分配 四、压缩式碎片整理 如下图,目前有四个程序占据着内存空间,当现在有一个需要5个块空间大小的程序也要运行,而如果采用上述三种连续分配策略,显然是无法做到的,因为内存中已经不具有连续的5个块大小的空间,但是我们发现,内存中有着5个不连续的块空间,如果对P1,P2,P3,P4四个程序进行压缩,那么我们将得到一个连续的5个大小的块空间,而这正好能够满足了另一个程序的需求,这就是压缩式碎片整理的思路。 压缩式碎片整理要注意几点,要求所有程序是动态可重置的,当程序在运行的时候,肯定是不能重置的。如果不停的对程序进行压缩,重置,会导致开销很大。 五、交换式碎片整理 程序P1、P2、P3、P4都处于内存中,P1、P2、P4处于等待状态,P3处于运行状态,当P3运行到某时刻还需要3个内存块的空间大小,而这时内存空间已经满了,不能够给P3分配更多的空间了,就可以采用交换式碎片整理的方法,可以把P4这个程序放到磁盘上去,也就是虚拟内存上,这样主存就可以提供3个内存块的空间供P3使用,虽然P4放到了磁盘中,但是它的数据并没有丢失,也是保存在磁盘中。 二、非连续内存分配1、优缺点优点:一个程序的物理地址空间是非连续的,可以使用非连续内存分配;更好的内存利用和管理; 允许共享代码与数据;支持动态加载和动态链接 缺点:建立虚拟地址和物理地址之间的转换,开销很大,所以要和硬件结合一起来管理 2、分段程序的分段地址空间,把程序的逻辑地址空间分散到多个物理地址空间。 ?一、分段寻址方案 首先段访问机制有两种,一种是段寄存器+地址寄存器实现方案,另一种是单地址实现方案。 应用程序的逻辑地址空间是一个连续的地址空间,通过分段有效的隔离开来,程序可以把它的堆栈段分离开来,放到某一特定的地址,这样能更有效的进行管理和分配,同时也能够让这种有效的保护机制的实现。如下图,左边是一些连续的逻辑地址,右边是一些非连续的物理地址,逻辑地址有段号和段偏移,程序访问内存地址需要段号和段偏移,段表里的内容是段的起始地址和段的长度限制,而段的起始地址又包括逻辑地址段号和对应的物理地址段号,段的长度限制就是段偏移。每次寻址时,先在段表里查询逻辑地址段号对应的物理地址段号,然后再加上段的长度限制,就可以得到了物理地址。 ? 3、分页一个程序的逻辑地址空间被划分为大小相等的页,而物理内存被分割为大小相等的帧,页帧包括页帧号和帧内偏移。 一、页寻址机制 页寻址机制就是页映射到帧,页是连续的虚拟内存,帧是非连续的物理内存,不是所有的页都有对应的帧。页表保存了逻辑地址和物理地址之间的映射关系,页表的索引是页号,所对应的内容是帧号。操作系统建立了页表,页表里有个驻留位,0表示没有这个页帧映射,1表示会有这个页帧映射。 性能问题:页表可能非常大,因为一个程序就需要一个页表;访问一个内存单元需要两次访问内存,一次用于获取页表项,一次用于访问数据。 如何处理这些性能问题? 通过缓存,把页表放到离CPU比较近的地方,或者通过间接访问。具体点从速度上解决,就是把经常访问内存地址的页帧映射存放到CPU中的TLB表中。从空间上解决就是采用多级页表。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 12:20:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |