• 华为内部面试题库(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,表示它被复用的次数。

  • 相关阅读:
    获取exe可执行程序文件中的图标
    在客户端显示服务器时钟
    解决系统管理员不允许使用保存的凭据登录远程计算机
    c#反射实现实体类生成以及数据获取与赋值
    c# 利用反射动态给实体类对象赋值
    将一个DataTable转换成一个List<T>的泛型集合
    解决table中无内容边框显示不出来的问题
    javascript 格式化日期显示
    一些常用的
    Web.config配置
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6173040.html
Copyright © 2020-2023  润新知