专业术语

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

:外存中固定长度的块。

:外存中可变长度的块。

内存管理需求

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

保护:每个进程应受保护,不被其他进程干扰。保护的实现是由处理器满足的,通过在指令访问内存时判断内存访问是否非法决定。如果由 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. 解题报告:Codeforces 279C Ladder

    Codeforces 279C Ladder 本题与tbw这篇博客上的题有相似思路.tbw的本来我还不会,抄了题解才过,这道题好歹自己磕半天磕出来了.到tbw做那道题我突然想明白了,再一想诶跟这里不是 ...

  2. [*]Quadratic Residual Networks: A New Class of Neural Networks for Solving Forward and Inverse Problems in Physics Involving PDEs

    Accepted by SIAM International Conference on Data Mining (SDM21) 本文提出了二次残差网络,通过在应用激活函数之前,添加二次残差项到输入的 ...

  3. Jquery 如何替换html字符串中标签属性值 ??

    如何利用JQuery 替换HTML字符串中的属性值呢? 如 html 字符串有很多 img标签,现在需要修改 img的src值 var html="<div style="t ...

  4. Java lombok包中的常用注解,便捷化开发POJO类

    lombok包中的一些常用注解 如何使用Lombok?Lombok提供注解方式来提高代码的简洁性,常用注解有:    @Data    @Setter @Getter    @NonNull    @ ...

  5. PHP 中的类-什么叫类

    在阐述类的概念之前我们来先说说面向对象编程的概念:面向对象的程序设计(Object-Oriented Programming,简记为OOP)立意于创建软件重用代码,具备更好地模拟现实世界环境的能力,这 ...

  6. KEIL5中C/C++优化等级问题

    知乎上有篇详解   https://zhuanlan.zhihu.com/p/24402180 强烈推荐 C/C++的优化等级会对程序产生 不定性的影响,至于选择哪种优化等级必须从 现有的程序分析才行 ...

  7. python获取主机内网中所有MAC地址

    import osimport subprocessimport socket"""python获取主机内网中所有MAC地址"""def g ...

  8. 基于ALSA库实现音频采集和播放遇到的问题

    最近基于Linux系统C语言实现音频的采集和播放,建立了两个子线程,一个通过调用snd_pcm_readi来实现采集数据,并存入FIFO中,另一个从FIFO中取数据并通过udp的sendto发送出去, ...

  9. 几个Shell脚本的例子

    [例子:001]判断输入为数字,字符或其他 #!/bin/bash read -p "Enter a number or string here:" input case $inp ...

  10. setState 更新

    同步逻辑中,setState异步更新,同步更新会合并为一次更新 异步逻辑中,setState同步更新 this.setState({ data:data,()=>{ } }) 在回调函数里面了解 ...