以下是一些单核cpu多线程的疑问,求解答(都指单核)。 1.如果一个进程有n个任务要处理,因为终究是在一个cpu上跑,所以这n个任务在一个线程还是多个线程上跑,执行的总时间是一样的(多线程,线程切换可能更浪费时间)? 2.是否进程开多线程就能抢到更多的cpu时间,python这种带GIL的估计是没戏了,那么java呢? 3.自己抢到更多cpu,机器上的其它程序不就cpu时间少了么?是因为cpu大部分时间都是空闲的,不怕抢?还是因为在做应用层开发的时候,是不用考虑其它程序能不能抢到cpu时间的。 4.一个进程所有线程能抢到的时间片总和是有最大值吗?一个线程一次能拿到多长的cpu时间? 综上,我的最大疑问就是:对于单核cpu而言,开多线程难倒只能防止阻塞么?
(以下回答均针对单核CPU) 问题1概括下来就是很多人喜欢争论的多线程究竟能不能提高性能? 首先,回答是“能或者不能”。至于“不能”你已经理解了,那么我来说说为什么多线程“能”提高性能。要知道一个作业可不总是CPU密集型的,必然穿插着大量的IO调用在其中。而IO的一个特性就是阻塞等待。这个阻塞等待的时间消耗往往是远远大于线程切换所消耗的时间的,如果你要访问10个url获取接口内容,假如一次http访问平均阻塞时间大概是1s,那么你是一个一个的线性访问快还是10个线程访问快?相信不用算也知道多线程肯定更快。 最后就可以得出结论,多线程在CPU密集型的作业下的确不能提高性能甚至更浪费时间,但是在IO密集型的作业下则可以提升性能(或者更准确点说叫平均响应时间)。
问题2,进程是最小作业单元(linux进程和线程在cpu视角来看并没有多大区别,主要是堆栈是不是共享),CPU对进程的调度是统一的。所以多线程无法促进进程被CPU青睐。
python的GIL只在CPU密集型的作业下显现的,通常的业务充斥着大量的IO,所以如果你不是做科学计算,那么放心大胆的使用多线程吧。
问题3,4,虽说操作系统有自己的调度策略,比如争抢,时间片轮转,但是用户态进程仅仅想通过自身应用级的代码实现如多线程等手段企图加大自身的CPU调度权重是不行的,不过自身的线程是可以实现优先级设置的。也就是说CPU给你整个进程的资源是有限且无法更改的,但是这些资源如何分配你是可以参与的,比如设置线程的优先级,也只是参与不能主导CPU在某个线程的调度时间,这个是无法控制的。跟当时的系统压力有关。
综上,你的问题提到了“阻塞”,这是服务端编程永恒的经典话题。不管是多进程,多线程,还是协程,大多都是致力于解决IO问题,说白了都是怎么样把阻塞变成非阻塞的手段。