进程
读书那会学linux时书本上都会写一句非常经典的话,进程是系统资源分配和调度的基本单位。也不理解啥意思,纯背概念,反正老师说考试会考。导致只对这一句话印象特别深刻。
程序是指令、数据及其组织形式的描述,进程是程序的载体。程序本身是没有生命周期的,只是存在于磁盘上的一些指令集合,但程序一旦被运行起来就是进程。启动后的进程会依赖操作系统的调度完成生命周期的转换。
无论操作系统是单核系统还是多核系统,看起来似乎一个CPU在并行的调度多个进程,其实只是操作系统背后的调度逻辑来通过切换上下文来实现的并发执行,本质上在某一时刻一个CPU只能执行一个进程。只不过切换时间片特别短让我们认为是在并行执行。
并发: 同一时刻只有一个进程/线程运行,其余都阻塞等待调度
并行: 同一时刻有多个进程/线程同时运行
线程
线程为程序调度的最小单位,也就是说一个进程中可以包含多个线程,线程状态也是交由操作系统调度。线程的状态分为新建状态、运行状态、阻塞状态、就绪状态、终止状态,线程之间的切换和进程一样也需要系统进行上下文切换完成。
各个语言的线程概念只是对操作对象中的线程做了一层封装,提供的各个api本质上也是对接操作系统api,由于线程的调度需要操作系统来进行上下文切换资源消耗比较猛。所以出现了更加轻量级的协程。
协程
协程是一种更加轻量级调度单位,协程不被操作系统内核所管理,而完全是由程序所控制。
之所以轻量级也是因为避免操作系统频繁的从用户空间切换到内核空间进行调度的资源消耗,直接在用户空间的代码中管理协程的声明周期,适用于大量并发下的IO事件,这也是Golang风靡全球的原因之一。
总结
进程与线程对比
- 线程的创建或销毁的代价比进程小且上下文切换的速度比进程快,需要频繁创建、销毁或大量计算时应优先选用线程
- 线程在CPU上的使用效率更高,需要多核分布时优先选用线程,需要多机分布时优先选用进程
- 线程的安全性、稳定性没有进程好,需要更稳定安全时优先使用进程。
线程与协程对比
- 线程属于操作系统内核管理调度,而协程属于用户空间代码中自己管理的轻量级线程。
- 线程运行状态切换及上下文切换需要内核调度,会消耗系统资源;而协程完全由程序控制,状态切换及上下文切换不需要内核参与。