专业术语

页框:内存中固定长度的块。

:外存中固定长度的块。

:外存中可变长度的块。

内存管理需求

重定位:程序从内存换出到外存后,再换回内存时,在内存空间中的位置和原先的位置有极大可能不相同。此时需要保证程序的执行和之前一样,不因所在位置的不同变化。

保护:每个进程应受保护,不被其他进程干扰。保护的实现是由处理器满足的,通过在指令访问内存时判断内存访问是否非法决定。如果由 OS 实现,则将耗费大量的处理器时间。

共享:多个进程可以访问同一个特定的内存区域。

逻辑组织:OS 能够有效处理组织成模块的用户程序和数据。

物理组织:两级存储器(内存和外存)之间的数据移动由 OS 负责。

内存分区

固定分区:将内存分为固定大小的块的方式。固定分区分为两种方式,一种是等大小的分区方式,每一块分区的大小是相等的;另一种是大小不相等的分区方式,每一块的分区的大小不等。

等大小的固定分区

难点:程序的大小可能较大不能全部放入一个分区,需要放入多个分区;内存的利用率低。

内部碎片(internal fragmentation):固定分区中放入的数据块的大小小于固定分区的大小,导致分区内部空间浪费的现象。

不等大小的固定分区

将进程分配到能容纳该进程的最小分区中,使得内部碎片最小。为了实现该功能,需要为每种大小的分区设置一个队列,这个队列存放和这个分区匹配的处于非运行态的进程。

另一种方案是对于所有的不等大小分区,设置一个队列,根据具体的进程根据其大小分配最接近其大小的能容纳它的分区。

固定分片区的缺点

1.分区的数量在系统初始阶段已确定。

2.所需空间小的进程不能有效利用分区空间。

动态分区:分区的大小和数量都是可变的。当进程需要内存空间时,给其分配一个大小与之所需大小相同的分区。

外部碎片(external fragmentation):所有分区外的内存空间变得碎片化,内存的利用率下降的现象。

压缩(compaction):OS 不时移动进程,使得进程占有的内存空间连续,空闲空间也连续。缺点是浪费处理器时间。

当空闲空间有多个位置可以满足需要内存空间的进程时,有三种分配方式:(前提是都分配大于等于进程需要的大小的分区)

1.最佳适配:选择和继承所需大小最接近的块。一般情况下,此方式性能最差,很快就会产生很多的小碎片。

2.首次适配:从内存空间起始位置扫描,直到找到一个可以容纳进程的块分配给进程。一般情况下,此方式最好和最快。

3.下次适配(next-fit):将进程上次分配的内存空间所在位置为起始点开始扫描,直到找到满足其所需大小的块分配给进程。一般情况下,此方式会使得内存空间尾部产生很多小碎片。

伙伴系统(buddy system):最开始,整个可分配的内存空间作为一个块,当一个进程需要大小为 \(s\) 的内存空间时,将整个内存空间等分为两块,若划分后的块大小小于 \(s\),则将整个内存空间分配给该进程;若划分后的块大小大于等于 \(s\),则再次等分该块,直到划分的块大小大于等于 \(s\) 且最接近 \(s\) 时将该块分配给该进程。当有两个大小相等的相邻空闲块时,将其合并为同一块。该方案克服了固定分区和动态分区的缺点。

逻辑地址:当前内存中访问数据的和物理地址无关的地址,访问真实内存前需要将其转换成物理地址。

相对地址:逻辑地址的特例,一般情况下指相对于进程起始点的地址。

物理地址(绝对地址):数据在内存中的真实地址。

逻辑地址到物理地址的转换需要基址寄存器和界限寄存器等寄存器。一般情况下,基址寄存器存放当前进程的起始地址,逻辑地址通过使用基址寄存器中的数据运算得出物理地址;界限寄存器存放该进程运行访问的最大地址,将上一步运算得出的物理地址与之相比较,如果超出该地址,则向 OS 发出中断信号;否则,访问该物理地址执行操作。

分页

分页技术将内存空间分为等大小的块,这个块称为页框(frame),和固定分区相比而言,页框的大小比分区的大小小很多,同时页框的大小为 \(2^k\)。同时,每个进程划分成多个和页框等大小的页(page)。当进程需要内存空间时,将进程的多个页放入多个页框中。此时仅有最后一个页框会产生内部碎片。

OS 为每个进程维护一个页表,每项给出该进程的每页对应的页框位置。逻辑地址到物理地址的转换为:

1.从逻辑地址的最左侧的 n 位提取页号。

2.以这个页号查找页表中对应的页框号 k。

3.页框的起始物理位置为 \(k \times 2^m\),从逻辑地址的最右侧 m 位提取偏移量加上该起始物理地址得到真正的物理地址。

分段

分段是将程序和相关数据划分成长度不等的多个段,放入内存空间。每个进程有一个段表,记录每个段在内存空间中的起始位置。逻辑地址到物理地址的转换通过段表得到起始物理位置和本身已有的偏移量实现。

OSIDP-内存管理-07的更多相关文章

  1. C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  2. iOS Block 内存管理的探讨

    在很多情况下Block是造成程序循环引用内存泄漏的元凶.下面我们就讲解一下block对内存管理的影响.在讲解之前.希望大家对block有一定的了解.如果大家还不是太清楚block的实现原理.希望大家可 ...

  3. iOS中引用计数内存管理机制分析

    在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...

  4. SQL Server 2012 内存管理 (memory management) 改进

    SQL Server 2012 的内存管理和以前的版本相比,有以下的一些变化. 一.内存分配器的变化 SQL Server 2012以前的版本,比如SQL Server 2008 R2等, 有sing ...

  5. OC修饰词 - 内存管理

    <招聘一个靠谱的 iOS>—参考答案(上) 说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均 ...

  6. C++内存管理(超长,例子很详细,排版很好)

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  7. (转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

    http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟 ...

  8. C++内存管理(超长)

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  9. STL的内存管理

    SGI STL 的内存管理 http://www.cnblogs.com/sld666666/archive/2010/07/01/1769448.html 1. 好多废话 在分析完nginx的内存池 ...

  10. C++内存管理(转)

    C++内存管理 [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理 ...

随机推荐

  1. C语言 数据编码方式

    一.整形数据类型 1.无符号数的编码 无符号数指的是整个机器字长的全部位数均表示数值位. 我们用函数      来进行运算.(B2U是Binary to Unsigned的缩写,长度为w),x代表为0 ...

  2. SPI接口

    串行外设接口(Serial Peripheral Interface)是一种同步外设接口,它可以使单片机与各种外围设备以串行方式进行通信以交换信息.SPI最早是Motorola公司提出的全双工三线同步 ...

  3. 2022.11.13 NOIP2022 模拟赛八

    「ROI 2017 Day 2」存储器 无聊的题. 首先 \(s\) 中每一个片段,其在 \(t\) 中对应的字符必然是相同的. 对于 \(t\) 中的每一个片段,考虑检查能否操作出这个片段,实际上只 ...

  4. 访问修饰符 protected(s)

    protected 受保护的:可以在当前类的内部以及该类的子类中可以访问. using System; using System.Collections.Generic; using System.L ...

  5. vue项目element-ui组件打包后组件显示方框解决方式

    在 utils.js文件添加一句代码 publicPath:'../../',

  6. golang 指针

    一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前你需要声明指针. 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置.使用&字符放在变量前面对变量进行" ...

  7. 动态路由里,将component字符串改变为路由懒加载方法

    一.import写法 报错 function loadPageByRoutes(str) { // 传入的str为 '@/views/Home.vue' 这种格式 return () => im ...

  8. Docker之RabbitMQ保姆级别安装

    Docker之RabbitMQ保姆级别安装: 如果觉得样式不好:跳转即可 http://www.lifengying.site/(md文件复制过来有些样式会不一样) 学英语网站项目:自己先保证Redi ...

  9. jQuery 获取鼠标点击的元素ID

    $(function(){ $(document).click(function(e) { // 在页面任意位置点击而触发此事件 var v_id = $(e.target).attr('id'); ...

  10. Jmeter安装及环境配置

    Jmeter下载地址:http://jmeter.apache.org/download_jmeter.cgi 这里注意Source和Binaries两种下载分类 Source 是源代码版,你需要自己 ...