(七)内存管理

 1、内核空间与进程的用户空间分别存放的是什么内容?

内核空间由所有进程共享,其中存放的是内核代码和数据,即“内核映象”
进程的用户空间中存放的是用户程序的代码和数据
每个进程的用户空间都是完全独立、互不相干的。

2、系统启动后,物理内存的前1M空间是保留在什么模式运行的?

当系统启动时,Linux内核映像被装入在物理地址0x00100000开始的地方,即1MB开始的区间(第1M留作它用)。

3、内核空间在虚拟地址空间和物理地址空间的起始地址分别是多少?

虚地址空间:
物理地址空间:0x00100000
 不管是内核程序还是用户程序,它们被编译和连接以后,所形成的指令和符号地址都是虚地址,而不是物理内存中的物理地址。

4、虚拟内存实现机制及之间的关系图

首先内核通过映射机制把进程的虚拟地址映射到物理地址,在进程运行时,如果内核发现进程要访问的页没有在物理内存时,就发出了请页要求①;如果有空闲的内存可供分配,就请求分配内存②(于是用到了内存的分配和回收),并把正在使用的物理页记录在页缓存中③(使用了缓存机制)。如果没有足够的内存可供分配,那么就调用交换机制,腾出一部分内存④⑤。另外在地址映射中要通过TLB(翻译后缓存储器)来寻找物理页⑧;交换机制中也要用到交换缓存⑥,并且把物理页内容交换到交换文件中后也要修改页表来映射文件地址⑦。
在这里插入图片描述

5、mm_struct结构和vm_area_structs结构的关系

一个进程的用户地址空间主要由mm_struct结构和vm_area_structs结构来描述。
mm_struct结构对进程整个用户空间进行描述
vm_area_structs结构对用户空间中各个区间(简称虚存区)进行描述
• 进程控制块PCB是内核中的核心数据结构。
• 每个进程对应一个task_struct结构,它指向一个mm结构,这就是该进程的内存管理器,
• 而进程的mm_struct结构则包含进程的可执行映像信息以及进程的页目录指针pgd等。mm->pgd指向容纳页表的内存,每个进程有自已的mm,每个mm有自己的页表。
• 该结构还包含有指向vm_area_struct结构的几个指针,每个vm_area_struct代表进程的一个虚拟地址区间。
• 进程调度时,页表被切换,所以,各个进程的地址空间互不影响

6、什么是虚存映射

虚存映射:即把文件从磁盘映射到进程的用户空间,对文件的访问转化为对虚存区的访问
补充:
• 有共享的、私有的虚存映射和匿名映射
共享的:有几个进程共享这一映射,也就是说,如果一个进程对共享的虚存区进行写,其它进程都能感觉到,而且会修改磁盘上对应的文件
• 私有的:进程创建的这种映射只是为了读文件,而不是写文件,因此,对虚存区的写操作不会修改磁盘上的文件,由此可以看出,私有映射的效率要比共享映射的高。
• 除了这两种映射外,如果映射与文件无关,就叫匿名映射。

7、什么是写时复制?

写时复制技术可以推迟、甚至免除数据的拷贝
进程创建之初内核并不复制整个进程空间,而是使父子进程以只读方式共享同一个拷贝
数据只有在需要写入时才会被复制,从而使各个进程拥有各自的拷贝
这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。有时共享页根本不会被写入,例如,fork()后立即调用exec(),就无需复制父进程的页了。fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的PCB。这种优化可以避免拷贝大量根本就不会使用的数据(地址空间里常常包含数十兆的数据)。

8、伙伴算法工作原理

工作原理:首先在大小满足要求的块链表中查找是否有空闲块,若有则直接分配,否则在更大的块中查找。其逆过程就是块的释放,此时会把满足伙伴关系的块合并

9、slab机制的提出原因

Slab机制提出的原因:

  1. 为了减少对伙伴算法的调用次数
  2. 内核经常反复使用某一内存区
  3. 内存区可根据其使用频率来分类
  4. 硬件高速缓存的使用,为尽量减少对伙伴算法的调用提供了另一个理由

10、slab的缓冲区
专用缓冲区主要用于频繁使用的数据结构
缓冲区是用kmem_cache_t类型描述的,通过kmem_cache_create()来建立
只有以下两个条件都为真时,才给缓冲区分配Slab:

  1. 已发出一个分配新对象的请求;

  2. 缓冲区不包含任何空闲对象;
    通过函数kmem_cache_alloc()从缓冲区中获取对象
    -该函数从给定的缓冲区中返回一个指向对象的指针。
    如果缓冲区中所有的slab中都没有空闲的对象,则 slab必须调用__get_free_pages()获取新的页面
    使用函数kmem_cache_free()可以释放一个对象,并把它返回给原先的slab。

    11、vmalloc()和kmalloc()的区别
    

vmalloc()与 kmalloc()都可用于分配内存
kmalloc()分配的内存处于3GB~high_memory之间,这段内核空间与物理内存的映射一一对应,而vmalloc()分配的内存在VMALLOC_START~4GB之间,这段非连续内存区映射到物理内存也可能是非连续的
vmalloc() 分配的物理地址无需连续,而kmalloc() 确保页在物理上是连续的
vmalloc()工作方式与kmalloc()类似, 其主要差别在于前者分配的物理地址无需连续,而后者确保页在物理上是连续的(虚地址自然也是连续的)。
尽管仅仅在某些情况下才需要物理上连续的内存块,但是,很多内核代码都调用kmalloc(),而不是用vmalloc()获得内存。这主要是出于性能的考虑。

 12、用户空间中的虚拟地址到物理地址的转换过程?

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值