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

  • 相关阅读:
    批量新增百万条数据 十百万条数据
    sqlserver 组内排序
    EF ++属性会更新实体
    Entity Framework Core: A second operation started on this context before a previous operation completed
    abp Cannot access a disposed object. A common cause of this error is disposing
    abp xunit Can not register IHostingEnvironment. It should be a non-abstract class. If not, it should be registered before.”
    hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)
    EF 更新实体 The instance of entity type 'BabyEvent' cannot be tracked because another instance
    datatable to entiy list 不支持可空类型和枚举类型
    webapi 设置不显示接口到swaggerUI
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332752.html
Copyright © 2011-2022 走看看