基本 QoS 算法?

Basic QoS Algorithm?

我有一个连续的循环从 ConcurrentQueue 发送数据包:

    ConcurrentQueue<packet> queue = new ConcurrentQueue<packet>();

    while(true){
        packet data;
        if (!queue.TryPeek(out packet)) continue;
        send(data);
        queue.TryDequeue(out data); //remove sent packet from the queue
    }

特定端口上的每个数据包都有分配的优先级(空、低、中、高)等

    public struct packet
    {
        public byte[] data;
        public uint Length;
        public address addr;
        public string priority;
    }

我可以使用哪种算法先发送高优先级数据包而不阻塞队列中的其他数据包?

示例:

    while(true){
        packet data;
        if (!queue.TryPeek(out packet)) continue;
        foreach(packet x in queue)
        {
            if(x.priority == "high")
            {
                send(data);
                queue.TryDequeue(out data);
            }
        }
        send(data);
        queue.TryDequeue(out data);  
    }

示例将不起作用,因为仅发送和删除队列中的第一个数据包。 我不确定这是否是正确的方法。

我想你连用 4 个不同的队列。每个优先级一个队列。类似于:

while(true){
    packet data;
    if (highPriorityQ.TryDequeue(out data))
    {
            send(data);
            continue;
    }

    if (mediumPriorityQ.TryDequeue(out data))
    {
            send(data);
            continue;
    }

    // ...
}

一些建议:直接使用TryDequeue,你可能运行陷入TryPeekTryDequeue之间的死锁。另外,尽量避免While(true)。看到这个问题Is it safe to put TryDequeue in a while loop?