关于进程线性区的几个问题。
linux进程的代码段和数据段是不是加载到进程的线性区的?也就是vm_area_struct 结构所代表的区域1、为线性区分配的页框是不是长度为2的n次方的连续的页?也就是从伙伴系统里分配的页。(order为1~10)。
2、还是一个页一个页的分配?(order 为0)。
如果1成立,页框回收如何回收连续的页? 我知道进程线程区间是用vm_area_struct表示的,但是这只是表示进程的虚拟空间,并不一定有对应的物理内存
所以,下面两个问题,我感觉不存在 回复 1# 626788149
你问的问题,其实在《LINUX内核源代码情景分析》这本书中有你的答案。是在第二章,你把第二章好好看上三遍以上,才能懂这个道理,我这里大概跟你讲一下,具体的内容要看那里的内容。
1, 为线性区分配的页框是不是长度为2的n次方的连续的页?也就是从伙伴系统里分配的页。(order为1~10)。
这个问题是的。确实是这样的。但这只是相当于给了一个支票,没有实际兑现。什么时候兑现,要等到真正用的时候,什么叫真正用的时候,就是进程对这个地方进行读或者写的时候。
2,还是一个页一个页的分配?(order 为0)。
这个是实际分配的方式,也就是一读或者写到一个页面的地址的时候,进行分配。而且每次只分配一个页面。
你可能问这个到底是怎么回事,如果没有懂,我这么跟你说,这是因为虚拟内存,因为虚拟内存是先在页表分配了,后面到了缺页中断的时候才真正进行分配,这样的好处是减少了不必要的分配。LAZYMODE才是好的方法 。而从虚拟内存到物理内存的映射工作,这里有一个CPU的机制问题,其中有很复杂的内容。但说的简单一点。就是有一个数据结构来管理,CPU根据这个结构来检查要访问的物理内存与进行读写。而操作系统通过维护这个数据结构来实现内存管理 。这些内容都在我说的那本书的那个章节中讲到,非常细节的内容,那最后还是要看源代码的。 回复 3# jeppeter
非常感谢。
你这么一说我好像豁然开朗。
因为最近我在写一个小型类unix的操作系统。
写完伙伴系统之后,我想了想需要为以后的页框回收系统留下接口。
后来我一直在考虑,因为页框回收系统回收页面的时候是一页一页回收的,如果分配了一组连续的页框,那怎么回收页面? 难道一下回收一组连续的页框?
后来我才发现,从伙伴系统里分配一组页框与回收单独的页框一点关系也没有!!!
但是我又有个疑问,进程刚刚被创建的时候分配了一组连续的页,但是进程长时间运行,经过页框回收系统的回收机制,
进程实际的物理页框会不会变得不连续了? 回复 4# 626788149
首先,物理连续与否,与虚拟内在连续与否没有太大关系,就算物理不连续,虚拟的也可以连续。如果担心这个,可以在两个地方实现:
1,回收机制上,这个可以实现把内存,整块的回收,这里就要用到伙伴算法。
2,在整理机制上,就是对进程的虚拟内存进行整理,那它整理到连续的物理内存上。这个有额外的开销。
进程的内存分配,都是lib库统一做虚拟地址的分配,实际的物理内存页使用,都在内核根据缺页中断处理,内核才真正地开始分配内存。实际上物理内存也不会连续。
内存运行时间长后,根据内存的页面类型,回收机制会处理不同的方式,映射页可能随时回收,anony页面可能被交换,所以进程实际的物理页框开始不连续,后续会变得更不连续。
页:
[1]