【发布时间】:2011-01-18 14:41:11
【问题描述】:
一位教授曾经在课堂上告诉我们,Windows、Linux、OS X 和 UNIX 在线程而不是进程上扩展,因此即使在单处理器上线程也可能使您的应用程序受益,因为您的应用程序将在 CPU 上占用更多时间。
我在我的机器(只有一个 CPU)上尝试了以下代码。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_t xs[10];
void *nop(void *ptr) {
unsigned long n = 1UL << 30UL;
while(n--);
return NULL;
}
void test_one() {
size_t len = (sizeof xs) / (sizeof *xs);
while(len--)
if(pthread_create(xs+len, NULL, nop, NULL))
exit(EXIT_FAILURE);
len = (sizeof xs) / (sizeof *xs);
while(len--)
if(pthread_join(xs[len], NULL))
exit(EXIT_FAILURE);
}
void test_two() {
size_t len = (sizeof xs) / (sizeof *xs);
while(len--) nop(NULL);
}
int main(int argc, char *argv[]) {
test_one();
// test_two();
printf("done\n");
return 0;
}
两个测试在速度方面是相同的。
real 0m49.783s
user 0m48.023s
sys 0m0.224s
real 0m49.792s
user 0m49.275s
sys 0m0.192s
这个我想,“哇,线程很烂”。但是,在具有四个处理器的大学服务器上重复测试,速度接近四倍。
real 0m7.800s
user 0m30.170s
sys 0m0.006s
real 0m30.190s
user 0m30.165s
sys 0m0.004s
我在解释家用机器上的结果时是否忽略了某些东西?
【问题讨论】:
-
俗话说“在 UNIX 中,你最好使用进程而不是线程来实现 IPC”,这不一定是因为线程模型更糟糕 - 尽管它是 - 或者我被告知.但是,因为流程模型要好得多,而且更轻量级。在 IPC 方面,获得正确且稳定的进程模型比线程模型容易得多。而且,当你有写时复制和其他细节时,优势有利于分叉。我只是鹦鹉学舌,因为你听到的一些事情引发了这个问题 - 我认为你听错了我所描述的内容。
标签: linux performance multithreading scheduling