Assembly IO请求排队
这是关于等待IO的调用,允许上下文切换,或非阻塞调用模型:Assembly IO请求排队,assembly,io,operating-system,Assembly,Io,Operating System,这是关于等待IO的调用,允许上下文切换,或非阻塞调用模型: 它们究竟是如何在操作系统中实现的 底层设备如何在指令级别上工作?例如,存储和网络硬件的确切CPU指令 一个设备一次可以挂起多少IO指令 在操作系统(例如Linux和Windows)中,一次可以排队处理多少IO请求?在何处查找其他操作系统的此信息 编辑:这是一个既广泛又具体的问题。这是关于IO设备和CPU的,操作系统使用它来完成任务-所以请回答你能回答的问题。这也是关于内存的,因为每个IO操作都涉及数据的内存(如果不是寻址的话)。x86和
IN
和OUT
指令用于向硬件设备传输1/2/4字节或从硬件设备传输1/2/4字节。x86有一个特殊的16位地址空间,用于这些指令访问的“I/O端口”。(我不知道其他架构是否也有特殊的I/O地址空间。)即使在x86上,也不是所有硬件设备都映射到该I/O地址空间。有些使用常规内存地址空间。在这种情况下,您可以使用普通MOV
指令或任何其他访问内存的指令向它们传输数据。第三种情况是使用DMA(直接内存访问)时。基本上,您可以使用前面提到的两种方法之一向硬件设备发送某种命令,告诉它:“从地址Y开始,将X字节直接传输到RAM”。然后,设备直接通过系统总线发送请求的数据,并将其存储在RAM中,而无需CPU的任何干预。当它完成时,通常会发出一个中断来让您知道nr_requests
的变量,该变量是它将持有的未完成I/O请求的最大数量。通过打印出以下伪文件,您可以找到硬盘驱动器的值:/sys/block//queue/nr\u requests
。默认值似乎是128。从读取源代码来看,128似乎也是最大值(?)通过返回挂起,驱动程序/模块通知请求正在进行。
控件从5返回。到2。其中内核被赋予写入的返回状态。
如果是成功或错误,则返回用户空间,指示成功或失败。但是,如果它处于挂起状态,它会将程序标记为等待IO(通过使用任何操作系统特定的方法)。
这是关键点,一个正在等待的任务没有计划,即使它没有其他事情可做。
从1开始。到五点。内核可以(在大多数操作系统中,并且只有当