626788149 发表于 2015-12-04 11:47

关于进程线性区的几个问题。

linux进程的代码段和数据段是不是加载到进程的线性区的?也就是vm_area_struct 结构所代表的区域
1、为线性区分配的页框是不是长度为2的n次方的连续的页?也就是从伙伴系统里分配的页。(order为1~10)。
2、还是一个页一个页的分配?(order 为0)。

如果1成立,页框回收如何回收连续的页?

hnwyllmm 发表于 2015-12-04 12:53

我知道进程线程区间是用vm_area_struct表示的,但是这只是表示进程的虚拟空间,并不一定有对应的物理内存
所以,下面两个问题,我感觉不存在

jeppeter 发表于 2015-12-04 16:41

回复 1# 626788149


    你问的问题,其实在《LINUX内核源代码情景分析》这本书中有你的答案。是在第二章,你把第二章好好看上三遍以上,才能懂这个道理,我这里大概跟你讲一下,具体的内容要看那里的内容。
      1, 为线性区分配的页框是不是长度为2的n次方的连续的页?也就是从伙伴系统里分配的页。(order为1~10)。
            这个问题是的。确实是这样的。但这只是相当于给了一个支票,没有实际兑现。什么时候兑现,要等到真正用的时候,什么叫真正用的时候,就是进程对这个地方进行读或者写的时候。
         2,还是一个页一个页的分配?(order 为0)。
            这个是实际分配的方式,也就是一读或者写到一个页面的地址的时候,进行分配。而且每次只分配一个页面。

         你可能问这个到底是怎么回事,如果没有懂,我这么跟你说,这是因为虚拟内存,因为虚拟内存是先在页表分配了,后面到了缺页中断的时候才真正进行分配,这样的好处是减少了不必要的分配。LAZYMODE才是好的方法 。而从虚拟内存到物理内存的映射工作,这里有一个CPU的机制问题,其中有很复杂的内容。但说的简单一点。就是有一个数据结构来管理,CPU根据这个结构来检查要访问的物理内存与进行读写。而操作系统通过维护这个数据结构来实现内存管理 。这些内容都在我说的那本书的那个章节中讲到,非常细节的内容,那最后还是要看源代码的。

626788149 发表于 2015-12-04 18:27

回复 3# jeppeter

非常感谢。

你这么一说我好像豁然开朗。

因为最近我在写一个小型类unix的操作系统。

写完伙伴系统之后,我想了想需要为以后的页框回收系统留下接口。

后来我一直在考虑,因为页框回收系统回收页面的时候是一页一页回收的,如果分配了一组连续的页框,那怎么回收页面? 难道一下回收一组连续的页框?

后来我才发现,从伙伴系统里分配一组页框与回收单独的页框一点关系也没有!!!


但是我又有个疑问,进程刚刚被创建的时候分配了一组连续的页,但是进程长时间运行,经过页框回收系统的回收机制,
进程实际的物理页框会不会变得不连续了?

jeppeter 发表于 2015-12-07 08:44

回复 4# 626788149


    首先,物理连续与否,与虚拟内在连续与否没有太大关系,就算物理不连续,虚拟的也可以连续。如果担心这个,可以在两个地方实现:
      1,回收机制上,这个可以实现把内存,整块的回收,这里就要用到伙伴算法。
      2,在整理机制上,就是对进程的虚拟内存进行整理,那它整理到连续的物理内存上。这个有额外的开销。
      

kerryxi 发表于 2015-12-08 21:41

进程的内存分配,都是lib库统一做虚拟地址的分配,实际的物理内存页使用,都在内核根据缺页中断处理,内核才真正地开始分配内存。实际上物理内存也不会连续。

内存运行时间长后,根据内存的页面类型,回收机制会处理不同的方式,映射页可能随时回收,anony页面可能被交换,所以进程实际的物理页框开始不连续,后续会变得更不连续。
页: [1]
查看完整版本: 关于进程线性区的几个问题。