关于三者的概念,网上有非常多的文章去介绍,但是每个作者的业务能力不同,叙述的方式也不同,本文旨在以一个初学者的角度去描绘三者的异同及功效。不涉及深层次的原理,如有纰漏请予以斧正。
一、概念
本章主要是介绍一下概念型的东西,经过加工后相对会比较好理解。也可以先略过本章节。
1、 基础
操作系统(OS):管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。
程序(Program):即代码,是一个没有生命的实体。
当操作系统执行程序时,需要在计算机内存中开辟一个独立空间,此时程序成为了一个活动的实体,我们称其为进程。
进程(Process):是操作系统进行资源分配和调度的基本单位,是操作系统结构的基础。
进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
进程是线程的容器,每个进程至少拥有一个线程。
线程(Thread):别名轻量进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位,是程序执行流的最小单元。
线程是协程的容器,每个线程可以有0~无限(理论上)个协程。
协程(Coroutine):是单线程下的并发,又称微线程 。协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。
维度 | 进程 | 线程 | 协程 |
---|---|---|---|
调度者 | CPU | CPU | 用户/代码 |
分配资源 | 有 | 无 | 无 |
个数限制 | - | ≥1 | 0~∞ |
修改共享数据 | - | 加锁 | 无需加锁 |
2、 延伸
阻塞:干不完就一直干,干完再回来
并行运行:总线程数<= CPU数量
并发运行:总线程数> CPU数量
3、多线程、多进程
维度 | 多进程 | 多线程 | 占优 |
---|---|---|---|
数据共享、同步 | 数据共享复杂,需要用IPC;数据是分开的,同步简单 | 共享进程数据,数据共享简单,同步复杂 | - |
内存、CPU | 占用内存多,切换复杂,CPU利用率低 | 占用内存少,切换简单,CPU利用率高 | 线程 |
创建销毁、切换 | 创建销毁、切换复杂,速度慢 | 创建销毁、切换简单,速度很快 | 线程 |
编程、调试 | 编程简单,调试简单 | 编程复杂,调试复杂 | 进程 |
可靠性 | 进程间不会互相影响 | 一个线程挂掉将导致整个进程挂掉 | 进程 |
分布式 | 适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单 | 适应于多核分布式 | 进程 |
参考资料:《多线程还是多进程的选择及区别》
二、类比
1、叙述场景:
有一间餐厅,厨房里有一口电磁炉、一个水龙头等设施和一个厨师。起初,生意惨淡,厨师一个人炒菜,还忙的过来。但是随着生意的发展,前来就餐的顾客越来越多,这让厨师忙的焦头烂额,由于出餐速度慢,收到了不少投诉。
2、假说前提:
- 出一道菜的整个流程包括:炒菜4分钟,休息1分钟,雷打不动;
- 一位厨师一时间只管出一道菜,在走完整个出菜流程之前,绝不分心,绝不退出厨房(同步IO阻塞);
- 厨房仅能容纳一人作业(一个CPU核心上同一时间仅能运行一个线程)。
3、解决方案:
我们如需要改善餐厅的经营情况,务必要提高出菜效率,那么提供以下几种方式:
- 增加若干完整的厨房:两个厨房同时出菜,可以提高效率;
- 只增加人手:由于厨房只能容纳一人,那么一个人出菜的时候,另一个人只能等待,无法提高效率;
- 招若干个休息的时候愿意让出厨房的厨师:每道菜可以节约厨师休息的时间。
4、对应关系:
- CPU核心 = 厨房
- 资源 = 水+电+人+物料+场地...
- 程序 = 出菜的方法
- 进程 = 厨房+配套设施+厨师+要出的菜
- 线程 = 厨师
- 阻塞 = 厨师休息时间厨房没有产出
5、解析:
- 方法1,对应多核CPU运行多个进程,是简单粗暴的提升效率的方式;
- 方法2,对应使用多线程(抢占),但是由于一个CPU核心上同一时间只能有一个线程在运行,故此无法提高程序效率;
- 方法3,对应使用协程(注意协程也是一种线程),没有打破上一条中的原则,它是通过协作的方式并非是抢占,在一个线程等待的时候,让出CPU的使用权,直到那个线程交还CPU使用权它才继续执行。这种方式提高了CPU的使用效率。
网友评论