首先需要了解几个概念
并发 (Concurreny) 与 并行 (Parallelism)

并发
1 | ⼩小明可以⼀边玩⼿手机⼀边看电视。 |
事实上,⼩小明的眼睛在看电视的时候并不能看⼿手机,他在看手机的时候也没办法盯着电视屏幕。
他的眼睛⻜快的在两个屏幕上切换
这不是真正意义上的同时进行,但⼜是客观存在同时进行两件事,这叫并发
并行
1 | ⼩明可以⼀边坐公交⼀边听音乐。 |
这两件事互不干扰,⼩明可以做到真正意义的同步同时进行,这叫并行
真正意义上的同时进行,这叫并行
CPU 时间片
时间片即 CPU 分配给各个程序的时间,在 Linux 的内核处理过程中,每一个进程/线程默认会有一个固定的时间片来执行命令(默认为1/100秒),每个进程/线程
被分配一个时间段执行,使各个程序从表面上看是同时进行的。
如果在时间片结束时进程还在运行,则 CPU 将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则 CPU 当即进行切换,而不会造成 CPU 资源浪费。由于只有一个 CPU ,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。

进程、线程和协程之间的区别
进程(Process)
进程让操作系统的并发成为了可能,它是资源分配的最小单位 。每个进程来对应一定的内存空间,并
且只能使⽤它⾃⼰的内存空间,各个进程之间互不干扰。进程同时也保存了了程序每个时刻的运行状态,
为 进程切换 提供了可能。当进程暂停时,它会保存当前进程的状态(进程标识,进程使⽤用的资源
等),在下一次切换回来时根据之前保存的状态进行恢复,接着继续执行。
特点
- 进程之间不共享任何状态
- 进程的调度由操作系统完成
每个进程都有自⼰独⽴的内存空间
由于进程⽐较重量,占据独立的内存,所以创建、销毁和上下⽂进程间的切换开销(栈、寄存器、 ⽂件句柄等)⽐较⼤。
- 由于进程间之间互不不干扰,各⾃拥有自⼰的内存空间, 因此相对于线程比较安全, 所以不同进程之间的数据只能通过 IPC (Inter-Process Communication) 进行通信共享,通讯效率比较低。
线程 (Thread)
每个进程⾄至少有一个线程。线程是依赖于进程的,是操作系统能够进⾏运算调度的最小单位。也称为 「微进程」 。线程的出现是为了降低上下文切换的消耗,提⾼系统的并发性,并突破⼀个进程只能⼲一 样事的缺陷,使到进程内并发成为可能。
进程让操作系统的并发性成为了可能,⽽线程让进程的内部并发成为了可能。
特点
⼀个进程可以包含多个线程,但是这些线程共享进程占有的内存地址空间和资源。线程之间共享变量,解决了了通讯麻烦的问题
线程能够共享进程的⼤部分资源,创建、销毁和上下文切换开销比较小。 线程之间的通讯除了了可以使用进程之间通讯的⽅式以外还可以通过共享内存的⽅式进行通信,通讯效率较高
- 多线程是不安全的,当一个线程崩溃了了,会导致整个进程也崩溃了,即其他线程也挂了, 但多进程⽽不 会,一个进程挂了了,另⼀个进程依然照样运行。
协程 (Coroutine)
协程是一种⽤户态的轻量级线程,它的调度不来⾃于系统,⽽是完全来自于⽤用户控制。协程拥有⾃己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其 他地方,在切回来的时候,恢复先前保存的寄存器器上下文和栈,直接操作栈则基本没有内核切换的开销,所以上下文的切换非常快。不不过协程本身⽆法利用多核 CPU,因为它基于线程,⽽线程⼜依赖于进程。
特点
- 协程的调度完全由⽤用户控制
- 本身无法利用多核 CPU
- 可并发执行
- 更好的利用 CPU,不用把 CPU 浪费在线程调度和上下文切换上
- 协程可以更好的利用内存,不用全都分配⼀个偏大的空间,只需要分配需要的对应空间即可
- 协程需要保证程序是⾮堵塞
- 切换开销远比线程小
总结
对于 进程、线程,都是有内核进行调度,有 [CPU 时间片][#CPU 时间片] 的概念
对于 协程(用户级线程),这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的,因为是由用户程序自己控制,那么就很难像抢占式调度那样做到强制的 CPU 控制权切换到其他进程/线程,通常只能进行 协作式调度,需要协程自己主动把控制权转让出去之后,其他协程才能被执行到
进程 与 线程 在 linux 中的区别
进程和线程其实在 linux 中区别并不大,具体内容可以查看这篇文章