免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3520 | 回复: 4
打印 上一主题 下一主题

Linux内存管理对多核的支持相关问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-14 14:45 |只看该作者 |倒序浏览
大家好,最近在琢磨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结构,找到该进程的页表,从而将其映射到对应的物理地址中,请问页表是怎么创建的?是在进程创建时,复制了父进程的页表吗?那对应的物理地址是怎么分配的呢?求解


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

论坛徽章:
0
2 [报告]
发表于 2011-01-14 20:11 |只看该作者
说下自己的看法
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队列之前。

论坛徽章:
0
3 [报告]
发表于 2011-01-16 10:24 |只看该作者
谢谢  alexhuang2010的回复

还有些疑问,如果对于NUMA复杂的大型系统应该是你所说的那样,每个node有单独的DDR,当然每个node的具体结构也可能不同,可能是CMP,或SMP等,楼主说的没错,我想问下楼主,如果仅仅对于单芯片处理器(CMP),现在流行的多核PC机,它们每个core应该共享存储系统,通过Buddy和Slab管理内存分配,也就是UMA结构,传统的SMP架构也应该是UMA的吧,不知道对不对。

2.目前Linux内存管理是这样处理应用程序内存分配,应用程序被分配物理内存前应该在0-3G虚拟空间,当应用程序被调度执行后,该应用进程的不同线程将被映射到对应的物理内存,问题就在这了??
   1》每个线程应该有自己线程体结构,该结构中包含了属于该线程的页表,当该线程被调度时,就根据该页表映射到对应的物理地址,想问的是该线程页表中映射的物理地址是怎么确定的?

   2》线程页表中的物理地址可以修改吗?就是让其映射到特定的物理地址空间?可以吗?

论坛徽章:
0
4 [报告]
发表于 2011-01-16 20:37 |只看该作者
哈,其实NUMA和UMA我也不清楚啊,只是提一下拓宽楼主思路拉。目前PC上采用的是UMA体系结构,linux代码里内存管理的最顶端的数据结构--node,它是一个只有1个元素的数组,所以我想只要硬件能保证CPU访问DDR的独立性那软件上也可以实现每个CPU独立使用一个node......就当我没说过好了哈。

“应用程序被分配物理内存前应该在0-3G虚拟空间”你这点理解是错的哦,在32系统上,每个进程的地址空间都是0-4G,其中0~3G是用户态地址,它是各进程独立的,就是每个进程的0~3G内存地址都被映射到不同的物理内存上,不能相互访问,而3G~4G则是内核空间,是各进程共享的,说得白点就是不同进程的3~4G都是映射到相同的物理地址上的(这句话很费)。进程间要通信只能通过内核(MMU启动之后)。

你问的code被load到DDR后使用的物理地址是怎么确定的,这就是buddy算法做的(如果只有buddy和slab这两种算法),这方面我就不清楚了。

你问的能否映射指定的物理地址到进程空间,有的,用户空间(就是之前说的0~3G)用mmap,内核空间有iomap、iotable_init等等。你要看怎么分配内存的就可以从这里跟了。

论坛徽章:
0
5 [报告]
发表于 2011-01-20 15:58 |只看该作者
再次感谢  alexhuang2010的回复


还有些问题不解啊~~

1.SMP采用UMA架构,那么单芯片的CMP呢(现在很多电脑应该都是这种架构)?如果采用的也是UMA架构,那么所有执行核都共享存储管理系统,那执行效率不是很低吗,还是说CMP采用的不是这种架构?我在网上也没找到相关的说法?望说明啊~~

2.如果CMP采用的UMA存储管理方式,那么说所有执行核对应到一个节点(node),再按照zones等方式来管理吗?这样效率会高吗?为什么不采用NUMA,看了一些文章,好像NUMA效率好?求解~

谢谢~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP