【问题标题】:round robin id generator in CC中的循环ID生成器
【发布时间】:2011-09-06 12:55:37
【问题描述】:

我正在尝试编写一个小型操作系统,我有 100 个进程需要自动生成唯一的进程 ID。它们必须以循环方式顺序生成。 有什么算法可以解决这个问题吗?有什么帮助吗?谢谢。

【问题讨论】:

  • 我认为普遍接受的序列号算法是在你记得生成的最后一个数字上加 1.... :)
  • 如果你想让数字环绕每个 N,id = ++id % N 是典型的方法。
  • 谢谢,如果你不介意,你能解释一下环绕吗?
  • @Jon:我认为表达式id = ++id % N 中没有序列点。我更喜欢id = (id + 1) % N
  • 真正的“问题”是您是否需要停止进程并启动新进程。在这种情况下,仅仅环绕是不够的。您需要一种方法来不生成已在使用的进程 ID。

标签: c process operating-system


【解决方案1】:

只需创建一个包含 100 个元素(初始化为 0)的数组并对其进行管理

int array[100] = {0};

/* kill process N */
void killprocess(int N) {
    array[N] = 0;
}

/* add process N */
void addprocess(int N) {
    array[N] = 1;
}

/* find free process starting with N */
int findfreeprocess(int N) {
    int k, ndx;
    for (k = 0; k < 100; k++) {
        ndx = (N + k) % 100;
        if (array[ndx] == 0) return ndx;
    }
    return -1; /* indicate no free process */
}

【讨论】:

  • 我不明白第三部分:s 你能进一步解释一下吗?
  • 它假设数组是一个循环缓冲区,并搜索以N开头的零元素,一旦到达99就“返回”到0。如果所有元素都不是0,则返回-1表示就是这样。
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 2020-05-02
  • 2012-09-22
  • 1970-01-01
  • 2011-02-12
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多