cpu型的进程,开多线程如何影响性能?

发布于 2022-09-12 01:10:02 字数 201 浏览 18 评论 0

对于cpu型的进程(非io型),一般建议是n核cpu,就创建n+1个线程比合适的,说创建太多的线程,由于存在线程切换的消耗,所以不宜创建多于n+1个线程的话,会导致性能降低。但是我有个疑问就是,cpu本来就是按照时间片固定频率来切换的,如果整个系统runnable状态的进程数大于2的话,不管是3个,还是10个,上下文切换的频率(加入都是cpu型的线程)不是一样么?跟线程数有半毛钱关系?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧瑾黎汐 2022-09-19 01:10:02

你衡量多线程是否影响性能的方法不对,一个单核cpu面对多于两个线程时,即使按照固定时间片来分配,也不能说性能没有降低。

衡量cpu性能的方法应该是对于要求相同计算资源的程序,线程数目对执行这个程序需要的总时间的影响。假如两个线程就跑满了cpu,这时cpu的总开销包括2个线程切换的开销和你程序的计算开销,假如程序计算开销不变,改成4个线程来跑,你说cpu的总开销是不是变多了?你的衡量方法相当于在某一短时间内cpu的运算似乎没有因为线程的增多而执行额外开销,但是执行相同运算的总时间变长了呀。

如果是多核的话,线程数目增长初期,多核并行带来的运算能力的提升是高于线程带来的消耗的,但是当线程过多,cpu已经跑满,再提升线程数目就得不偿失了。

荒芜了季节 2022-09-19 01:10:02

为什么是 n+1 ...

如果一个核固定只跑某一个线程的话,上下文是不需要切换的。

只有当一个核上跑的线程发生变化的时候才需要上下文切换。

所以当总线程数比核还要少的时候,上下文切换其实并不会很多。但是当占用 CPU 多的线程比核数还多的话, 上下文切换就会频繁发生了。

橘味果▽酱 2022-09-19 01:10:02

简单来说,这与 CPU 硬件和操作系统调度算法有关。

对操作系统来说,每一个进程都有优先级,同级的进程们均分 CPU 时间,而每个进程下有若干线程,线程也有优先级,同样的,同级的线程们均分所属进程的 CPU 时间。

以一个 2 核心,每核心 2 线程的 CPU 举例,它可以同时运行 2x2 = 4 个独立线程。
假设某进程开了 5 个线程(同级),共享 CPU 时间 T,则每线程分得时间 T/5 = 0.2T,为了在 4 核心上公平使用,必然至少有一个核心需要切换线程,典型如

线程 /CPU核1核2核3核4
线10.2T
线20.2T
线30.2T
线40.2T
线50.05T0.05T0.05T0.05T

(本表仅为粗略展示,不代表实际情况)

若进程改成 4 个线程运行,理想情况下,每个 CPU 核心都不需要切换线程上下文,且 CPU 使用率最高。

至于为什么切换线程会影响性能,很大原因是 CPU 指令缓存失效导致。
CPU 带有多级缓存,如

CPU <-- L1 缓存 <-- L2 缓存 <-- 内存

切换线程一般会清空缓存,那么新线程就得重新加载缓存。

这里所说的节省线程切换开销,指单个进程,不是整个系统。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文