通俗理解之多线程概述(一)

一、场景描述:

  • 场景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调度的:

  1. CPU发出读取指令
  2. CPU等待磁盘准备数据
  3. 磁盘把数据放到磁盘缓冲区
  4. CPU一个字节一个字节地从磁盘缓冲区复制到内存(CPU全程参与,无法做其他事情)
  5. 读取完成

而对于现代CPU:

  1. CPU发出读取指令给DMA控制器,会把数据读取到内存地址
  2. CPU继续做其他事情,CPU这个时候1. 1. 解放了
  3. DMA控制器接管:
    - 与磁盘控制器通信
    - 直接把数据从磁盘传输到内存
    - 不需要CPU参与
  4. 数据传输完成后,DMA控制器发送中断信号给CPU
  5. CPU收到中断,处理IO完成事件
posted @ 2026-02-05 00:02  泾渭分明  阅读(1)  评论(0)    收藏  举报