## 上下文切换是指操作系统保存当前执行的进程或线程的状态(称为“上下文”),并将 CPU 的控制权转移到另一个进程或线程。简单来说,它是操作系统 切换 当前正在运行的程序,以便执行其他任务。{alertInfo}
由人工编写审核,非AI生成内容,请放心观看!
{getToc} $title={文章目录}
上下文切换是指操作系统保存当前执行的进程或线程的状态(称为“上下文”),并将 CPU 的控制权转移到另一个进程或线程。简单来说,它是操作系统 切换 当前正在运行的程序,以便执行其他任务。
- 作系统会保存当前进程(或线程)在 CPU 中的状态,比如寄存器的值、程序计数器(PC)、堆栈指针等。这些信息一起构成了当前进程的上下文。
- 加载目标进程的上下文:然后,操作系统会加载另一个进程的上下文,恢复该进程在 CPU 中的状态。
- 切换执行:最后,操作系统将 CPU 的控制权交给目标进程,从而实现了进程的切换。
虽然 线程执行 I/O 操作时 CPU 是否自动进行上下文切换与 I/O 模式相关,但 上下文切换本质上由操作系统调度器管理。操作系统基于以下几个条件决定是否进行上下文切换:
- 线程阻塞:当线程进入阻塞状态时(如执行阻塞 I/O),操作系统会进行上下文切换。
- 时间片用完:操作系统可能基于 时间片轮转(time slicing)策略进行上下文切换,即使线程没有阻塞,CPU 时间片到期时也会进行切换。
- 优先级调度:操作系统可能根据线程的优先级来决定是否进行上下文切换。
假设你有两个线程:
- 线程 A:执行
read()操作,读取文件内容。 - 线程 B:执行计算任务或其他工作。
- 线程 A 执行
read(),假设文件内容尚未准备好,线程 A 会进入 阻塞 状态。 - 操作系统会 自动进行上下文切换,把 CPU 控制权交给线程 B。
- 当线程 A 的
read()完成时,操作系统会恢复线程 A 的执行。
- 线程 A 执行
read(),如果没有数据准备好,它会立即返回(例如返回EAGAIN)。 - 线程 A 不会被阻塞,而是继续执行后续任务,操作系统不会进行上下文切换,除非线程 A 自愿放弃 CPU,或者系统调度决定让其他线程运行。
- 线程进行阻塞 I/O 操作时,操作系统会进行上下文切换,将 CPU 控制权交给其他线程,直到阻塞操作完成。
- 线程进行非阻塞 I/O 操作时,如果没有数据,线程不会被阻塞,操作系统不会进行上下文切换,线程可以继续执行其他任务,直到 I/O 状态发生变化。
简而言之,线程进行 I/O 时,是否会进行上下文切换,取决于 I/O 模式(阻塞 vs 非阻塞),以及 操作系统调度策略。
版权声明:感谢您的阅读,资源整理自网络,如果您发现任何侵权行为,请联系 理科生网 管理人员,管理员将及时删除侵权内容。否则均为 理科生网 原创内容,转载时请务必以超链接(而非纯文本链接)标注来源于理科生网及本文完整链接,感谢!{alertInfo}Ahmedabad