Linux内存管理对多核的支持相关问题

大家好,最近在琢磨Linux2.6内存管理,有些问题不是很明白,贴出来请大家帮忙解答以下,给分啦~~

1. Linux 2.6内核版本中内存管理对多核的支持,我在一篇文章中看到这样一句话说现在的每一个cpu或者cpu core在内存分配时,都有属于自己私有的空闲链表队列?
这句话该如何理解,我的疑惑是:内存是所有 cpu或者cpu core共享的,OS在分配时,按照Buddy(大内存快分配) 和 Slab(小内存分配)二种方式来分配物理内存供应用
程序使用,Buddy算法将内存页面分成0.......10层次,每一层按照空闲页面块链表组成,这样的话应该是所有的CPU都是按照这种方式共享空闲页的链表的,为什么说每一个cpu和cpu core都有私有空闲链表呢?
不解啊,例外,如果真的是每个cpu或者cpu core有自己私有空闲链表,那么内核代码内存管理中在哪一部分实现的啊?


2.用户进程在在用户空间执行过程中,根据进程描述符中的mm_struct结构,找到该进程的页表,从而将其映射到对应的物理地址中,请问页表是怎么创建的?是在进程创建时,复制了父进程的页表吗?那对应的物理地址是怎么分配的呢?求解


谢谢大家,请指点.....

作者: pkw888   发布时间: 2011-01-14

说下自己的看法
1、楼主忽略了硬件,多核必定是多总线的,否则1核等另1核那就没意思了,同理,每个core有自己的DDR但又允许别的core访问该DDR,这种体系结构也是支持的啊。。。它的确存在,楼主自己搜下NUMA的介绍。软件方面对于NUMA的体系结构中每个core对应的DDR用一个node表示,每个node又描述了一组page。。。这样你的疑问是否解决了呢。

2、如果进程是通过fork创建的,那它是没页表的,它使用parent的页表。fork采用一种叫写时复制的,只有当子进程进行写操作的时候才会对父进程的页表进行拷贝。之所以采用这种技术是因为一般fork一个进程都是用来执行其他程序的,否则创建一个进程来做和父进程一样的操作有什么意思。除了fork之外,当loader将程序load到DDR中时,也就是你执行一个程序时,loader或scheduler会为程序创建页表。至于是loader还是scheduler这要看进程状态了,比如有些系统不是进程一创建就将它加入到ready队列的,而是scheduler在合适的时候再将其加入到ready队列。反正不管怎样,页表创建必须是在加入ready队列之前。

作者: alexhuang2010   发布时间: 2011-01-14