单核
单核 cpu 下,线程实际还是串行执行的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是同时运行的 。总结为一句话就是: 微观串行,宏观并行 。
一般会将这种线程轮流使用 CPU 的做法称为并发,concurrent
时间片
时间片:CPU的时间片(Time Slice)是操作系统中进行多任务处理的一种调度算法。在多任务处理环境下,当有多个进程需要共享CPU资源时,操作系统会将CPU的运行时间划分为若干个时间片段,每个时间片段被分配给一个进程使用。
时间片的长度是一个固定的时间单位,通常是几毫秒到几十毫秒之间。当一个进程的时间片用完后,操作系统会暂停该进程的执行,并将CPU分配给另一个处于就绪状态的进程,以此实现多个进程的并发执行。
采用时间片轮转调度算法的操作系统,每个进程按照就绪队列中的顺序依次获得CPU的时间片,当一个进程用完时间片后,它会被移到队列的末尾,而其他等待的进程则按顺序向前移动,准备获取CPU的时间片。
时间片的设置可以影响到系统的响应速度和吞吐量。较短的时间片可以提高系统的响应速度,但会增加上下文切换的开销;而较长的时间片可以提高系统的吞吐量,但可能导致用户的交互响应不及时。因此,在设计操作系统时需要根据具体应用场景和系统需求来合理设置时间片的长度。
多核
多核 cpu下,每个核(core) 都可以调度运行线程,这时候线程可以是并行的。
引用 Rob Pike 的一段描述:
并发(concurrent)是同一时间应对(dealing with)多件事情的能力
并行(parallel)是同一时间动手做(doing)多件事情的能力
例子
- 家庭主妇做饭、打扫卫生、给孩子喂奶,她一个人轮流交替做这多件事,这时就是并发 。
- 家庭主妇雇了个保姆,她们一起这些事,这时既有并发,也有并行(这时会产生竞争,例如锅只有一口,一个人用锅时,另一个人就得等待)
- 雇了3个保姆,一个专做饭、一个专打扫卫生、一个专喂奶,互不干扰,这时是并行。