华为内部面试题库---(18)

1关于伙伴算法,下列说法正确的是(单选):(《深入理解linux内核》P303-P313

A伙伴算法会造成内部碎片

Balloc_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

ASLAB分配器可以用于分配小于一个页框的小块内存,因此不会造成内存浪费

Bkfree将内存释放回伙伴系统

CSLAB分配器包含多个slab,每个slab由一个或多个连续的页框组成,这些页框中既包括已分配的对象,也包括空闲的对象

DSLAB分配器把对象分组放进高速缓存(由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

Avmalloc用于内核分配一块线性地址连续,但物理地址不一定连续的内存,vmalloc对可分配的最大内

存,没有明确的限制

Bbootmem用于在伙伴系统初始化之前,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(0xF8000000x800000)来申请这段内存。

 

4alloc_pages()分配页框时需要gfp_mask参数,它是一组标志,它指明了如何寻找空闲的页框,下列说法错误的是(单选):(《深入理解linux内核》P304-P306

Agfp_mask可以指明在哪个内存区分配内存,例如如果__GFP_DMA标志被置位,则只能从ZONE_DMA内存管理区获取页框

B假设系统存在ZONE_NORMAL/ZONE_DMA32/ZONE_DMA区,如果gfp_mask没有置位__GFP_DMA__GFP_HIGHMEM,则分配顺序为:DMA->DMA32->NORMAL

CGFP_ATOMIC标志表示是一个原子内存分配请求,原子请求不会被阻塞,如果没有足够的空闲页,显示分配失败。为了尽量减少原子分配失败,内核保留了一个页框池,只有在内存不足时才使用

DGFP_THISNODE指定在本节点分配,如果本节点内存不足则分配失败

参考答案:B

试题分析:

B分配次序应该是:NORMAL->DMA32->DMA.

 

5关于SLABSLUB分配器,说法错误的是(单选):(《深入理解linux内核》P323-P340

ASLAB分配器使用freepartialfull三个队列管理slab,而SLUB分配器只有一个partial队列

BSLAB/SLUB分配器为每个cpu维护per cpu cache,分配对象时优先从本地cpu cache中分配

CSLAB分配器具有缓冲区重用的功能,当内核执行请求创建新的缓冲区 C2 时,SLAB 分配器会先搜索已创建的缓冲区,如果发现某缓冲区 C1 的对象大小略大于 C2,则重用 C1

DSLUB分配器保留了SLAB分配器的所有API接口函数

参考答案:C

试题分析:

具有缓冲区重用功能的是SLUB分配器,kmem_cache维护了一个refcount,表示它被复用的次数。

你可能感兴趣的:(华为内部面试题库---(18))