zoukankan      html  css  js  c++  java
  • 一个平均分配算法

    第一种情况

    这种情况要求需要分配的任务数量可以动态变化,执行任务的 worker 数量是固定的
    经常会有一种场景,比如把 100 个线程均匀分到 8 个核上。把 16 条链路的流量均匀分到 8 个端口上。那么我们需要一种能均匀分配的算法。
    如下,一个 demo 程序,假设有 4 个核,11 个任务,那么我们可以按如下来分配。

    #include <stdio.h>
    
    int main()
    {
        int count = 11;
        int cores = 4;
        for (int idx = 0; idx < cores; idx++)
        {
            int min = count * idx / cores;
            int max = count * (idx + 1) / cores;
            for (int i = min; i < max; i++)
                printf("core %d will run task %d
    ", idx, i);
        }
    }
    

    运行结果如下:
    可以看出,任务被均匀分到 core 上。

    第二种情况

    这种情况要求需要分配的任务数量是个定数,执行任务的 worker 可以是动态变化的
    之前做数据中心交换机的时候存在一种情况:交换芯片互联的 HG 口可能由于某种原因而 down 掉,这时候需要对该端口的流量做平滑切换,尽量保证不丢包!这属于一种很重要可维护性手段!截至目前(2021)现在阿里巴巴数据中心交换机也是这种方案。

    这里假设芯片 A 互联的 HG 口有最多有9个,那么如果存在端口 DOWN 的情况,可以利用的端口个数为 0-9.
    假设当前可用端口为 5 个那么流量分布应该是如下情况:

    HG0 HG1 HG2 HG3 HG4
    1 1 1 1 1
    1 1 1 1 0

    这时候增加一个端口的话应该是如下情况:

    HG0 HG1 HG2 HG3 HG4 HG5
    1 1 1 1 1 1(X)
    1 1 1 0(X) 0

    这时候减少一个端口的话应该是如下情况:

    HG0 HG1 HG2 HG3
    1 1 1 1
    1 1 1 1
    1 0 0 0

    可以看出来每次都是一个标准的均匀分配,那么我们只需要把变化前后的不一样的地方选出来,这样只针对性的切换需要变化的流量,就能做到做最小的改动,从而使分配转移到最佳状态。
    示例代码后续补上。。。

  • 相关阅读:
    LeetCode 338. 比特位计数
    LeetCode 208. 实现 Trie (前缀树)
    初识restful api接口
    破解 Navicat Premium 12
    ES6 Reflect的认识
    ES6 WeakMap和WeakSet的使用场景
    sublime 注释模版插件DocBlockr的使用
    js call方法的使用
    ES6 Generator的应用场景
    ES6 Symbol的应用场景
  • 原文地址:https://www.cnblogs.com/sinpo828/p/14264518.html
Copyright © 2011-2022 走看看