内存管理与进程调度

时间:2021-10-04 21:15:49

一、内存管理

1、内核

使用alloc_pages申请物理页帧

使用kmalloc申请专用/通用内存块、vmalloc申请物理不连续,逻辑相连内存

使用kmap建立高端地址映射

外碎片:空闲内存零散分布,无法满足大内存需求(伙伴系统解决)

内碎片:申请一块内存真正使用的只有小部分(slab,通用内存块解决)

2、用户进程

1)申请内存

使用malloc动态分配,分配的内存并不是立即调入,而是拥有该内存的访问权,等到真正访问时,引发缺页异常调入

malloc为glibc库函数,实际使用brk/mmap系统调用

申请内存<128k时,调用brk,简单移动堆指针

>128时调用mmap进行内存映射  边界值可通过mallopt进行设定

free一段内存并不是马上还给os,通过malloc依次分配A、B、C三块内存,free A,堆指针无法收缩,保留A供下次调用malloc时使用;free B C(B+C 超过 128k)此时才收缩堆指针,将C这段内存还给os

2)访问内存

cpu引用一个虚拟地址,TLB命中,直接得到物理地址

未命中,通过cr3寄存器存放全局目录地址,一层层索引+偏移得到物理地址

将物理地址发送给高速缓存,缓存命中直接得到对应数据,未命中则继续访问下级缓存或直接访问内存

3、内核与用户空间的数据传递

通过寄存器

内核不会直接引用用户内存,通过get_user/put_user、copy_from_user/copy_to_user等宏进行拷贝