Linux shell中的真正并行性

时间:2016-06-29 15:12:35

标签: linux shell parallel-processing

我试图在Linux shell上实现真正的并行性,但我无法实现它。

我有两个程序。 Allones,只打印'1'字符和allzeros,只打印0个字符。

当我执行“./allones& ./allzeros&”时,我会得到'0'和'1'的大打印件,大块混合(例如1111 ...... 111000 ... 0000111 ... 111000 ... 000“)。我的处理器有8个核心。

然而,当我在多核FPGA(没有操作系统)上执行我自己的程序时,(如果我在不同的内核上分发程序),我得到类似“011000101000011010 ......”的内容。

如何在Linux上运行它以获得类似于我在多核FPGA上获得的结果?

1 个答案:

答案 0 :(得分:2)

听起来您正在体验libc的默认线路缓冲:

这是一个测试计划spam.c

#include <stdio.h>    
int main(int argc, char** argv) {
  while(1) {
    printf("%s", argv[1]);
  }
}

我们可以用:

运行它
$ ./spam 0 & ./spam 1 & sleep 1; killall spam
  

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111(...)000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(...)

在我的系统上,每个块的长度都是1024字节,强烈暗示了缓冲问题。

这里的代码与fflush相同,以防止缓冲:

#include <stdio.h>    
int main(int argc, char** argv) {
  while(1) {
    printf("%s", argv[1]);
    fflush(stdout);
  }
}

这是新输出:

  

100111001100110011001100110011001100110011100111001110011011001100110011001100110011001100110011001100110011001100110011001100011000110001100110001100100110011001100111001101100110011001100110011001100110000000000110010011000110011