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,非对等映射
答:选A
在X86架构下,内核模块加载到ffffffffa0000000-fffffffffff00000(=1536 MB) module mapping space。该块内存区域属于非对等映射区
是通过vmalloc分配的。
在IA64结构下,内核模块加载a000000000000000-c000000000000000,属于第5区,采用内核页表映射,即非对等映射,通过vmalloc分配。