美文网首页
Round-Robin

Round-Robin

作者: 陈成_Adam | 来源:发表于2021-02-03 09:04 被阅读0次

    Round-Robin是非常常见的一种资源调度算法。假设有100个竹篮给八个人来做,那么把八个人围成一圈:

    while (true) {
      if (这个人 空闲) 分配一个竹篮给他;
      if (没有更多竹篮) break;
      这个人 = 下一个;
    }
    

    故事

    round robin 来源于法语ruban rond(round ribbon),意思是环形丝带。

    在17、18世纪时法国农民希望以请愿的方式抗议国王时,通常君主的反应是将请愿书中最前面的两至三人逮捕并处决,所以很自然地没有人希望自己的名字被列在前面。为了对付这种专制的报复,人们在请愿书底部把名字签成一个圈(如同一条环状的带子),这样就找不出带头大哥,于是只能对所有参与者进行同样的惩罚。

    1731年,英国皇家海军最初使用了这个名词,以循环顺序签署请愿书,这样就没法找到带头大哥了。

    一种实现

    template<typename Iterator, typename Choose>
    Iterator round_robin(Iterator begin, Iterator end, Iterator &curr, Choose choose) {
        assert(curr >= begin && curr < end);
        for (auto i = curr; i < end; i++) {
            if (choose(*i)) {
                curr = i + 1;
                curr = (curr == end) ? begin : curr;
                return i;
            }
        }
        for (auto i = begin; i < curr; i++) {
            if (choose(*i)) {
                curr = i + 1;
                return i;
            }
        }
        return end;
    }
    

    GPU执行核的调度:

    enum class CoreStatus {
        BUSY = 0,
        FREE = 1,
    };
    
    int main(int argc, char *argv[]) {
        auto core_status = std::vector<CoreStatus>{
            CoreStatus::BUSY,
            CoreStatus::FREE,
            CoreStatus::FREE,
            CoreStatus::BUSY,
            CoreStatus::BUSY
        };
        auto begin = core_status.begin();
        auto end   = core_status.end();
        auto curr  = core_status.begin();
    
        auto core_free = round_robin(begin, end, curr, [](CoreStatus cs){ return cs == CoreStatus::FREE; });
    
        std::cout << static_cast<uint32_t>(*curr) << std::endl;
    
        return EXIT_SUCCESS;
    }
    

    参考资料

    [1] https://zhuanlan.zhihu.com/p/84799744

    相关文章

      网友评论

          本文标题:Round-Robin

          本文链接:https://www.haomeiwen.com/subject/wvyjtltx.html