首页 新闻 会员 周边 捐助

windows CPU时间片问题

0
悬赏园豆:20 [已解决问题] 解决于 2019-11-17 14:42

好多书上都提到:
1.windows任何时刻只将一个线程分配给一个CPU,运行一个"时间片"的长度,时间片到期后,windows就上下文切换到另外一个线程.
2.理论上任何机器上最优的线程数就是那台机器的CPU核心数目.

那小弟有点不明白,假如是单核,
开了10个进程,每个进程5个线程.
那CPU是在这50个线程之间切换吗?
如果是的话,那怎么可能做到上面第2点提到的最优呢?因为一台电脑上随随便便都要开10几个进程,上百个线程呀!

有点懵逼了,望大神点拨

热敷哥的主页 热敷哥 | 初学一级 | 园豆:160
提问于:2019-08-13 22:56
< >
分享
最佳答案
-1

虽然没有研究这个,但知道你可能进入一个误区:
CPU不是在线程间切换,而是线程在请求执行过程中分配到核上运行;
首先,进程允许分派多个线程,CPU在其中起的是一个协调调度的作用,避免各线程间起冲突,也就是说单核的CPU在多同一进程里的多线程中切换的时候,会自动分配CPU的核心上运行,但这也只是相对的最优;
“开了10个进程,每个进程5个线程.”,就比如你这个例子,哪怕就是这个10个进程下的所有线程并发执行,CPU的分配原理也是一样,最大的可能就是它的核心数能否支撑这些线程同行并发,如果不能,程序肯定就会卡顿,甚至当机;这也就是电脑多核优于单核的一大优势。

收获园豆:20
Luckyfish小文 | 菜鸟二级 |园豆:335 | 2019-08-14 09:26

您这么一说,我突然想起了Unix的队列式,windows的抢占式

热敷哥 | 园豆:160 (初学一级) | 2019-08-14 09:40

@热敷哥: 有相同的地方,其实你也不用担心这个,并不是后台打开的所有进程都是同时工作的,闲的会让给忙的,所以这个时间CPU要么保持忙碌,要么也跟着清闲,除非,多个进程共用一个线程或者多线程并发同行。反正CPU资源是固定的,保证够用就行,不然就超负荷

Luckyfish小文 | 园豆:335 (菜鸟二级) | 2019-08-14 09:57
其他回答(2)
0

那CPU是在这50个线程之间切换吗?
是的啊

如果是的话,那怎么可能做到上面第2点提到的最优呢?
做不到啊,所以人家说“理论上“。不过呢,线程应该也有优先级,如果优先级比较高的线程数和cpu核心数一致,还是比较“优“的,个人认为。

会长 | 园豆:12463 (专家六级) | 2019-08-14 09:18
0

“如果是的话,那怎么可能做到上面第2点提到的最优呢?”——线程尽量少;

提供以下实验:

1:Thread(()=>Thread.Sleep(XXXX));

2:Thread(()=>for(var i=0;XXXX){Math.开方});

如果你实在不爽,实际上你可以完全脱离os写代码试试,比如随便整个廉价单片机试试,很明显根本没有所谓线程,线程变成了你需要实现的东西,你这个时候可以思考如何实现线程,你有个粗的思路,再反过来想os如何做就很明白了。

花飘水流兮 | 园豆:13617 (专家六级) | 2019-08-14 11:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册