设备队列和等待队列有什么区别?
What's the difference between device queue and waiting queue?
我的理解是等待队列正在等待 I/O 请求,因此设备队列似乎与等待队列相同或者是它的子集?是否有一些进程在等待队列中但不在设备队列中?
What's the difference between device queue and waiting queue?
让我们假设(为了好玩!)您有一个微内核和一个硬盘驱动程序 运行 作为 user-space 中的一个进程,其中特定的设备驱动程序维护某种数据结构(一个 FIFO 队列,每个 IO 优先级不同的队列,某种树,...)来跟踪其设备的未决操作,并且该数据结构位于设备驱动程序进程的虚拟地址中space 以便设备驱动程序可以快速访问它。我可能(如果它只是一个 FIFO 队列而不是什么好东西)很想称其为 "device queue".
我们还假设调度程序(在微内核内部)具有:
某种数据结构来跟踪 "ready to run" 任务(等待 CPU 时间的任务)。我可能(如果它只是一个 FIFO 队列而不是什么好东西)很想称它为 "waiting queue",但我更可能称它为 "ready to run queue".
某种数据结构,用于跟踪等待时间过去的任务(例如,因为它们调用了 sleep()
)。我可能(如果它只是一个排序列表而不是什么好东西)也很想称它为 "waiting queue",但我更有可能称它为 "sleeping list".
请注意,内核没有理由拥有数据结构来跟踪正在等待消息(来自设备驱动程序或其他任何地方)的任务;并且只需要为这种情况做一个 if(task->state == WAITING_FOR_MESSAGE) { unblock(task); }
。以类似的方式,如果内核的页面错误处理程序需要让任务等待获取页面数据(例如从交换space),它可以阻止任务(例如并将任务的状态设置为WAITING_FOR_PAGE_DATA
) 并且只需要在数据到达时解阻塞任务,也不需要数据结构来跟踪这些任务。
我的理解是等待队列正在等待 I/O 请求,因此设备队列似乎与等待队列相同或者是它的子集?是否有一些进程在等待队列中但不在设备队列中?
What's the difference between device queue and waiting queue?
让我们假设(为了好玩!)您有一个微内核和一个硬盘驱动程序 运行 作为 user-space 中的一个进程,其中特定的设备驱动程序维护某种数据结构(一个 FIFO 队列,每个 IO 优先级不同的队列,某种树,...)来跟踪其设备的未决操作,并且该数据结构位于设备驱动程序进程的虚拟地址中space 以便设备驱动程序可以快速访问它。我可能(如果它只是一个 FIFO 队列而不是什么好东西)很想称其为 "device queue".
我们还假设调度程序(在微内核内部)具有:
某种数据结构来跟踪 "ready to run" 任务(等待 CPU 时间的任务)。我可能(如果它只是一个 FIFO 队列而不是什么好东西)很想称它为 "waiting queue",但我更可能称它为 "ready to run queue".
某种数据结构,用于跟踪等待时间过去的任务(例如,因为它们调用了
sleep()
)。我可能(如果它只是一个排序列表而不是什么好东西)也很想称它为 "waiting queue",但我更有可能称它为 "sleeping list".
请注意,内核没有理由拥有数据结构来跟踪正在等待消息(来自设备驱动程序或其他任何地方)的任务;并且只需要为这种情况做一个 if(task->state == WAITING_FOR_MESSAGE) { unblock(task); }
。以类似的方式,如果内核的页面错误处理程序需要让任务等待获取页面数据(例如从交换space),它可以阻止任务(例如并将任务的状态设置为WAITING_FOR_PAGE_DATA
) 并且只需要在数据到达时解阻塞任务,也不需要数据结构来跟踪这些任务。