Operating system 什么';设备队列和等待队列的区别是什么?

Operating system 什么';设备队列和等待队列的区别是什么?,operating-system,scheduling,Operating System,Scheduling,我的理解是,等待队列正在等待I/O请求,所以看起来设备队列要么和等待队列相同,要么是它的子集?在等待队列中是否有进程,但在设备队列中没有 设备队列和等待队列有什么区别 让我们假设(为了好玩!)您有一个微内核和一个硬盘驱动程序作为一个进程在用户空间中运行,其中特定的设备驱动程序维护某种数据结构(一个FIFO队列、每个IO优先级的不同队列、某种树等),以跟踪其设备的挂起操作,并且该数据结构位于设备驱动程序进程的虚拟地址空间中,以便设备驱动程序能够快速访问它。我可能会(如果它只是一个FIFO队列而不是

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

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

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

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

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

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


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

因此,设备队列/ADT是从设备驱动程序的角度来看的,“等待什么”很重要,当说等待队列,最终等待某个不存在的东西时,即事件,不需要队列,对吗?@ptr_user7813604:对,可能。请注意,每个操作系统开发人员都会做他们认为适合自己操作系统的事情(例如MS-DOS没有任何队列),然后发明自己的术语来描述它。@ptr_user7813604:for events;若发送方在接收方准备好接收之前无法发送,则不需要队列,若发送方可以在任何时候发送,则需要某种队列或缓冲区。在我的设计中,大多数东西(包括事件)都是基于异步消息构建的,每个线程在内核空间中都有一个(FIFO)“消息队列”(加上一组用于优先级消息的标志,如“IRQ消息”)。驱动程序经常检查消息,并根据收到的“请求消息”构建自己的数据结构(包括处理以前收到的请求的取消)。我正在学习线程,打开了大约10个wiki选项卡,并且有一些问题,也许您可以稍后再看。