zoukankan      html  css  js  c++  java
  • 华为内部面试题库---(3)

    摘自:https://www.cnblogs.com/hehehaha/archive/2013/05/20/6332767.html

    1、NUMA系统中,各个节点间的距离由下列哪个数据结构获取()
    A、SRAT
    B、SLIT
    C、e820图
    D、bootmem_data

    答:选B
         Linux 对 NUMA 系统的物理内存分布信息是从系统 firmware 的 ACPI 表中获得的,最重要的是 SRAT(System Resource Affinity Table)和 SLIT(System Locality Information Table)表,其中 SRAT包含两个结构:
         Processor Local APIC/SAPIC Affinity Structure:记录某个 CPU的信息;
         Memory Affinity Structure:记录内存的信息;
    SLIT 表则记录了各个结点之间的距离,在系统中由数组 node_distance[ ] 记录。.
    e820图:物理内存构成图
    bootmem_data:表示物理内存的范围以及分配状态。


    2、假设一个NUMA系统中有4个节点A、B、C和D,相互之间的距离都为15,且B和C已无空闲内存。进程P运行在节点B上,对进程P指定MPOL_BIND分配策略使其在节点C上分配内存。进程分别在指定分配策略前后申请内存,则获取的内存分别处于哪个节点()
    A、D,D
    B、A,无法申请内存
    C、A,A
    D、D,无法申请内存

    答:选D
       在NUMA中,每个节点在自己的节点描述结构中通过zonelist将所有节点组成一个链表,对于B节点来说,其zonelist的顺序为B->C->D->A。
         MPOL_BIND: 从指定的一组节点分配,若未成功,则返回错误。
         MPOL_DEFAULT: 默认模式,即就近原则,从本节点分配,若未成功,则从最近节点分配,直到满足要求。使用每个zone的zonelist查找最近的zone。
       所以:在指定MPOL_BIND策略前,是默认策略,而C已经没有内存,则从D分配内存,指定MPOL_BIND策略后,由于C已经没有空闲内存,则返回错误。

    3、内核拥有多种内存分配器,每个分配器有不同的用途和特点。假设系统的页大小为4K,内核分别使用bootmem分配器、SLAB分配器和伙伴算法为一个32.5K的普通数据申请内存时,将分别得到的物理空间大小为()
    A、36K,32.5K,64K
    B、64K,64K,36K
    C、36K,64K,64K
    D、33K,36K,128K

    答:选C
         bootmem分配器:是按页大小的整数倍分配内存,而大于32.5K的最小值为36K = 4*9K;
       伙伴算法:按2的整数次幂分配内存,而大于32.5K的最小值是64K = 2^4 *4K;
        SLAB分配器:普通数据采用SLAB分配会使用通用cache分配对象,有两种情况:
               通用cache定义了大对象cache,则存在32K、64K的通用cache,则此数据占用64K空间
               通用cache未定义大对象cache,则通用cache不满足要求,则调用伙伴算法分配内存.

    1、bootmem分配器为linux启动时初始化阶段使用的内存分配器,它以一个page为单位进行分配,用位图进行记录,比如一个bit表示一个page是否被分配出去(分配出去的话置1),一个byte能表示8个page。
    1page=4kb,32.5kb在page对齐后为36kb。
    2、系统初始化完了之后,销毁bootmem分配器(由于功能和效果太差),启用伙伴算法分配器(大块内存分配,通常为几个page)和slab分配器(小块内存分配,通常为几个字节),slab是建立在伙伴算法之下的,其最终还是调用伙伴算法,比如先从伙伴算法申请一个page,然后再对这个page进行细分后分配几个字节出去。目前linux中有slab、slub、slob三种,其基本原理类似,只是分配出去字节的大小略有不同。
    3、slab分配器的对象大小范围一般为32b - 128kb,都为指数次幂增长,因此对于32.5k来说取64kb。
    4、伙伴算法分配器的分配大小为:2^0 - 2^10个page,即4196b - 4M大小,对于32.5k,page的指数次幂对齐后为64kb。

    4、分页映射中,不用级别的页表的属性位可以控制对应物理页的访问权限。现内存页A对应的页表中的属性为:PGD表中的U/S位为1,R/W位为0;PT表中的U/S为0,R/W位为1。则这个物理页分别对于用户态和内核态的访问权限为()
    A、用户态:可读, 可写;   内核态:可读,可写
    B、用户态:可读, 不可写; 内核态:可读,不可写
    C、用户态:不可读,不可写; 内核态:可读,可写
    D、用户态:不可读,不可写; 内核态:不可读,不可写

    答:选C 见下图

    允许级别3表示用户态,允许级别0表示内核态
    当通过分页机制寻址到PGD:U/S位为1 R/W位为0表示用户态可读不可写,内核态可读可写
    当寻址到PT时:U/S为0,R/W位为1      表示内核态可读可写,用户态不可访问
    内核态的访问不受页表属性位的限制

    5、内核模块加载时,将使用哪种内存分配方式,以及虚拟地址和物理地址的映射关系为()
    A、vmalloc,非对等映射
    B、kmalloc,对等映射
    C、malloc,对等映射
    D、malloc,非对等映射

  • 相关阅读:
    python操作MySQL数据库(转)
    python3.3.2中的关键字(转)
    HashMap的键值需要注意什么?
    为什么基本类型不能做为HashMap的键值?
    怎么确保一个集合不能被修改?
    Iterator和 ListIterator有什么区别?
    Iterator怎么使用?有什么特点?
    迭代器Iterator是什么?
    哪些集合类是线程安全的?
    Queue的element()和peek()方法有什么区别?
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/14296253.html
Copyright © 2011-2022 走看看