多路CPU下的内存分配

LL596214569 2019-10-14 07:40:26
如果有一台电脑,有这多路CPU,例如双CPU,每个CPU有24核,48线程,那么总的线程数就是96,这时候如果我写程序启动97个线程,那么这些线程该如何分配呢?问题:
1.这97个线程是由一个CPU启动还是两个CPU启动?
2.这97个线程如何占用的资源分配?是在一个CPU上还是2个CPU上均分?
3.多路CPU下启动线程数该如何设置?单CPU时我设置的一般是线程数 = 核心数。
4.这些调度在不同的操作系统下是否有所区别?
对于多CPU下操作系统的调度只有一些猜测,但是不确定对不对,希望有前辈指点一下这几个问题,如果有一些相关的资料推荐更好
...全文
171 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LL596214569 2019-10-18
引用 9 楼 早打大打打核战争 的回复:
首先要明确一个概念,我理解你说的这个“CPU”实际是处理器封装,每个核心就是传统意义上的一个CPU(可以有超线程模拟出多个逻辑处理器),两路24核48线程的系统,和一路48核96线程的系统并无实质区别。 windows对于超过64个逻辑处理器的系统,分成若干处理器组,每组最多64个逻辑处理器,默认情况下,一个应用(技术上也就是进程)限制在一组处理器上运行,不会跨组,程序可以使用SetThreadGroupAffinity改变调度方式。
好的 明白了 谢谢
回复
LL596214569 2019-10-17
引用 7 楼 早打大打打核战争 的回复:
[quote=引用 5 楼 LL596214569 的回复:] [quote=引用 3 楼 早打大打打核战争 的回复:] 每个核都是一个CPU,通常操作系统的线程调度不会把一个线程切换到不同核心上运行,因为这样做代价比较大,相当于进程切换,需要更新另一个CPU的页表。
那么对于多CPU系统是会分配不同的进程吗?我也觉得系统分配资源时应该是在一个CPU上执行的,那似乎多CPU就没有意义了,因为在运行单个程序的情况下多个CPU也不能加快运行速度[/quote] 有意义呀,你开足够多的线程,把每个核心都占住就可以了。我前面说的意思是对特定的一个线程,操作系统调度的时候倾向于让它固定在一个CPU上运行,而不是运行中切换CPU。 [/quote] 我的理解是在多个CPU的环境下,就算一个程序开多个线程系统也不可能吧这些线程分配给两个CPU,因为这些线程肯定有公用的资源,所以我觉得一个程序进程下开再多的线程也只会分配给一个CPU上的核心一直轮转,系统会分配给不同CPU的应该是进程吧?我是这样猜测的,但是没有在网上找到关于这些的权威资料。
回复
首先要明确一个概念,我理解你说的这个“CPU”实际是处理器封装,每个核心就是传统意义上的一个CPU(可以有超线程模拟出多个逻辑处理器),两路24核48线程的系统,和一路48核96线程的系统并无实质区别。
windows对于超过64个逻辑处理器的系统,分成若干处理器组,每组最多64个逻辑处理器,默认情况下,一个应用(技术上也就是进程)限制在一组处理器上运行,不会跨组,程序可以使用SetThreadGroupAffinity改变调度方式。
回复
LL596214569 2019-10-16
引用 4 楼 gouyanfen 的回复:
如果不是写操作系统,写应用程序本身就只能面对操作系统,至于多路还是单路要看你的程序运行在什么样的系统上面,还有操作系统对CPU的管理调度,每个线程一个核心运行只是理想情况,正常是不可能达到这么均衡的,本身操作系统自己也需要占用核心。 编译是如果编译器支持多CPU选项,编译时选择支持就行了。
是的,目前我开发的程序是没有考虑过多CPU的问题,因为我也觉得在哪个CPU上执行不是我该负责的,但是现在有客户反馈我的程序在他的多路CPU电脑上运行时只会使用一个CPU的资源,想要优化一下能不能同时使用多个CPU来加快计算速度,但是多路CPU我没研究过,不太懂该如何实现他的需求。 还想请问一下如果我想用代码控制线程在CPU上的分配,C++可以实现吗?
回复
LL596214569 2019-10-16
引用 3 楼 早打大打打核战争 的回复:
每个核都是一个CPU,通常操作系统的线程调度不会把一个线程切换到不同核心上运行,因为这样做代价比较大,相当于进程切换,需要更新另一个CPU的页表。
那么对于多CPU系统是会分配不同的进程吗?我也觉得系统分配资源时应该是在一个CPU上执行的,那似乎多CPU就没有意义了,因为在运行单个程序的情况下多个CPU也不能加快运行速度
回复
引用 5 楼 LL596214569 的回复:
[quote=引用 3 楼 早打大打打核战争 的回复:]
每个核都是一个CPU,通常操作系统的线程调度不会把一个线程切换到不同核心上运行,因为这样做代价比较大,相当于进程切换,需要更新另一个CPU的页表。

那么对于多CPU系统是会分配不同的进程吗?我也觉得系统分配资源时应该是在一个CPU上执行的,那似乎多CPU就没有意义了,因为在运行单个程序的情况下多个CPU也不能加快运行速度[/quote]

有意义呀,你开足够多的线程,把每个核心都占住就可以了。我前面说的意思是对特定的一个线程,操作系统调度的时候倾向于让它固定在一个CPU上运行,而不是运行中切换CPU。
回复
LL596214569 2019-10-15
引用 1 楼 gouyanfen 的回复:
不管多少核心,线程分配都是属于操作系统管理调度的,只是说核心多的话,线程调度切换没有那么频繁 1.多CPU启动线程由操作系统调度,支持多CPU的系统就是多CPU启动 2.占用和分配资源由操作系统决定 3.线程数=核心数只是个大概的算法。 4.在不同的系统之个区别很大,线程之间用户线程的优先度决定的 [/quote] 那这样说的话,是不是在我们开发者看来多路CPU与单CPU都没有区别?我们只需要面对系统就行了? 但是我现在在多路CPU电脑上开发时,使用系统函数取到的CPU信息只会是单个CPU的信息,所以我现在很怀疑系统是否会将我在一个进程内启动的线程分配在两个CPU上运行?
回复
gouyanfen 2019-10-15
如果不是写操作系统,写应用程序本身就只能面对操作系统,至于多路还是单路要看你的程序运行在什么样的系统上面,还有操作系统对CPU的管理调度,每个线程一个核心运行只是理想情况,正常是不可能达到这么均衡的,本身操作系统自己也需要占用核心。 编译是如果编译器支持多CPU选项,编译时选择支持就行了。
回复
每个核都是一个CPU,通常操作系统的线程调度不会把一个线程切换到不同核心上运行,因为这样做代价比较大,相当于进程切换,需要更新另一个CPU的页表。
回复
gouyanfen 2019-10-14
引用 楼主 LL596214569 的回复:
如果有一台电脑,有这多路CPU,例如双CPU,每个CPU有24核,48线程,那么总的线程数就是96,这时候如果我写程序启动97个线程,那么这些线程该如何分配呢?问题: 1.这97个线程是由一个CPU启动还是两个CPU启动? 2.这97个线程如何占用的资源分配?是在一个CPU上还是2个CPU上均分? 3.多路CPU下启动线程数该如何设置?单CPU时我设置的一般是线程数 = 核心数。 4.这些调度在不同的操作系统下是否有所区别? 对于多CPU下操作系统的调度只有一些猜测,但是不确定对不对,希望有前辈指点一下这几个问题,如果有一些相关的资料推荐更好
不管多少核心,线程分配都是属于操作系统管理调度的,只是说核心多的话,线程调度切换没有那么频繁 1.多CPU启动线程由操作系统调度,支持多CPU的系统就是多CPU启动 2.占用和分配资源由操作系统决定 3.线程数=核心数只是个大概的算法。 4.在不同的系统之个区别很大,线程之间用户线程的优先度决定的
回复
相关推荐
发帖
其它技术问题
创建于2007-09-28

3847

社区成员

C/C++ 其它技术问题
申请成为版主
帖子事件
创建了帖子
2019-10-14 07:40
社区公告
暂无公告