ZoyaPatel

概念辨析:看懂CPU的上下文切换和线程阻塞

SohaniSharma

## 上下文切换是指操作系统保存当前执行的进程或线程的状态(称为“上下文”),并将 CPU 的控制权转移到另一个进程或线程。简单来说,它是操作系统 切换 当前正在运行的程序,以便执行其他任务。{alertInfo}

由人工编写审核,非AI生成内容,请放心观看!

{getToc} $title={文章目录} 

上下文切换(Context Switching)

上下文切换是指操作系统保存当前执行的进程或线程的状态(称为“上下文”),并将 CPU 的控制权转移到另一个进程或线程。简单来说,它是操作系统 切换 当前正在运行的程序,以便执行其他任务。

  • 作系统会保存当前进程(或线程)在 CPU 中的状态,比如寄存器的值、程序计数器(PC)、堆栈指针等。这些信息一起构成了当前进程的上下文。
  • 加载目标进程的上下文:然后,操作系统会加载另一个进程的上下文,恢复该进程在 CPU 中的状态。
  • 切换执行:最后,操作系统将 CPU 的控制权交给目标进程,从而实现了进程的切换。

操作系统的调度策略和上下文切换

虽然 线程执行 I/O 操作时 CPU 是否自动进行上下文切换与 I/O 模式相关,但 上下文切换本质上由操作系统调度器管理。操作系统基于以下几个条件决定是否进行上下文切换:

  • 线程阻塞:当线程进入阻塞状态时(如执行阻塞 I/O),操作系统会进行上下文切换。
  • 时间片用完:操作系统可能基于 时间片轮转(time slicing)策略进行上下文切换,即使线程没有阻塞,CPU 时间片到期时也会进行切换。
  • 优先级调度:操作系统可能根据线程的优先级来决定是否进行上下文切换。

举个例子:阻塞 I/O 和非阻塞 I/O 之间的上下文切换

假设你有两个线程:

  1. 线程 A:执行 read() 操作,读取文件内容。
  2. 线程 B:执行计算任务或其他工作。

在阻塞 I/O 下:

  • 线程 A 执行 read(),假设文件内容尚未准备好,线程 A 会进入 阻塞 状态。
  • 操作系统会 自动进行上下文切换,把 CPU 控制权交给线程 B。
  • 当线程 A 的 read() 完成时,操作系统会恢复线程 A 的执行。

在非阻塞 I/O 下:

  • 线程 A 执行 read(),如果没有数据准备好,它会立即返回(例如返回 EAGAIN)。
  • 线程 A 不会被阻塞,而是继续执行后续任务,操作系统不会进行上下文切换,除非线程 A 自愿放弃 CPU,或者系统调度决定让其他线程运行。

6. 结论

  • 线程进行阻塞 I/O 操作时,操作系统会进行上下文切换,将 CPU 控制权交给其他线程,直到阻塞操作完成。
  • 线程进行非阻塞 I/O 操作时,如果没有数据,线程不会被阻塞,操作系统不会进行上下文切换,线程可以继续执行其他任务,直到 I/O 状态发生变化。

简而言之,线程进行 I/O 时,是否会进行上下文切换,取决于 I/O 模式(阻塞 vs 非阻塞),以及 操作系统调度策略 

版权声明:感谢您的阅读,资源整理自网络,如果您发现任何侵权行为,请联系 理科生网 管理人员,管理员将及时删除侵权内容。否则均为 理科生网 原创内容,转载时请务必以超链接(而非纯文本链接)标注来源于理科生网及本文完整链接,感谢!{alertInfo}

Ahmedabad
Kolkata
Hyderabad
后一页 Bangalore 前一页

Random Manga

Ads

نموذج الاتصال