通俗理解之多线程概述(一)
一、场景描述:
-
场景1:想象一个餐厅的厨房:
单线程(只有一个厨师):
- 厨师必须按顺序做事:切菜 → 炒菜 → 装盘 → 洗锅 → 再切菜 → 再炒菜...
- 如果在等水烧开,厨师只能干等着,不能做其他事
- 效率低,客人等待时间长
多线程(多个厨师协作):
- 厨师A负责切菜
- 厨师B负责炒菜
- 厨师C负责装盘和上菜
- 厨师D负责洗碗
- 大家同时工作,互不干扰,效率大大提高
- 当一个厨师在等待(比如等水烧开)时,其他厨师继续工作
-
场景2:
单线程(只有一个窗口):
- 客户A办理存款(5分钟)
- 客户B办理取款(3分钟)
- 客户C办理转账(4分钟)
- 后面的客户必须等前面的全部办完
多线程(多个窗口):
- 窗口1:客户A办理存款
- 窗口2:客户B办理取款 ← 同时进行
- 窗口3:客户C办理转账
- 大家并行办理,总体等待时间减少
-
场景3:
单线程:一个人向好友A打电话多线程:一个人(单核)用两只手(多线程)交替打两个电话
- 左手拿电话A说两句
- 快速切换到右手拿电话B说两句
- 再切换回左手...
- 两个电话都在"进行中",但同一时刻只能说一个
通过上面的例子,用一句话来讲就是把原来一个人办的事,改为多个人办事(并行),或者一个人交替办好几件事(并发),这就是多线程最简单的理解。
需要注意到的是,多线程包含并发和并行两种情况,单核情况下的产生竞争态,这个时候是并发,多核情况下,多个CPU同时运行,这个时候是并行;当然这并不意味着多核情况下完全是并行,比如涉及IO操作时,CPU(这里指的是用到DMA的现代CPU①)会腾出空来去执行执行其他线程内容
说明:
① 早期的IO是依赖CPU调度的:
- CPU发出读取指令
- CPU等待磁盘准备数据
- 磁盘把数据放到磁盘缓冲区
- CPU一个字节一个字节地从磁盘缓冲区复制到内存(CPU全程参与,无法做其他事情)
- 读取完成
而对于现代CPU:
- CPU发出读取指令给DMA控制器,会把数据读取到内存地址
- CPU继续做其他事情,CPU这个时候1. 1. 解放了
- DMA控制器接管:
- 与磁盘控制器通信
- 直接把数据从磁盘传输到内存
- 不需要CPU参与- 数据传输完成后,DMA控制器发送中断信号给CPU
- CPU收到中断,处理IO完成事件

浙公网安备 33010602011771号