线程发展史
1、什么是进程?
进程的本质是一个正在执行的程序,程序运行时系统会创建一个进程,并且给每个进程分配独立的内存地址空间保证每个进程地址不会相互干扰。进程是操作系统分配资源的最小单位。同时,在CPU对进程做时间片的切换时,保证进程切换过程中仍然要从进程切换之前运行的位置出开始执行。所以进程通常还会包括程序计数器、堆栈指针等。
2、什么是线程?
线程可以认为是轻量级的进程,所以线程的创建、销毁要比进程更快线程是CPU的最小调度单元/最小执行单元(核心),同一进程下的所有线程共享该进程的资源,在多核CPU架构中能够实现真正的并行执行,在单核CPU架构中也能做到多个线程分时复用CPU。
何为线程的上下文切换?
CPU 在切换前把当前线程的状态保存下来,以便下次切换回这个线程时可以再次加载这个线程的状态,然后加载下一线程的状态并执行。线程的状态保存及再加载, 这段过程就叫做上下文切换。
3、什么是协程?
被称为绿色的线程,它属于用户管理而不是操作系统(OS)管理的,操作系统并不知道协程,它只知道线程,协程是在线程之上的。协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。
4、单核CPU设定多线程是否有意义?工作线程数是不是设置的越大越好?工作线程数(线程池中的线程数)设置多少合适?
对于要执行的任务,可大致分为两类:CPU密集型和IO密集型。
CPU密集型:更多的是在做一些逻辑运算,较少的时候在IO等待上,这种使用多线程本质上是提升多核 CPU 的利用率,所以对于一个 4 核的 CPU,每个核一个线程,理论上创建 4 个线程就可以了,再多创建线程也只是增加线程切换的成本。所以,对于 CPU 密集型的计算场景,理论上“线程的数量 =CPU 核数”就是最合适的。不过在工程上,线程的数量一般会设置为“CPU 核数 +1”,这样的话,当线程因为偶尔的内存页失效或其他原因导致阻塞时,这个额外的线程可以顶上,从而保证 CPU 的利用率。
IO密集型:较多的时间在IO等待上,CPU参与的较少,故在单核CPU上设定多线程对这类任务的执行是有好处的,可以提高CPU的利用率。
对于工作线程数的选择,也并非越大越好,因为线程数越多,线程的上下文切换带来的资源消耗也是需要考虑的,至于设置多少合适,有如下几种选择:
压测,结合机器的配置不断压测得出具体的数据,一般这个线程数跟
CPU的核数有关系
理论公式