STREAMS 流量控制
即使在设计良好的系统上,一般系统延迟,故障以及一个或多个流上的过度累积也会导致消息缓冲池耗尽。 此外,当一个模块中的服务过程具有长消息队列并在一次传递中处理其所有消息时,可能会发生处理突发。 STREAMS 提供了一种独立机制来保护其消息缓冲池不被耗尽,并使任何一个模块的长时间处理脉冲串最小化。
注: 流控制仅应用于正常优先级消息。
流控制机制是每个流的本地机制,是建议 (自愿性) 机制,它限制了可以在流中的任何 QUEUE 处排队进行处理的字符数。 此机制限制任何一个 QUEUE 和任何一个流中的缓冲区和相关处理,但不考虑缓冲池级别或其他流中的缓冲区使用情况。
咨询机制在包含服务过程的流中最接近的两个 QUEUEs 之间运行。 通常,仅当关联的 QUEUE 中存在服务过程时,消息才会保留在消息队列上。
当消息的服务过程处理速度与消息到达速率不同步时,或者当过程被阻止通过流控制机制将其消息放在以下流组件上时,消息将在 QUEUE 处累积。 可推送模块包含独立的上游和下游限制,这些限制是在开发者为 QUEUE 指定高水位和低水位控制值时设置的。 流头包含预设上游限制 (可由从下游发送的特殊消息修改) ,驱动程序可包含下游限制。
STREAMS 流量控制按以下顺序运行:
- 每次 STREAMS 消息处理例程 (例如, putq 实用程序) 从 QUEUE 中的消息队列添加或除去消息时,都会检查限制。 STREAMS 计算消息队列上所有消息块的总大小。
- 将总计与 QUEUE 高水位值和低水位值进行比较。 如果总计超过高水位值,那么将为 QUEUE 设置内部完整指示符。 如果设置了指示符,并且继续调度服务过程,那么此 QUEUE 中的服务过程的操作不受影响 (请参阅 服务过程)。
- 流控制处理的下一个部分发生在包含服务过程的最接近的前一个 QUEUE 中。 在流控制图 (图 1) 中,如果 D 已满且 C 没有服务过程,那么 B 是最前面的 QUEUE。
图 1。 流量控制 
- 在流控制图中, B 中的服务过程使用 STREAMS 实用程序例程来查看是否已将 QUEUE 提前标记为已满。 如果无法发送消息,那么调度程序将阻止 B 中的服务过程进一步执行。 B 保持阻塞状态,直到达到完整 QUEUE D 的低水位标记为止。
- 当 B 被阻塞 (在流控制图中) 时,到达 B 的任何非优先级消息将在其 消息队列 上累积 (请注意,不会阻塞优先级消息)。 反过来, B 可以达到完全状态,完全条件将传播回流中的最后一个模块。
- 当 D (在流控制图中) 上的服务过程处理导致消息块总数低于低水位标记时,将关闭完整指示符。 然后, STREAMS 会自动调度最接近的先前阻塞的 QUEUE (在本例中为 B) ,并获取再次移动的内容。 此自动调度称为 重新启用 QUEUE。
要使用流量控制,开发者只需要调用用于测试是否预先存在完整条件的实用程序 (例如, canput 实用程序) ,并执行一些清理操作 (如果存在)。 其他所有内容都由 STREAMS 自动处理。
有关 STREAMS 消息传递方案的更多信息,请参阅 STREAMS 消息。