01为什么看起来像“同时运行”?
你可能一边听音乐,一边浏览网页,还开着聊天软件和下载任务。 这些程序看起来都在“同时运行”。
但“都在运行”并不等于“所有程序的每条指令都在同一时刻执行”。 操作系统会安排很多任务轮流获得 CPU 时间, 切换速度非常快,所以我们感觉它们都在一起工作。
操作系统调度
不断决定接下来让谁运行
CPU
执行被安排好的线程
02程序、进程和线程有什么关系?
磁盘上的程序文件只是代码和数据。 当程序被启动后,操作系统会创建进程(Process)。
而真正被 CPU 调度执行的,通常是进程里的线程(Thread)。 一个进程可以只有一个线程,也可以有很多线程。
程序文件
静态保存在磁盘中
进程
拥有自己的地址空间和运行资源
CPU 调度线程
线程获得处理器时间后执行
03操作系统怎样安排谁先用 CPU?
操作系统内核里有负责调度的机制。 它会根据线程是否就绪、优先级、系统策略等因素, 决定接下来让哪个线程获得 CPU 时间。
就绪队列
调度器
选择下一个要运行的线程
正在运行
被选中的线程得到 CPU
04CPU 怎样快速换任务?
假设 CPU 正在执行浏览器线程,现在操作系统决定改为执行音乐线程。 它不能直接“忘掉浏览器做到哪了”。
系统需要保存当前线程的重要运行状态,再恢复另一个线程之前保存的状态。 这类切换叫上下文切换(Context Switch)。
浏览器正在运行
寄存器里保存着当前执行状态
保存状态
保存必要的寄存器等上下文
恢复另一个线程
恢复音乐线程之前的运行状态
继续执行
音乐线程从合适的位置继续
05程序等待时,CPU 在做什么?
很多程序并不是一直都需要 CPU。 它们经常会等待网络、磁盘、键盘输入或其他设备。
浏览器
正在等待网站数据返回
进入等待状态
暂时不需要占用 CPU
CPU 去做别的任务
执行其他已经就绪的线程
当网络数据、磁盘数据或其他事件准备好以后, 等待中的线程可以重新变成“就绪”,以后再次获得 CPU 时间。
06多核 CPU 会让任务真正同时执行吗?
会。 如果 CPU 有多个核心,那么不同核心可以在同一时刻真正执行不同线程。
单核心
同一时刻只能执行一个指令流,但可以快速切换
多核心
多个核心可以真正并行执行多个线程
07为什么程序开太多还是会变慢?
多任务并不是没有代价。 程序越多,CPU、内存、存储和其他资源的竞争可能越激烈。
CPU 太忙
太多就绪线程争抢有限的处理器时间
内存不足
系统可能需要更频繁地回收、压缩或换出内存页面
存储繁忙
很多程序同时读写磁盘会互相影响
切换也有成本
上下文切换本身也需要时间
所以操作系统的目标不是“让所有程序都无限快”, 而是在有限硬件资源下,尽量让系统响应及时、资源公平、整体效率高。
你已经知道了什么
- 电脑可以让很多程序处于运行状态,这叫多任务或并发。
- 真正被 CPU 调度执行的通常是线程,而不是磁盘上的程序文件本身。
- 操作系统调度器会不断决定哪些就绪线程获得 CPU 时间。
- 线程切换时,系统会保存和恢复必要的运行状态,这叫上下文切换。
- 程序等待网络、磁盘或输入时,通常可以暂时让出 CPU。
- 单核 CPU 可以靠快速切换实现并发,多核 CPU 还能真正并行执行多个线程。
- 并发不等于并行,“很多程序都在运行”不等于“所有程序此刻都在执行指令”。
- 程序开得太多仍会变慢,因为 CPU、内存、存储和切换本身都有成本。
下一个问题: 如果操作系统已经会调度程序, 那为什么电脑有时候还是会突然变得很卡? 下一篇:电脑为什么有时候会变卡?