消息队列优先级

STREAMS 调度程序严格以先进先出 (FIFO) 方式运行,以便每个 QUEUE 服务过程按其调度顺序接收控制。

当服务过程接收控制时,它可能会在其消息队列上迂到多条消息。 如果放置过程对消息进行排队的时间与 STREAMS 调度程序调用关联服务过程的时间之间存在较长的时间间隔,那么会发生此构建。 在此时间间隔内,可能会有多个对 put 过程的调用导致多条消息。 除非流量控制阻止,否则服务过程将处理其消息队列上的所有消息。 每条消息都必须通过连接其在流中的源和目标的所有模块。

如果在所有 QUEUEs 中使用了服务过程,并且没有消息优先级,那么将在处理所有流上的所有其他调度消息之后处理最近调度的消息。 在某些情况下,包含紧急信息 (例如中断或警报条件) 的消息类型必须快速通过流。 为了适应这些情况, STREAMS 会将优先级分配给消息。 这些优先级对队列中的消息进行排序。 每条消息都有一个与其关联的优先级区域。 普通消息的优先级为 0。 消息优先级范围从 0 (普通) 到 255 (最高)。 这将在流中提供多达 256 个消息流频带。 (请参阅 图 1。)

图 1。 队列上的消息排序
此图显示了右侧和左侧尾部的连续消息排序的头。 在头,是高优先级消息,其次是优先级频带 n 消息。 下一个点框表示 n 和 2 之间的所有带状区域。 以下 (向左) 是优先级段 2 消息和优先级段 1 消息。 在尾部 (左侧) 端是正常频带 0 消息。

高优先级消息不受流量控制影响。 将忽略它们的优先级频带。 putq 实用程序将高优先级消息放在消息队列的头,后跟优先级频带消息和普通消息。 STREAMS 可防止高优先级消息被流量控制阻塞,并使服务过程在处理过程队列上的所有其他消息之前处理这些消息。 此过程将导致高优先级消息在最短延迟的情况下通过每个模块。

通常,除非 QUEUE 包含服务过程,否则 QUEUE 中不存在消息队列。 将消息传递到 putq 实用程序以调度消息进行服务过程处理时, putq 实用程序会按优先级顺序将消息放在消息队列上。 高优先级消息位于所有普通消息之前,但位于队列中的任何其他高优先级消息之后。 其他消息将放置在已在队列中的具有相同优先级的消息之后。 STREAMS 实用程序在每个优先级频带内以 FIFO 方式将消息传递到处理服务过程。 服务过程不知道消息优先级,并接收下一条消息。

消息优先级由消息类型定义; 创建消息后,无法更改其优先级。 某些消息类型采用等效的高/普通优先级对 (例如, M_PCPROTO 和 M_PROTO) ,以便模块或设备驱动程序在发送信息时可以在两个优先级之间进行选择。