首页 > 解决方案 > 设备队列和等待队列有什么区别?

问题描述

我的理解是等待队列正在等待 I/O 请求,所以看起来设备队列要么与等待队列相同,要么是它的子集?等待队列中是否有一些进程但设备队列中没有?

标签: operating-systemscheduling

解决方案


设备队列和等待队列有什么区别?

让我们假设(为了好玩!)您有一个微内核和一个硬盘驱动程序作为用户空间中的一个进程运行,其中特定的设备驱动程序维护某种数据结构(一个 FIFO 队列,每个 IO 的不同队列优先级,某种树,...) 来跟踪其设备的未决操作,并且该数据结构位于设备驱动程序进程的虚拟地址空间中,以便设备驱动程序可以快速访问它。我可能(如果它只是一个 FIFO 队列而不是什么好东西)很想将其称为“设备队列”。

我们还假设调度程序(在微内核内部)具有:

  • 某种数据结构来跟踪“准备运行”任务(等待 CPU 时间的任务)。我可能(如果它只是一个 FIFO 队列而不是什么好东西)很想把它称为“等待队列”,但更有可能我会称之为“准备运行队列”。

  • 某种数据结构来跟踪等待时间过去的任务(例如,因为它们调用了sleep())。我可能(如果它只是一个排序列表而不是什么好东西)也很想将其称为“等待队列”,但更可能的是我可能将其称为“睡眠列表”。

请注意,内核没有理由拥有一个数据结构来跟踪正在等待消息的任务(来自设备驱动程序或其他任何地方);并且只需要if(task->state == WAITING_FOR_MESSAGE) { unblock(task); }为这种情况做一个。以类似的方式,如果内核的页面错误处理程序需要让任务等待获取页面数据(例如从交换空间),它可以阻塞任务(例如并将任务的状态设置为WAITING_FOR_PAGE_DATA)并且只需要解除阻塞数据到达时的任务,也不需要数据结构来跟踪这些任务。


推荐阅读