面试题,当时正问我写内核模块是吧什么什么的,突然问我这个题,瞬间懵了,想半天在内核没法这样玩啊,,,没想出来
然后面试官提示:怎么才能让进程切换呢? 我说:除了时间片就是阻塞操作。。 面试官说:对啊,怎么编程让两个进程通讯切换呢
我楞了半天才明白是要在用户态层面上去求这个消耗时间,,,大概20S,面试官说:没事不会下一题吧 ,好悲剧!!!!
回来搜下,发现LMBENCH这玩意,就仿照着敲下试试。。。
很简单,20个管道+20个线程 首尾相接构成环,主线程先写,其他读操作阻塞等待,读返回立马写到下个管道,这样强制切换线程。。。。
转个上万圈 取平均值 得到的是 管道耗时+进程切换耗时
单线程 不停的读写管道上万次 取均值,就是单独的 管道耗时。。。
一减 就是了。。。。
蛋疼,,,,,,,面试的好烂
#include <stdio.h> #include <unistd.h> #include <sys/time.h> #include<pthread.h> int pipes[20][3]; char buffer[10]; int running = 1; void inti() { int i =20; while(i--) { if(pipe(pipes[i])<0) exit(1); pipes[i][2] = i; } } void distroy() { int i =20; while(i--) { close(pipes[i][0]); close(pipes[i][1]); } } double self_test() { int i =20000; struct timeval start, end; gettimeofday(&start, NULL); while(i--) { if(write(pipes[0][1],buffer,10)==-1) exit(1); read(pipes[0][0],buffer,10); } gettimeofday(&end, NULL); return (double)(1000000*(end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec)/20000; } void *_test(void *arg) { int pos = ((int *)arg)[2]; int in = pipes[pos][0]; int to = pipes[(pos + 1)%20][1]; while(running) { read(in,buffer,10); if(write(to,buffer,10)==-1) exit(1); } } double threading_test() { int i = 20; struct timeval start, end; pthread_t tid; while(--i) { pthread_create(&tid,NULL,_test,(void *)pipes[i]); } i = 10000; gettimeofday(&start, NULL); while(i--) { if(write(pipes[1][1],buffer,10)==-1) exit(1); read(pipes[0][0],buffer,10); } gettimeofday(&end, NULL); running = 0; if(write(pipes[1][1],buffer,10)==-1) exit(1); return (double)(1000000*(end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec)/10000/20; } int main() { inti(); printf("%6.6f\n",self_test()); printf("%6.6f\n",threading_test()); distroy(); exit(0); }