正在执行阻塞系统调用的线程是否会被中断唤醒?

正在执行阻塞系统调用的线程是否会被中断唤醒?

我一直在阅读一些有关线程和中断的内容。有一节说使用线程进行并行编程更简单,因为我们不必担心中断。

但是,如果不是中断,则发出释放阻塞系统调用信号的机制是什么?

例子

我在线程中读取文件,该线程使用阻塞系统调用从磁盘读取文件。

在此期间,其他线程正在运行。

在某个时刻,文件已准备好从硬盘读取。

它是否通过硬件中断通知处理器这一点,以便它可以在请求文件的线程中进行上下文切换?

答案1

中断由操作系统处理,线程(或进程,就此而言)甚至不知道它们。

在你画的场景中:

  • 您的线程发出read()系统调用;内核收到请求,意识到线程在数据到达之前不会做任何事情(阻塞调用),因此线程被阻塞。
  • 内核为缓冲区分配空间(如果需要),并启动“找到要读取的块,请求将该块读入缓冲区”的舞蹈。
  • 调度程序选择另一个线程来使用刚刚释放的CPU
  • 一切都进展顺利,直到……
  • ...来自磁盘的中断到达。内核接管,发现这标志着之前发出的读取已完成,并将线程标记为就绪。控制权返回到用户空间。
  • 一切都进展顺利,直到……
  • ...有人出于一千个原因之一放弃了 CPU,而恰好刚刚释放的 CPU 被分配给正在等待数据的线程。

无论如何,类似的事情。不,当发生中断以指示传输完成时,CPU 不会分配给等待线程。它可能会中断另一个线程,并且执行可能会恢复该线程(或者可能会选择另一个线程)。

相关内容