分类: LINUX
2012-06-28 11:04:37
下面的答案是我参与《linux内存管理讨论——欢迎大家围观!》的剪辑,详细请看:
讨论架构以x86为例,
1.内存寻址的方式,线性地址、物理地址的转换关系?
A: 进入操作系统后,内存使用保护模式寻址。线性地址经过分页后转换为物理地址。
-----------------------------------
2.页目录表、页表作用?物理页面是如何分配的?
A:
由页目录表、cr3、页目录偏移(线性地址高10bit)可以查出 页目录项 ;
页目录 项用于在页表中定位,结合页表偏移得到 物理页基地址。
A2:物理页面的分配,分配方式是first-fit...(见前面的帖子),分配策略是buddy system.
-----------------------------------
3.硬件高速缓存、TLB作用是?
A:(?)硬件高速缓存指cpu相连的L1,L2
A2:TLB是页表缓存
-----------------------------------
4.进程页表、内核页表关系、作用是?
A:内核页表 专指 页全局目录的768项以上的目录项指向的页表
二者区别在于用户空间必须MMU映射访问,内核空间可以直接访问页表,无需映射。
-----------------------------------
5.page、zone、node关系,分别是管理的目标是?
A:1个node (NUMA)可以管理3个zone(dma,normal,high), 1个zone对应若干page
-----------------------------------
6.请求、释放页框的函数流程是?
简答关键词:alloc_pages ,free_pages
A:详细:
参考: (大牛作品)
-----------------------------------
7.高端内存页框的内核映射原理?
简答关键词:page_address_htable散列表, kmalloc
A:李万鹏文章:http://blog.csdn.net/woshixingaaa/article/details/6823194
-----------------------------------
8.buddy system 提出的目的,方法?实现的过程是?
A:目标:管理物理页,尽量少外存碎片。
方法:按照(2^0,2^1,2^2...2^n)大小管理“空闲物理页”,
过程:
当外界申请时,有空余的,当2^i大小满足,直接分配;
当2^i不满足,而2^(i+1)满足时,split 2^(i+1)为两半,
多出来剩余的加入buddy system;
当外界释放时,加入对应链表,如果有相邻的空余页可构成更大的页,就合并。
-----------------------------------
9.slab分配的原理?
简答关键词:小粒度内核内存分配机制,内存池,非真正释放
A:
基本思想:
其基本思想是:一次向内核获取整数页,slab根据数据结构的大小进行划分为一个个小的数据结构,
当需要时直接从该链表上摘取一个返回应用程序,
当应用程序释放时,而“非真正释放”,只需要该空间放回到链表中,
当分散的一页多块又聚集一页时,又会拼成一页,同时判断slab空闲的页数,
如果空闲页超过一定的页数,就会向系统释放一定的页数。
一个slab分配器只能管理一个指定大小的数据结构分配。
//http://blog.chinaunix.net/uid-20687780-id-3154025.html
再来一个6b的图示:
//来源:李万鹏
我觉得图中将slab的3个链表(尤其外在环境)讲解得很清晰。
其他详细分析请看:李万鹏(一个系列,非常清晰)
http://blog.csdn.net/woshixingaaa/article/details/6772585
ibm专家分析:
https://www.ibm.com/developerwor ... nux-slab-allocator/
csdn专家讲解:
http://blog.csdn.net/yunsongice/article/details/5272715
(此作者考虑的更完整)
-----------------------------------
10.非连续内存管理,连续的线性地址是如何与非连续的页框关联起来的?
简答关键词:虚存连续,物理不连续;页表机制
下面是高手解答:
http://blog.csdn.net/yunsongice/article/details/5536197
-----------------------------------
11.进程结构是如何与内存管理系统关联起来的?
A:task_struct中 有指针mm指向mm_struct
-----------------------------------
12.vm_area_struct是如何实现线性区的?
简言之:通过链表
详细请看下面vm_area_struct的数据结构:
A:
Linux通过类型为vm_area_struct的对象实现线性区,它的字段如下所示:
struct vm_area_struct {
struct mm_struct * vm_mm; /* 指向线性区所属的内存描述符 */
unsigned long vm_start; /* 线性区内的第一个线性地址 */
unsigned long vm_end; /* 线性区之后的第一个线性地址 */
/* linked list of VM areas per task, sorted by address 进程链表中的下一个线性区*/
struct vm_area_struct *vm_next;
pgprot_t vm_page_prot; /* 线性区中页框的访问许可权 */
unsigned long vm_flags; /* 线性区的标志 */
struct rb_node vm_rb; /* 用于红-黑树的数据 */
-----------------------------------
13.申请、释放线性地址区间的过程是?
简答关键词:malloc ,free mmap.(用户级); vmalloc ,slab 核心级
A:
-----------------------------------
14.do_mmap do_munmap do_mremap实现的过程?
A:不懂do_mremap。
对于do_mmap,do_munmap分别是申请和释放。
这两个操作都是对 线性区的操作。
详细的解释:
李万鹏 http://blog.csdn.net/woshixingaaa/article/details/6856939
csdn yunsongice
http://blog.csdn.net/yunsongice/article/details/5637543
http://blog.csdn.net/yunsongice/article/details/5637554
-----------------------------------
15.什么时候发生缺页,缺页异常处理程序的处理流程是?
A:页表项为空时。
缺页流程很经典:贴上高手解答
http://blog.csdn.net/yunsongice/article/details/5637671
经典的图示:
-----------------------------------
16.如何做到请求调页?(demand paging)
核心思想:页框的分配推迟到不能再推迟为止。lazy mechanism
函数实现:handle_mm_fault
实现过程:
当进程就会存取一些不在物理内存中的虚拟内存页,
这时处理器会通知linux发生了页面错误。
页面错误将会描述页面错误发生时的虚拟内存地址和存取内存操作的类型。
linux首先查找代表发生页面错误的虚拟内存区的vm_area_struct。如果没有代表此出错虚
拟地址的vm_area_struct,就说明进程存取了一个非法的虚拟内存地址。linux系统将向进程发
出sigsegv 信号。
linux下一步检查页面错误的类型是否和此虚拟内存区所允许的操作类型相符。如果不符,
linux系统也将报告内存错误。
如果linux认为此页面错误是合法的,它将处理此页面错误。(!!)
linux还必须区分页面是在交换文件中还是作为文件镜像的一部分存在于磁盘中。它靠检
查出错页面的页面表来区分:
如果页面表的入口是无效的,但非空,说明页面在交换文件中。
最后,linux调入所需的页面并更新进程的页面表
详见:
http://blog.csdn.net/yunsongice/article/details/5637694#comments
17.进程堆管理,函数调用流程?这里如何与页框产生关系的?
简答关键词:malloc,free ; 交互叶匡就是 如何调用到 alloc_pages.
-----------------------------------
18.系统没有空闲内存了会触发什么动作?
A:换页.swap,直到系统空余页数到page_high(上限阀值)
-----------------------------------
19.页框回收的方式有哪些?
简要关键词:free PFRA LRU
A:两种方式,第一种就是主动回收,比如调用free,kmem_cache_free(slab释放);
第二种系统回收,通过linux内核提供的页框回收算法(PFRA)进行回收,
回收时机如:删除文件、进程退出等等
关于PFRA,有以下浅析:
PFRA总会从用户态进内存程空间和页面缓存中,“窃取”页框满足供给。
所谓”窃取”,指的是:将用户进程内存空间对应占用的页框中的数据swap out至磁盘(称为交换区),或者将OS页面缓存中的内存页(还有用户进程mmap()的内存页)flush(同步fsync())至磁盘设备。
详细的页框回收请看:
http://hi.baidu.com/_kouu/blog/item/bdc4172bfb89be27d52af17e.html (作者很多linux专题浅析,大道至简啊)
(这个博主分享了很多 内存学习心得)
-----------------------------------
20.页框回收时,是如何与slab、zone、node关联起来的?如何收缩slab?
ps:这个话题很大,忙活了半个小时理出头绪。
先谈回收与zone:
alloc_pages等分配函数,就是从管理物理页面的伙伴系统
(管理区zone上的free_area空闲链表)上直接分配页面,而回收就是把
不用的页面放回zone上的free_area空闲链表。
回收过程中,磁盘高速缓存的页面(包括文件映射的页面)都是可以被丢弃并回收的。
所有这些磁盘高速缓存页面和匿名映射页面都被放到了一组LRU里面。
(实际上,每个zone就有一组这样的LRU,页面都被放到自己对应的zone的LRU中。
三者如何作用于回收,这是个大话题:
详细看:
http://www.ibm.com/developerworks/cn/linux/l-cn-pagerecycle/
http://blog.csdn.net/bullbat/article/details/7311205 (前者的学习笔记,更加图文并茂)
关于收缩slab:
简要说是 遍历 shrinker 链表,从而对所有注册了 shrinker 函数的磁盘缓存进行处理。
--------------------------------------
21.pageout写回磁盘的流程是?
我理解:pageout就是kswapd(网文称为:pageout daemon)干的活:
详细请看:
-----------------------------------
22.swap 信息的结构,缺页发生后,如何从磁盘唤回内存的?
A: 不懂swap信息结构,请各位UCer补充。
我理解的换回内存,就是 "请求调页"过程,如上16问。
23.内存管理中涉及到的高速缓存有哪些?
高速缓存有:缓冲区高速缓存,缓冲区高速缓存,交换高速缓存,硬件高速缓存
缓冲区高速缓存
缓冲区高速缓存中保存着块设备驱动程序所用到的数据缓冲区。
这些缓冲区的大小固定,一般包括从块设备中读入的和将要写入到块设备中的信息块。快
设备一次只能处理大小固定的数据块。硬盘就是块设备中的一种。
缓冲区高速缓存使用设备标识符和块号作为索引来快速地查找数据块。块设备只通过缓冲
区高速缓存进行存取。如果所需要的数据存在于缓冲区高速缓存中,那么就不需要从物理块设
备中读取,这样存取的速度就会加快。
缓冲区高速缓存
页面高速缓存用来加速磁盘中文件镜像和数据的存取,我们将在后面的1 0 . 1 2节中对它进
行详细讨论。
交换高速缓存
交换文件中只保存那些被修改过的页面。
只要在页面被写入到交换文件中后没有被修改过,那么此页面下一次从内存中交换出来时
就不用再写入到交换文件中了,因为交换文件中已经有了该页面。这样,该页面就可以简单地
扔掉,节省了大量的系统操作。
硬件高速缓存
一个常用的硬件高速缓存是在处理器中,它一般保存着页面表的入口。
-----------------------------------
24.内存管理中数据结构有哪些?
A:在此理出重要的几个:
overview:
page (物理页面描述)
zone(直接管理page的)
pglist_data(个人认为管理zone的)
free_area_struct(分配、释放处理的对象)
mm_struct 进程所有的虚存空间的数据结构描述
vm_area_struct 进程虚存空间的数据结构描述
...
一个看起来不错的总结在此:
http://blog.csdn.net/zhengtingt108/article/details/4680495
http://blog.sina.com.cn/s/blog_51dc0fba0100spul.html
最后附上好资源:
关于vm的图示网上链接:
小结:在回答 doit_zzg的问题时,
学到很多啊。
同时建议大家逛逛 鹏兄,还有yunsongice(csdn)的博客。这才是深刻的积累啊。