关闭

内存管理

846人阅读 评论(0) 收藏 举报
分类:

要谈内存管理,就不得不先说说存储器,因为内存也是存储器中的一种。

存储器

存储器是计算机系统的重要组成部分,计算机中的存储器结构如下:


 

CPU寄存器访问速度最快,完全能与CPU协调工作,但由于价格昂贵,其容量很小,它的作用在于加速存储器的访问速度。

cache是高速缓存,其容量大于寄存器,小于主存,访问速度快于主存。将主存中的一些经常访问的信息存放到高速缓存中,减少访问主存储器的次数,可以大幅度提高程序的执行速度。

主存就是我们常说的内存,用于保存进程运行时的程序和数据。

内存管理就是管理主存,操作系统必须将内存空间进行合理地划分和有效地动态分配,来提高内存利用率。

在进行具体的内存管理之前,我们首先要了解进程运行的基本原理。

程序的装入和链接

要使程序运行,必须先为之创建进程,而创建进程的第一件事情就是将程序和数据装入内存。将用户程序变为可以在内存中执行的程序,需要经过一下几个步骤:

1.  编译:由编译程序将用户源代码编译成若干个目标模块。

2.  链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。

3.  装入:由装入程序将装入模块装入内存运行。

步骤如下图:


内存分配

 

内存的分配分为连续分配方式和非连续分配方式。

连续分配方式,是指为一个用户程序分配一个连续的内存空间。它主要包括单一连续分配、固定分区分配和动态分区分配。

非连续分配允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式,分段存储管理方式和段页式存储管理方式。

下面我们会介绍每一种内存分配方式。

单一连续分配

内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。

这种方式的优点是简单、无外部碎片,可以釆用覆盖技术,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。

 

固定分区分配

固定分区分配将用户内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中,选择适当大小的作业装入该分区,如此循环。

该方式无外部碎片,但不能实现多进程共享一个主存区,所以存储空间利用率低。固定分区分配很少用于现在通用的操作系统中,但在某些用于控制多个相同对象的控制系统中仍发挥着一定的作用。

动态分区分配

动态分区分配是一种动态划分内存的好方法,这种分区不预先将内存划分,而是在进程装入内存时,根据进程的大小动态的分区,并使分区的大小正好适合进程的需要。

动态分区在开始分配时是很好的,但是之后会导致内存中出现许多小的内存块。随着时间的推移,内存中会产生越来越多的碎片。

 

好啦,连续分配方式说完了,接下来是非连续分配方式了。

基本分页存储管理

固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低。我们希望内存的使用能尽量避免碎片的产生,这就引入了分页的思想:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。

分页的方法从形式上看,像分区相等的固定分区技术,分页管理不会产生外部碎片。但它又有本质的不同点:块的大小相对分区要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用空间并执行。这样,进程只会在为最后一个不完整的块申请一个主存块空间时,才产生主存碎片,所以尽管会产生内部碎片,但是这种碎片相对于进程来说也是很小的。

 

前面所说的块,在进程中就称为页。为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般存放在内存中。

在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。如下图:


基本分段存储管理

分页管理方式是从计算机的角度考虑设计的,以提高内存的利用率,提升计算机的性能, 且分页通过硬件机制实现,对用户完全透明;而分段管理方式的提出则是考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长动态链接等多方面的需要。

 

在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。

例如,用户进程由主程序、两个子程序、栈和一段数据组成,于是可以把这个用户进程划分为5个段,每段从0 开始编址,并分配一段连续的地址空间(段内要求连续,段间不要求连续,因此整个作业的地址空间是二维的)。其逻辑地址由段号S与段内偏移量W两部分组成。

如下图所示,段号为16位,段内偏移量为16位,则一个作业最多可有216=65536个段,最大段长为64KB。


和分页存储管理中的页表一样,分段存储管理方式中也有段表,段表记录该段在内存中的起始地址和段的长度,段表用于实现从逻辑段到物理内存区的映射。如下图:


段页式存储管理

页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享。如果将这两种存储管理方法结合起来,就形成了段页式存储管理方式。

 

在段页式系统中,作业的地址空间首先被分成若干个逻辑段,每段都有自己的段号,然后再将每一段分成若干个大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干个和页面大小相同的存储块,对内存的分配以存储块为单位,如图






2
0
查看评论

Linux内存管理浅析(一)

1.Linux内存管理的主要内容 a.      虚拟内存管理 b.      内核空间内存管理 c.      ...
  • u012398362
  • u012398362
  • 2016-11-27 19:40
  • 977

Ruby的内存管理机制。

原文在此 http://www.theirishpenguin.com/2009/10/29/understanding-how-ruby-stores-objects-in-memory-the-ruby-heap.html 大体思想全部包含, 并非逐句翻译。 Ruby有自己的内存管理机制,叫...
  • ChenShaoXunHuan
  • ChenShaoXunHuan
  • 2015-03-03 11:20
  • 1342

Lua内存管理

Lua  要求用户给出一个内存管理函数,在 Lua创建虚拟机的时候传入。。  它利用 C 标准库中的函数实现了一个默认的内存管理器,这也可以帮助我们理解这个内存管理器的语义。  1: ...
  • liutianshx2012
  • liutianshx2012
  • 2015-01-19 17:00
  • 1352

C/C++内存管理之内存池

C++内存管理一直是我比较困惑的问题。俗话说初生牛犊不怕虎,做点啥都new一个,然后delete一个。根本不知道底层会有怎么样的运行机制,慢慢地学习才知道以前学习中有一些东西是不可能在工业中应用的。所以想开辟一个坑为C++的内存管理机制。也希望通过这篇能够对C++内存管理机制有一个更加深刻全新的认识...
  • bateerBATEER
  • bateerBATEER
  • 2017-03-28 21:38
  • 314

Unity动态加载和内存管理(三合一)。。。好强悍。。。

原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本...
  • ldghd
  • ldghd
  • 2012-10-14 12:46
  • 11834

Linux内存管理详解

前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪...
  • u010229420
  • u010229420
  • 2016-09-19 21:29
  • 633

内存管理——Xcode升级到8.0之后内存管理需要注意的事项

今天回顾复习一下内存管理的知识点,发现了一个不可思议的问题,拿出来和大家一起分享。 在之前我们总是认为是这样的: 引用计数的工作原理: 1.当我们创建(alloc)一个新对象A的时候,它的引用计数从零变为 1; 2.当有一个指针指向这个对象A,也就是某对象想通过引用保留(retain)该对象...
  • moqj_123
  • moqj_123
  • 2017-07-16 11:31
  • 341

ucos内存管理

为了消除碎片,ucosii连续的打开内存按分区来管理,每个分区包含有整数个大小相同的内存块 类似每个人物对应一个人物块,每个时间对应一个事件块,ucosii每个内存块也是对应一个内存块,内存控制块是一个暑假结构 typedef struct{    void *OSMemAddr...
  • nanjoh
  • nanjoh
  • 2017-01-12 17:16
  • 299

iOS 内存管理基本原则

我们知道objc中创建对象是存放在堆中的(基本数据类型除外,是由系统自己管理,并存放在栈中),系统不会自动释放堆中的内存。如果创建完的对象存放在堆中后并使用完没有得到及时的释放,会占用的内存。但是objc没有GC(垃圾回收机制),因此需要开发者手动管理内存。苹果公司共推出了3中内存管理机制:ARC(...
  • aaaa99996666
  • aaaa99996666
  • 2016-05-07 19:33
  • 1730

深入浅出Linux内核内存管理基础

1 背景知识 1.1 用户空间与内核空间内存的划分        从Linux操作系统层次上,内存可划分为用户空间内存和内核空间内存。        32位的CPU,最大寻址范围为...
  • acs713
  • acs713
  • 2015-01-18 16:45
  • 4179
    个人资料
    • 访问:312505次
    • 积分:4634
    • 等级:
    • 排名:第7502名
    • 原创:146篇
    • 转载:0篇
    • 译文:0篇
    • 评论:86条
    博客专栏