我创建了这个程序。它没有任何有趣的功能,只是使用处理能力。
通过使用
为什么编译器不会意识到内存不会被使用,并用
通过使用
objdump -d
查看输出,即使在使用O3编译时,我也可以看到最后三个rand
调用和相应的mov
指令。为什么编译器不会意识到内存不会被使用,并用
while(1){}
替换下半部分?我正在使用gcc
,但我主要关心标准需要什么。/*
* Create a program that does nothing except slow down the computer.
*/
#include <cstdlib>
#include <unistd.h>
int getRand(int max) {
return rand() % max;
}
int main() {
for (int thread = 0; thread < 5; thread++) {
fork();
}
int len = 1000;
int *garbage = (int*)malloc(sizeof(int)*len);
for (int x = 0; x < len; x++) {
garbage[x] = x;
}
while (true) {
garbage[getRand(len)] = garbage[getRand(len)] - garbage[getRand(len)];
}
}
g++ -O3 slowdown.cc
。 - Joshua Sniderrand()
的结果,而这个程序没有。 - M.Mfork()
不会创建多个线程。它会创建一个新的独立的完整进程。它们的内存是共享的写时复制,而不像线程共享内存那样读写共享。在Linux上,glibc的fork()
实现使用clone()
,但使用与线程创建不同的标志。因此,多个进程分别具有自己的rand()
RNG状态。即使它们是共享内存线程,它们也会各自进行malloc。 - Peter Cordesfork()
循环并没有检查它是否是父进程。因此,实际上你会生成2^5(32)个无限循环进程。每次循环都会使进程数量翻倍。 - Peter Cordes