Mar
22
看了一个帖子,讨论这个问题的
URL: http://bbs.chinaunix.net/archiver/?tid-1399973.html
第一页4L的说法是正确的,那些的确是滥用管道,不过这个问题放到后面讨论。
感觉第一页末尾beginner-bj的测试方法不很对头,于是自己写了个小程序测试一下:
测试结果如下:
看来管道两头确实是协同工作的(从管道的原理也可以推知)
一头写,一头读,同时处理,这样可以提高CPU的利用率,特别是在多CPU的时候
不过总体来说,我想应该是会多占用一些CPU(进程之间的切换什么的?)。
然后关注一下滥用管道的问题,这个直接引用第二页某楼的vbs100童鞋的大作,应该可以说明问题了:
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。
URL: http://bbs.chinaunix.net/archiver/?tid-1399973.html
第一页4L的说法是正确的,那些的确是滥用管道,不过这个问题放到后面讨论。
感觉第一页末尾beginner-bj的测试方法不很对头,于是自己写了个小程序测试一下:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char * argv[]){
char cmd[1024];
if(argc < 3) {
printf("Not Enough Parameters.\n");
return 1;
}
int a, b;
sscanf(argv[1], "%d", &a);
sscanf(argv[2], "%d", &b);
sprintf(cmd, "sleep %d | sleep %d", a, b);
system(cmd);
return 0;
}
#include<stdlib.h>
int main(int argc, char * argv[]){
char cmd[1024];
if(argc < 3) {
printf("Not Enough Parameters.\n");
return 1;
}
int a, b;
sscanf(argv[1], "%d", &a);
sscanf(argv[2], "%d", &b);
sprintf(cmd, "sleep %d | sleep %d", a, b);
system(cmd);
return 0;
}
测试结果如下:
引用
felix021@felix021-laptop:~/code$ g++ a.cpp
felix021@felix021-laptop:~/code$ ./a.out 1 2
felix021@felix021-laptop:~/code$ time ./a.out 2 2
real 0m2.035s
user 0m0.000s
sys 0m0.020s
felix021@felix021-laptop:~/code$ time ./a.out 2 3
real 0m3.039s
user 0m0.012s
sys 0m0.016s
felix021@felix021-laptop:~/code$ time ./a.out 4 3
real 0m4.020s
user 0m0.016s
sys 0m0.004s
felix021@felix021-laptop:~/code$ time ./a.out 6 3
real 0m6.034s
user 0m0.004s
sys 0m0.020s
felix021@felix021-laptop:~/code$ ./a.out 1 2
felix021@felix021-laptop:~/code$ time ./a.out 2 2
real 0m2.035s
user 0m0.000s
sys 0m0.020s
felix021@felix021-laptop:~/code$ time ./a.out 2 3
real 0m3.039s
user 0m0.012s
sys 0m0.016s
felix021@felix021-laptop:~/code$ time ./a.out 4 3
real 0m4.020s
user 0m0.016s
sys 0m0.004s
felix021@felix021-laptop:~/code$ time ./a.out 6 3
real 0m6.034s
user 0m0.004s
sys 0m0.020s
看来管道两头确实是协同工作的(从管道的原理也可以推知)
一头写,一头读,同时处理,这样可以提高CPU的利用率,特别是在多CPU的时候
不过总体来说,我想应该是会多占用一些CPU(进程之间的切换什么的?)。
然后关注一下滥用管道的问题,这个直接引用第二页某楼的vbs100童鞋的大作,应该可以说明问题了:
引用
正确的是
$ grep 'some word' urfile
但是更方便的是
$ <urfile grep 'some word'
这样可方便改 grep 的参数
还有经常用的
$ cat urfile | grep 'some word' | wc -l
其实直接可以用
$ <urfile grep -c 'some word'
$ grep 'some word' urfile
但是更方便的是
$ <urfile grep 'some word'
这样可方便改 grep 的参数
还有经常用的
$ cat urfile | grep 'some word' | wc -l
其实直接可以用
$ <urfile grep -c 'some word'
欢迎扫码关注:
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。
两个进程都sleep,这个例子太极端,如果你用一个前后输入输出关联的管道,那就不会是这个结果了。比如你可以编写两个计算器,然后让前面的结果是后面的输入,再测测情况。
“一头写,一头读,同时处理”——虽然理论上是这样没错,但是因为buffer的存在,几乎大部分时刻一头在操作管道另一头的Thread就会被blocked,要真正实现并行还是没那么容易的。
管道实质上是进程间通讯的一种方式,是很耗资源的。