multithreading - 从持久性存储读取时,CPU核心是否繁忙?

标签 multithreading file io multiprocessing

一般而言,当进程线程进行读取系统调用时,线程的执行将被挂起,并且读取本身会在OS内核中发生(或计划发生)。一旦读取完成,内核便调度挂起的线程以继续执行。我了解这部分。

我的问题是,当内核从持久性存储(例如HDD或SSD)读取数据时,是否有CPU内核忙于编排该读取内容?

我要求帮助确定进程中的最佳线程数。例如,如果我有一个4核CPU,并且进程中的一个线程在读取系统调用中阻塞,那么在等待读取完成时,还有多少个其他线程可以并行运行? 3? 4?在3到4之间更细微的东西?

最佳答案

否,读取操作不会使CPU内核繁忙。

这是(非常)简化的描述,当您尝试从驱动器读取数据时发生了什么:

  • 应用程序要求操作系统读取。
  • 如果正在读取文件:文件系统将检查其缓存。如果请求的数据在缓存中,则会立即返回。如果否,则文件系统要求存储驱动程序从驱动器中获取数据。请参阅下一步。
  • 存储驱动程序向存储设备(例如硬盘驱动器)发送请求以获取数据。然后,驱动器将异步处理此请求。
  • 操作系统使应用程序进入休眠状态(更确切地说,是等待读取的线程)。
  • ...一段时间过去了...
  • 存储设备已完成读取请求的数据。它引发一个中断。
  • 调用OS/驱动程序的中断处理程序,该处理程序将数据复制到应用程序的内存中。
  • 应用程序的阻塞线程已解除阻塞并计划执行。
  • 应用程序的线程继续运行。

  • 从中可以看出,没有繁忙的等待在任何地方。当应用程序被阻止等待读取时,CPU可以用于其他任务(如果没有其他任务,则可以使其空闲)。

    编辑:正如评论中提到的osgx一样,有一些异常(exception)。至少在Linux中,网络和存储层都在某些情况下诉诸忙轮询,这种情况下,阻塞只是比异步继续要快。

    关于multithreading - 从持久性存储读取时,CPU核心是否繁忙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44203714/

    相关文章:

    c# - 是 new Thread(() => {//logic}).Start();可接受在 Web 应用程序 page_load 中执行逻辑 "asynchronously"

    Python 线程在 Python 中使用 ctrl-c 退出

    java - 线程中断

    c# - 为单独的线程使用不同的 .config 文件 (.NET/C#)

    c++ - 获取用户计算机上的文件和文件夹列表,文件名由文本行过滤

    c - 二进制形式的文件

    java - Spring 。访问webapp\resources目录

    java - 如何逐行读取 String Builder

    io - 接受用户输入

    c - 使用 MPI-IO 读取多个文件