1、关于伙伴算法,下列说法正确的是(单选):(《深入理解linux内核》P303-P313)
A、伙伴算法会造成内部碎片
B、alloc_pages(gfp_mask, order)返回第一个所分配页框的线性地址
C、只要内存足够,可以使用伙伴算法分配任意大小的内存
D、称为伙伴的两个块要求大小相同,且物理地址是连续的
参考答案:D
试题分析:
满足下列条件的两个块称为伙伴系统:
1) 两个块具有相同的大小,记为b。
2) 它们的物理地址是连续的。
3) 第一块的第一个页框的物理地址是2*b*212的倍数。
伙伴算法会造成外部碎片问题,而SLAB/SLUB分配器造成内部碎片。
alloc_pages(gfp_mask, order)返回第一个所分配页框的描述符的线性地址。
伙伴算法采用页框作为基本内存单元,只能分配2order个页大小的内存,一般order最大为11。
2、关于SLAB分配器,下列说法正确的是(单选):(《深入理解linux内核》P323-P340)
A、SLAB分配器可以用于分配小于一个页框的小块内存,因此不会造成内存浪费
B、kfree将内存释放回伙伴系统
C、SLAB分配器包含多个slab,每个slab由一个或多个连续的页框组成,这些页框中既包括已分配的对象,也包括空闲的对象
D、SLAB分配器把对象分组放进高速缓存(由kmem_cache描述),每个高速缓存都是同种类型对象的一种“储备”。高速缓存分为普通和专用两种,它们都是使用kmem_cache_create()函数创建
参考答案:C
试题分析:
SLAB分配器用于分配小块内存,但不是任意大小的内存,其大小是2的幂,如需要50Byte内存,则SLAB分配器会分配64Byte,因此还是会造成浪费(内部碎片,但小于50%)。
SLAB分配器是基于伙伴系统,但kfree并不会直接将内存释放回伙伴系统,而是保留在SLAB分配器中并很快地重新使用它们。
专用高速缓存用kmem_cache_create()函数创建,可以存放task_struct/mm_struct等内核结构。普通高速缓存主要供kmalloc()函数使用,在系统初始化期间调用kmem_cache_init()和kmem_cache_sizes_init()来建立。
3、下列说法正确的有(多选):(http://blog.csdn.net/star143133/article/details/6890055)
A、vmalloc用于内核分配一块线性地址连续,但物理地址不一定连续的内存,vmalloc对可分配的最大内
存,没有明确的限制
B、bootmem用于在伙伴系统初始化之前,bootmem不属于伙伴系统管理
C、系统启动之后,可分配的最大连续物理内存由MAX_ORDER确定,如果需要大量连续的物理内存,可以在内核引导时预留:使用bootmem allocator分配或在Linux内核引导时,传入参数“mem=size”保留顶部的内存区间
参考答案:ABC
试题分析:
1) 可以在Linux内核引导过程中绕过伙伴系统来分配大块内存。使用方法是在Linux内核引导时,调用mem_init函数之前用alloc_bootmem函数申请指定大小的内存。如果需要在其他地方调用这块内存,可以将alloc_bootmem返回的内存首地址通过EXPORT_SYMBOL导出,然后就可以使用这块内存了。这种内存分配方式的缺点是,申请内存的代码必须在链接到内核中的代码里才能使用,因此必须重新编译内核,而且内存管理系统看不到这部分内存(bootmem伙伴系统不可见),需要用户自行管理。
2) 在Linux内核引导时,传入参数“mem=size”保留顶部的内存区间。比如系统有256MB内存,参数“mem=248M”会预留顶部的8MB内存,进入系统后可以调用ioremap(0xF800000,0x800000)来申请这段内存。
4、alloc_pages()分配页框时需要gfp_mask参数,它是一组标志,它指明了如何寻找空闲的页框,下列说法错误的是(单选):(《深入理解linux内核》P304-P306)
A、gfp_mask可以指明在哪个内存区分配内存,例如如果__GFP_DMA标志被置位,则只能从ZONE_DMA内存管理区获取页框
B、假设系统存在ZONE_NORMAL/ZONE_DMA32/ZONE_DMA区,如果gfp_mask没有置位__GFP_DMA和__GFP_HIGHMEM,则分配顺序为:DMA->DMA32->NORMAL
C、GFP_ATOMIC标志表示是一个原子内存分配请求,原子请求不会被阻塞,如果没有足够的空闲页,显示分配失败。为了尽量减少原子分配失败,内核保留了一个页框池,只有在内存不足时才使用
D、GFP_THISNODE指定在本节点分配,如果本节点内存不足则分配失败
参考答案:B
试题分析:
B分配次序应该是:NORMAL->DMA32->DMA.
5、关于SLAB和SLUB分配器,说法错误的是(单选):(《深入理解linux内核》P323-P340)
A、SLAB分配器使用free、partial、full三个队列管理slab,而SLUB分配器只有一个partial队列
B、SLAB/SLUB分配器为每个cpu维护per cpu cache,分配对象时优先从本地cpu cache中分配
C、SLAB分配器具有缓冲区重用的功能,当内核执行请求创建新的缓冲区 C2 时,SLAB 分配器会先搜索已创建的缓冲区,如果发现某缓冲区 C1 的对象大小略大于 C2,则重用 C1
D、SLUB分配器保留了SLAB分配器的所有API接口函数
参考答案:C
试题分析:
具有缓冲区重用功能的是SLUB分配器,kmem_cache维护了一个refcount,表示它被复用的次数。