cpu型的进程,开多线程如何影响性能?
对于cpu型的进程(非io型),一般建议是n核cpu,就创建n+1个线程比合适的,说创建太多的线程,由于存在线程切换的消耗,所以不宜创建多于n+1个线程的话,会导致性能降低。但是我有个疑问就是,cpu本来就是按照时间片固定频率来切换的,如果整个系统runnable状态的进程数大于2的话,不管是3个,还是10个,上下文切换的频率(加入都是cpu型的线程)不是一样么?跟线程数有半毛钱关系?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你衡量多线程是否影响性能的方法不对,一个单核cpu面对多于两个线程时,即使按照固定时间片来分配,也不能说性能没有降低。
衡量cpu性能的方法应该是对于要求相同计算资源的程序,线程数目对执行这个程序需要的总时间的影响。假如两个线程就跑满了cpu,这时cpu的总开销包括2个线程切换的开销和你程序的计算开销,假如程序计算开销不变,改成4个线程来跑,你说cpu的总开销是不是变多了?你的衡量方法相当于在某一短时间内cpu的运算似乎没有因为线程的增多而执行额外开销,但是执行相同运算的总时间变长了呀。
如果是多核的话,线程数目增长初期,多核并行带来的运算能力的提升是高于线程带来的消耗的,但是当线程过多,cpu已经跑满,再提升线程数目就得不偿失了。
为什么是 n+1 ...
如果一个核固定只跑某一个线程的话,上下文是不需要切换的。
只有当一个核上跑的线程发生变化的时候才需要上下文切换。
所以当总线程数比核还要少的时候,上下文切换其实并不会很多。但是当占用 CPU 多的线程比核数还多的话, 上下文切换就会频繁发生了。
简单来说,这与 CPU 硬件和操作系统调度算法有关。
对操作系统来说,每一个进程都有优先级,同级的进程们均分 CPU 时间,而每个进程下有若干线程,线程也有优先级,同样的,同级的线程们均分所属进程的 CPU 时间。
以一个 2 核心,每核心 2 线程的 CPU 举例,它可以同时运行
2x2 = 4
个独立线程。假设某进程开了 5 个线程(同级),共享 CPU 时间 T,则每线程分得时间
T/5 = 0.2T
,为了在 4 核心上公平使用,必然至少有一个核心需要切换线程,典型如(本表仅为粗略展示,不代表实际情况)
若进程改成 4 个线程运行,理想情况下,每个 CPU 核心都不需要切换线程上下文,且 CPU 使用率最高。
至于为什么切换线程会影响性能,很大原因是 CPU 指令缓存失效导致。
CPU 带有多级缓存,如
切换线程一般会清空缓存,那么新线程就得重新加载缓存。
注
这里所说的节省线程切换开销,指单个进程,不是整个系统。