编程测出 线程/进程 上下文切换 消耗的时间。。

面试题,当时正问我写内核模块是吧什么什么的,突然问我这个题,瞬间懵了,想半天在内核没法这样玩啊,,,没想出来


然后面试官提示:怎么才能让进程切换呢?  我说:除了时间片就是阻塞操作。。     面试官说:对啊,怎么编程让两个进程通讯切换呢


我楞了半天才明白是要在用户态层面上去求这个消耗时间,,,大概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);
}

切换一个   差不多就是  20个微秒吧,,,  跟LMBENCH差不多。。。。


编程测出 线程/进程 上下文切换 消耗的时间。。_第1张图片

你可能感兴趣的:(编程测出 线程/进程 上下文切换 消耗的时间。。)