读核日记(七) --linux的内存管理机制(1)

原创 2004年08月18日 16:37:00
本文出自:http://os.silversand.net 作者: sunmoon (2001-09-01 13:05:00)

内存管理是一个操作系统必不可少.并且.非常重要的一环.linux的成功.和它优秀的内存管理联系非常密切.因为一个系统的高效性欲稳定性往往决定于它的内存管理机制.我项很多人吃过dos640k 的苦吧.

前面我们介绍了386保护模式.从今天起我们将在此基础上,分析linux的虚拟存储管理,对每个程序员来说.他们都希望有无穷大的快速的内存,然而,现阶段是不可能的,况且,无穷大与快速本身就可能矛盾

为了解决无穷大

.linux 引入了虚拟存储系统,为了解决快速,linux 引入了cache ,交换机制等等,以使的存储系统,在容量上接近硬盘,速度上接近cache.(当然,我认为这是存储系统的实际目的).

Linux

的内存管理采取的是分页机制.它的设计目的是分时多任务.linux 可同时处理256个任务(这应该与某个变量来定义,一时想不起来).同时它采用了两级饱和机制来分别内核进程与用户进程.

386 保护模式的0-4G 的线性虚拟地址中,3-4G 是留给内核进程的.0-3G分给用户进程.内核在内核空间的寻址不同于用户进程在用户空间的寻址.因为内核是在启动时装入内存的.说以它可以直接吧地址映射到3G 以上.用户若想访问内核就不许通过swapper_pg_div 中的指针来得到页表.

相反

,用户进程,在用户空间的寻址是通过所用户页目录中的指针得到用户的页表.并通过页表的指针直接指向相应的物理内存.

Linux

虚拟内存的实现,需要几种不同的机制来实现:

地址映射机制

内存的分配与回收

请页机制

交换机制

内存共享机制

在具体的读源码之前

.我们先根据我们以前学过的操作系统知识.C语言等知识.来考虑一下,这几个机制如何实现.现自己设计一下.在看别人是怎样实现的.找到自己想不到.或者对效率空间有损的地方.这样才有进步.我不止一次的说.操作系统的某一部分,就起实现来说,非常简单.它的难点是如何将大量的功能集成出一个kernerl.

地址映射机制

,说白了,就是在虚拟内存与物理内存上的一个桥梁.它要做的事情可能就是通过几个不同的表.把虚拟地址转换成物理地址,把物理地址转化虚拟地址.

我们以前说过

.因为有系统与用户之分,它必须也要有不同的数据结构.为了解决速度等问题.它会有一个硬件的缓冲区

对于它的数据结构

.我们可以先想一下.如虚拟地址的信息,虚拟地址在那个区域等等

至于请页机制

,更好理解.因为linux是页式存储的.因此必然会存在空白页和使用页.既然是页.就必然会存在页溢出.页无效(是不是在win98 下经常出现类似错误,当然linux的内存管理不可能和windows一样,可基本道理相同).因此.在每一个页出错.或者该页存不下多余的数据时.就要要求内核分配新的页面

同时

.当时用fork() 产生一个新的进程时.也需要分配新的叶面.这一部分大概讲的就是进程如何向内和描述自己需要怎么样的和多少页

在我们学习

<<数据结构>>是我们学了,很多内存分配方式,如首次拟和.最佳拟和,最差拟和等等.但是我们可以想象.linux 大概不会用他们.那就一定是伙伴系统了.因此我们可以对于伙伴系统的分配,回收的基本算法.回想一下.这样在读者一部分源码时,回有意象不到的收获.

至于交换机制

.我们也可以现想一想.内存中总与很多使用者的页.如果这些也已经把所有的页都用完了.再分配时必须把其中的某些页释放.释放那些页,需要考虑.如最近不用页.近期少用页,等等都可以在考虑之中.

这个算法

,大概就是计算内存中使用的页,什么时候可以换处.说白了就是为所有的使用页计算一个”,而这个就决定了他什么时候被释放以换如它的内容.需要想的是对于经常使用的页.可以把它放入cahe.(尽管这一部分对程序员是透明的,但我们应该理解他的原理).

最后的一部分共享内存

,我想和我门初学linux编程时,进程通讯里面的共享内存没有区别.大概也就是在它的数据结构中加入可以允许不同进程访问的tag 就行了.

以上

,只是我们对linux的内存管理机制的猜测,需要我们做的工作就是具体的读源码.更正不正确的猜想.同时学习别人的实际思路.

从下篇日记开始

.我们将分别讲解这几部分的实现

Linux内核源码分析--内存管理(一、分页机制)

最开始的地方是在head汇编中,如果看boot中那三个汇编的应该记得(那三个汇编还是比较重要的)。首先是分页机制,在CR0的第31位(PG位)置1表示开启分页机制,顺便也介绍下其他几个控制寄存器:CR...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015年01月22日 16:30
  • 2464

Linux内存中Swap机制

Linux内存中Swap机制先来看看这个 free -m total used free shared buffers ca...
  • qq_25189001
  • qq_25189001
  • 2016年05月05日 18:07
  • 1104

Linux 2.x 内核对内存的管理

Linux 2.x 内核对内存的管理 其着重点在于分页,用分页的机制把进程间的虚拟地址分隔开来。 每个进程都有一套页表,整个系统有一张GDT表(此机制由逻辑地址到线性地址变换,实际上是走了个形式...
  • yang_yulei
  • yang_yulei
  • 2014年04月24日 23:44
  • 2947

linux的内存管理机制(1)

内存管理是一个操作系统必不可少.并且.非常重要的一环.linux的成功.和它优秀的内存管理联系非常密切.因为一个系统的高效性欲稳定性往往决定于它的内存管理机制.我项很多人吃过dos下640k 的苦吧...
  • sunstars2009918
  • sunstars2009918
  • 2012年02月26日 11:22
  • 671

Linux内存管理机制文档

  • 2008年10月31日 13:07
  • 471KB
  • 下载

初窥Cocos2d-x内存管理机制(1)

Cocos2d-x版本:cocos2d-2.1rc0-x-2.1.3 windows下测试。 VS版本:VS2010. .在Cocos2d内存管理中使用的引用计数机制,每个对象都包含一个用来控制...
  • shinhwalin
  • shinhwalin
  • 2014年03月26日 18:12
  • 1061

C#的数据类型以及内存管理机制剖析(1)

尽管C#(事实上是基于.Net Framework的所有语言)自动处理了内存的分配和释放的问题,并且引入了垃圾收集机制,有完善的数据类型管理能力。但是对于很多情况下,了解其深层的机制是非常有用的,能够...
  • csndcsndwei
  • csndcsndwei
  • 2012年05月02日 21:52
  • 258

1、Cocos2d-x读书笔记( 基础讲解,以及内存管理机制)

Cocos2d-x高级开发教程读书笔记 Boost库引入的智能指针 内存管理机制:第2章   就比如一直计算鱼运动过程中的角度,可以写一个函数。 通过CallFunc与CCRepeatForever实...
  • xuxianmei
  • xuxianmei
  • 2013年11月24日 11:23
  • 1224

深入理解JAVA虚拟机——总结1:自动内存管理机制

JAVA虚拟机管理的内存 包含虚拟机数据区分区、内存分配和垃圾回收机制等
  • LL1256
  • LL1256
  • 2016年11月23日 16:23
  • 407

内存管理机制 Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误

iOS5之后苹果公司引入了ARC机制,大大方便了ios开发者对内存的管理机制。在iphone 4出世的时候为什么ios在512M的内存中可以运行很大的游戏,保持畅快流畅的状态。得益于ios非常好的内存...
  • LiChang719
  • LiChang719
  • 2015年06月24日 11:33
  • 15169
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读核日记(七) --linux的内存管理机制(1)
举报原因:
原因补充:

(最多只允许输入30个字)