《操作系统》基本课程实验指导书-2014 联系客服

发布时间 : 星期三 文章《操作系统》基本课程实验指导书-2014更新完毕开始阅读bec6706ea76e58fafab003ab

//part2

#include #include #include

static void sighandle(int); static long realsecond = 0; static long vtsecond = 0;

static long profsecond = 0;

static struct itimerval realt,virtt,proft; int main(){

struct itimerval v; int i,j;

long moresec,moremsec,t1,t2; signal(SIGALRM,sighandle); signal(SIGVTALRM,sighandle); signal(SIGPROF,sighandle); v.it_interval.tv_sec = 10; v.it_interval.tv_usec = 0; v.it_value.tv_sec = 10; v.it_value.tv_usec = 0;

setitimer(ITIMER_REAL,&v,NULL); setitimer(ITIMER_VIRTUAL,&v,NULL);

setitimer(ITIMER_PROF,&v,NULL); for(j= 0;j<1000;j++){

for(i= 0;i<500;i++){printf(\ } getitimer(ITIMER_PROF,&proft);

getitimer(ITIMER_REAL,&realt); getitimer(ITIMER_VIRTUAL,&virtt); printf(\

moresec = 10 - realt.it_value.tv_sec;

moremsec = (1000000 - realt.it_value.tv_usec)/1000;

printf(\

moresec = 10 - proft.it_value.tv_sec;

moremsec = (1000000 - proft.it_value.tv_usec)/1000;

printf(\

moresec = 10 - virtt.it_value.tv_sec;

moremsec = (1000000 - virtt.it_value.tv_usec)/1000;

printf(\

t1 = (10 - proft.it_value.tv_sec)*1000 + (1000000 - proft.it_value.tv_usec)/1000 + profsecond*10000; t2 = (10 - virtt.it_value.tv_sec)*1000 + (1000000 - virtt.it_value.tv_usec)/1000 + vtsecond*10000; }

static void sighandle(int s) { }

switch(s){ case SIGALRM:realsecond+=10;break; case SIGVTALRM:vtsecond+=10;break; case SIGPROF:profsecond+=10;break;

default :break; }

moresec = (t1 - t2)/1000; moremsec = (t1 - t2) % 1000;

printf(\fflush(stdout);

C、编写一个主程序产生两个子进程,分别低轨计算N =20,30,36的Fibonacci序列。分

别对三个进程计算相应的real time, cpu time,user time ,kernel time。 设计思路:

与(2)原理基本相同,不同的只是在任务开始前要分别设定好每个进程的定时器,而且其最终的实验结果也由相应进程自身打印出来。

C.3、shell程序源代码清单

/**************part3.c***************/ //part3

#include #include #include

#include

static void c1_sighandle(int s); static void c2_sighandle(int s); static void p_sighandle(int s);

static long p_realt_secs = 0,c1_realt_secs = 0,c2_realt_secs = 0; static long p_virtt_secs = 0,c1_virtt_secs = 0,c2_virtt_secs = 0; static long p_proft_secs = 0,c1_proft_secs = 0,c2_proft_secs = 0; static struct itimerval p_realt,c1_realt,c2_realt; static struct itimerval p_virtt,c1_virtt,c2_virtt; static struct itimerval p_proft,c1_proft,c2_proft; static struct itimerval ini_value;

int main(){ int fib = 0; int pid1,pid2; int status;

long moresec,moremsec,t1,t2; pid1 = fork();

if (pid1 == 0){//c1 //set c1 signal handle c);

moresec = 10 - c1_virtt.it_value.tv_sec;

moremsec = (1000000 - c1_virtt.it_value.tv_usec)/1000;

printf(\

moresec = 10 - c1_proft.it_value.tv_sec;

moremsec = (1000000 - c1_proft.it_value.tv_usec)/1000;

printf(\

signal(SIGALRM,c1_sighandle); signal(SIGVTALRM,c1_sighandle); signal(SIGPROF,c1_sighandle); ini_value.it_interval.tv_sec = 10; ini_value.it_interval.tv_usec = 0; ini_value.it_value.tv_sec = 10; ini_value.it_value.tv_usec = 0; //set c1 timer

setitimer(ITIMER_REAL,&ini_value,NULL); setitimer(ITIMER_VIRTUAL,&ini_value,NULL); setitimer(ITIMER_PROF,&ini_value,NULL); fib = fibonacci(20);

//get timer of c1 and print

getitimer(ITIMER_REAL,&c1_realt); getitimer(ITIMER_VIRTUAL,&c1_virtt); getitimer(ITIMER_PROF,&c1_proft); printf(\

moresec = 10 - c1_realt.it_value.tv_sec;

moremsec = (1000000 - c1_realt.it_value.tv_usec)/1000;

printf(\

t1=(10-c1_proft.it_value.tv_sec)*1000+(1000000-c1_proft.it_value.tv_usec)/1000 +

c1_proft_secs*10000; t2=(10-c1_virtt.it_value.tv_sec)*1000+(1000000-c1_virtt.it_value.tv_usec)/1000 + c1_virtt_secs*10000; moresec = (t1 - t2)/1000;

moremsec = (t1 - t2) % 1000;

printf(\fflush(stdout); exit(0);

}//end c1

else{

pid2 = fork();

if (pid2 == 0){//c2 //set c2 signal handle

signal(SIGALRM,c2_sighandle); signal(SIGVTALRM,c2_sighandle); signal(SIGPROF,c2_sighandle); ini_value.it_interval.tv_sec = 10; ini_value.it_interval.tv_usec = 0; ini_value.it_value.tv_sec =10; ini_value.it_value.tv_usec = 0;

//set c2 timer

setitimer(ITIMER_REAL,&ini_value,NULL); setitimer(ITIMER_VIRTUAL,&ini_value,NULL); setitimer(ITIMER_PROF,&ini_value,NULL); fib = fibonacci(30);

//get timer of c2 and print

getitimer(ITIMER_PROF,&c2_proft); getitimer(ITIMER_REAL,&c2_realt); getitimer(ITIMER_VIRTUAL,&c2_virtt); printf(\

moresec = 10 - c2_realt.it_value.tv_sec;

moremsec = (1000000 - c2_realt.it_value.tv_usec)/1000;

printf(\emsec);

moresec = 10 - c2_proft.it_value.tv_sec;

moremsec = (1000000 - c2_proft.it_value.tv_usec)/1000;

printf(\moresec = 10 - c2_virtt.it_value.tv_sec;