1
ovear 2016-11-05 11:33:22 +08:00
LZ 的操作系统没学好啊。。
这是操作系统调度的事情,现在的操作系统不可能就你的两个线程的,所以上述事情有可能发生。 虽然操作系统会进行调度,但是也会产生切换的额外开销的(周转时间) 建议去看 http://baike.baidu.com/view/399160.htm 至于具体的 CPU 占用,可以去看 Windows 的资源监视器,或者 Linux 的 top 中 cpu 那行, sirq 那个数值就是调度所产生的周转时间 https://moetu.org/images/2016/11/05/2016-11-051132425a463.png UNDERSTANDING LINUX CPU STATS http://blog.scoutapp.com/articles/2015/02/24/understanding-linuxs-cpu-stats |
2
ovear 2016-11-05 11:38:09 +08:00
噢补充一句,的确有 CPU BOUND THREAD 的,但是除非你手动制定,不然都是由操作系统进行调度的。(当然就算你程序使用 100%的 CPU ,操作系统也不会把所有 CPU 调度给你的,不然其他进程就没有资源了)
多线程的意义在于,能同时使用多个核心的 CPU 。在高负载情况下,可以跑满线程个数的 CPU 。单线程就只能跑满一个核心,对于服务器来说,同时面向多个独立的用户,相互没有关联,开线程再合适不过了 |
3
caixiexin 2016-11-05 11:54:41 +08:00 via Android
看是计算密集型还是 io 密集型,前者开一和核心数一样的线程数才有效果。还有就是编程语言, Python2.x 用这种方式也不能最大利用 CPU 。
|
4
kindjeff OP |
5
ldbC5uTBj11yaeh5 2016-11-05 12:25:43 +08:00 via Android
来来来,安利一下, go 语言大法好。
|
6
honeycomb 2016-11-05 12:48:21 +08:00 via Android
@kindjeff
线程的上下文切换有开销,但多数时候比不过尽量占用所有核心带来的好处。 Python 有 Python 的事情 可是你问的明明是类似这样的: make -j K , K 的建议值是系统可使用的逻辑内核数量 至于“有一个核在长期处理其它情况”,不意味着系统不会把其它情况的资源让出来。 |
7
kindjeff OP @honeycomb 我的疑问大概等价于:双线程的程序的两个线程,能确保用到两个核心吗?如果很多情况下不能的话,用双线程并不一定就比三线程好。
|
8
ldbC5uTBj11yaeh5 2016-11-05 13:13:01 +08:00
@kindjeff 不考虑到 IO 等待,的确是线程(进程)数 = CPU 核数最好。
加入 IO 等待因数就非常复杂,实践的做法是 1. 把 network io 都异步(非阻塞)化。 2. 把 file io 搞成伪异步话(底层一般还是一个透明不可见的独立线程池) 做的比较好的有 nginx, golang |
9
ldbC5uTBj11yaeh5 2016-11-05 13:14:53 +08:00 1
排队论的利特尔法则可以稍微解释了楼主的疑问,但是现实世界比排队论复杂很多。
所以就各显神通了,目前 golang 是最棒哒。 |
10
ldbC5uTBj11yaeh5 2016-11-05 13:24:33 +08:00 1
为什么说 golang 是最棒哒?
解决现实问题的模型大约有下面三种 1. nginx 是多进程+状态机,门槛太高。(当然 ngx_lua/openrestry 降低这个门槛) 2. golang 是多核协程,无脑傻瓜。(小学生都会写并发 /并行程序了) 3. mac 的 gcd, intel 的 tbb , 大多用来处理特定的领域问题,学习成本也不友好。 至于带 GIL 脚本语言加多进程,呵呵,那能叫高并发程序么? |