【问题标题】:Basic QoS Algorithm?基本的 QoS 算法?
【发布时间】:2018-01-29 23:08:01
【问题描述】:

我有一个从 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);  
    }

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

【问题讨论】:

    标签: c# queue qos


    【解决方案1】:

    我认为你的击球手使用 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?

    【讨论】:

    • 你能解释一下如何直接使用TryDequeue吗?我已经阅读了提供的堆栈链接,但我不知道会出现什么问题。我检查以确保队列在TryDequeue 之前使用if (highPriorityQ.IsEmpty) continue; 不为空,这是否应该防止死锁?
    • 我的意思是,与其调用TryPeek,过一会儿再调用TryDequeue,不如直接调用TryDequeue,因为即使队列为空TryDequeue也不会抛出异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2012-04-20
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多