ITPub博客

首页 > Linux操作系统 > Linux操作系统 > perfessional linux kernel archticture 学习笔记5

perfessional linux kernel archticture 学习笔记5

原创 Linux操作系统 作者:spurray 时间:2009-05-14 09:36:15 0 删除 编辑

与CPU的相互作用
        IA-32体系结构使用2级表映射虚拟地址和物理地址,64位体系结构(Alpha,Space64,IA-64,等等)采用3级或是4级表,内核中与体系结构无关的部分总是采用4级页表。
        内核中体系结构相关的实现2-3级CPUs的代码必须通过虚拟页表来模仿没有的级别,因此,保证能够在内存管理代码独立实现。
(注:通过虚拟页表来完成级别不同代码之间的通用)
内存映射
        内存映射是一个重要的提取方法,他们在内核的许多地方使用,也可用于用户的应用程序。映射是这样的一种方法,通过它任意资源的数据能够传输到进程的虚拟地址空间,映射的地址空间与能够像普通内存一样使用。但是,任何在其上的修改将会自动的传输到原始数据。这个特性可以让他使用同样的函数处理完全不同的事情。例如,文件内容可以映射到内存,一个进程只是需要读取内存内容来访问文件内容,或是改变内存内容以修改文件内容,内核自动确认对文件的任何改动。

        当实现设备驱动时,映射也可在内核中直接使用,外围设备的输出输入域能够被映射到虚拟地址空间,读写这些域被系统重定向到设备,因此能够极大简化驱动的实现。

1.3.5 物理内存的分配
        内核分配内存时,它必须记录那些页已经被分配,那些页是空闲,以保证不会让两个进程使用同样的内存区域。由于内存的释放和分配非常频繁,所以内核必须保证他们尽可能快的完成。内核仅仅能够分配整个页帧,如果需要分配的更小这需要用户空间的标准库来完成。这些库把内核分配的页帧细分成更小的区域分配给进程。

伙伴系统
        内核中许多分配请求要求一个连续的页,为了迅速的检测内存中哪里有这样的区域满足要求,内核采用了一个古老的,但是行之有效的技术:伙伴系统。
        内存的空闲块总是被分成2个伙伴组,这两个伙伴能够相互独立的分配,然而,如果同一时间都没有被使用,内核将合并它们成为一个更大的下一级伙伴,图1-8 用一个8页的伙伴对作为一个例子来示范伙伴系统。
 
          所同尺寸伙伴(1,2,4,8,16,... 页)由内核用一个特殊的队列管理。
        如果系统需要8页的帧,系统将吧16页的帧划分为两个伙伴,其中的一个分配给应用程序使用,剩下的8页帧将放在8页内存块的队列中。
        如果下次请求只需要2个持续页帧,8页的帧将被划分为2个伙伴,每个4页,一个将放回4页的伙伴队列,另一个将细分成2个2页的伙伴,一个返回伙伴系统,另一个将给应用程序
        当应用程序释放这些内存,内核能够很容易通过地址决定伙伴对是否需要重组,把它们合并成更大的单元,放到相应的队列中,这过程正好和划分过程相反,这使得有更大几率满足大内存块的需求。
        当系统运行了很长时间,系统运行数个星期乃至数个月是很常见的,许多桌面系统也试图达到这个目标。碎片(fragmentation)这个内存管理问题将会发生。频繁的分配和释放页帧导致这也得一个状态,虽然有空闲的页帧在系统中,但是他们分散在整个物理地址空间。换句话说,没有足够大的连续页帧块满足执行请求,伙伴系统能够有效地减少这种状况,但是并不能完全消除它,单独保留的页在位于一个不同的大块持续页范围中间能够有效消除这范围的结合。在内核2.6.24中,一些有效地措施被用来防止内存碎片,我将在第三章讨论跟多的细节。

Slab高速缓存
        内核自身需要的内存块经常要小于整个页帧,因为内核不能使用标准库的函数,所以它必须定义自己的附加的层用来进行内存管理,建立伙伴系统,通过伙伴系统划分更小的内存单元,这个方法不仅能够执行分配而且也能够实现一个普通的频繁使用小对象的高速缓存;这个高速缓存被称之为slab cache,它在一下两个方面用到:
        1. 对于频繁使用的对象(object),内核定义自己的高速缓存,它仅仅包含希望类型的实例,每一次一个对象被请求,他能偶迅速的从高速缓存中分配出,用完后返回;slab高速缓存自动的小心的和伙伴系统进行交互,当满了的时候请求新的页帧。
        2.对较小的内存块的普通分配,内核定义一系列的slab高速缓存对应于他能访问的各种对象尺寸通过同样的函数,一个前缀k按时这些函数和内核相关联:kmalloc 和 kfree。
        Slab分配方法提供了一个良好的执行在大范围的工作量上,因为Slab,一些可测量性问题出现在大的超级计算机上,这个可测量的另一面,对于实际小的嵌入式系统,slab的开销可能太大,内核采用两个不预先通知的方法取代slab分配器,但是提供同样的接口给内核的剩余部分,这个部分不需要了解哪个低级的分配器被编译进来,由于slab分配器仍然是内核的标准方法,因此我将不讨论这些改变的细节,图1-9总结了伙伴系统,slab分配器和内核的剩余部分的关联。

1-8.JPG

1-9.JPG

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12366772/viewspace-598111/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-04-20

  • 博文量
    6
  • 访问量
    4436