【问题标题】:What's the difference between device queue and waiting queue?设备队列和等待队列有什么区别?
【发布时间】:2018-12-04 15:13:34
【问题描述】:

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

【问题讨论】:

    标签: operating-system scheduling


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 所以设备队列/ADT是从设备驱动的角度来看的,说等待队列时“等待什么”很重要,最后等待对于不存在的东西,即事件,不需要队列,对吧?
    • @ptr_user7813604:是的,可能。请注意,每个操作系统开发人员都会做他们认为适合他们操作系统的事情(例如 MS-DOS 没有任何队列),然后发明他们自己的术语来描述它。
    • @ptr_user7813604:用于事件;如果发送方在接收方准备好接收之前无法发送,则不需要队列,如果发送方可以随时发送,则需要某种队列或缓冲区。对于我的设计,大多数事物(包括事件)都是基于异步消息构建的,并且每个线程在内核空间中都有一个(FIFO)“消息队列”(加上一组用于诸如“IRQ 消息”之类的优先级消息的标志)。驱动程序经常检查消息并根据他们收到的“请求消息”构建自己的数据结构(包括处理先前收到的请求的取消)。
    • 我正在了解大约 10 个 wiki 选项卡打开的线程,并且有一些问题,也许你可以稍后看看。
    猜你喜欢
    • 2011-11-10
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2014-08-03
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多