操作系统实验2.docx
- 文档编号:27266758
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:25
- 大小:1.07MB
操作系统实验2.docx
《操作系统实验2.docx》由会员分享,可在线阅读,更多相关《操作系统实验2.docx(25页珍藏版)》请在冰豆网上搜索。
操作系统实验2
实验报告
题目:
进程的初步认识
班级:
15软件工程
组长:
余凤
组员:
余凤,曹晓丽,石宇
实验日期:
2017.10.14
报告书写人:
曹晓丽
实验二:
进程的初步认识实验
一、实验目的
(1)掌握进程的概念
(2)掌握系统调用
(3)设计程序,实现结果的不可再现性;使用同步原语,实现结果的可再现性
(4)设计程序,对系统的进程数目进行压力测试,对运行时间进行监控
二、实验内容
1.创建进程
Start.c
#include
#include
#include
intmain(intargc,char**argv)
{
intpid=fork();
if(pid<0)
{
printf("error!
");
}
elseif(pid==0)
{
printf("thisisthechildprocess!
");
}
else{
printf("thisistheparentprocess!
childprocessid=%d",pid);
}
return0;
}
实验结果:
实验结果分析:
在主函数里用fork()函数创建了一个子进程,成功调用后返回两个值。
利用pid的返回值来判断子进程跟父进程,如果是子进程则返回值为0,父进程返回子进程的ID;此程序的子进程ID为1592。
2.进程的不可再现性
tc_print.c
#include
intmain(intargc,char*argv[])
{
printf("thead%shasstart!
\n",argv[1]);
sleep(3);
printf("thread%sended\n",argv[1]);
return(0);
}
实验结果:
实验结果分析:
此程序创建一个进程,等待3秒后,终止进程。
ecp1.c
#include
#include
#include
#include
voidmain()
{
int*status;
char*f="./tc_print";
char*argv1[3],*argv2[3],*argv3[3],*argv4[3];
argv1[0]="./tc_print";
argv1[1]="1";
argv1[2]=0;
argv2[0]="./tc_print";
argv2[1]="2";
argv2[2]=0;
argv3[0]="./tc_print";
argv3[1]="3";
argv3[2]=0;
argv4[0]="./tc_print";
argv4[1]="4";
argv4[2]=0;
if(fork()==0)
{
execvp(f,argv1);
sleep
(1);
execvp(f,argv2);
sleep
(1);
}
else
{
if(fork()==0)
{
execvp(f,argv3);
sleep
(1);
}
else
{wait(status);
execvp(f,argv3);
sleep
(1);
}
}
printf("Endprogram!
\n");
}
实验结果:
实验结果分析:
操作系统具有异步性,体现在程序的不可再现性,即程序执行的结果有时是不确定的。
如该实验结果所示,第一次执行跟第二次执行时的结果是不同的。
3.进程的可再现性
(1)wait.c
#include
intn=0;
intstatus;
voidpp()
{
n++;
if(n>=10)return;
wait(&status);
if(fork()==0)
{
printf("%d",n);
for(n=0;n<1000000;n++)
;
}
elsepp();
}
intmain()
{
inti;
for(i=0;i<3;i++)
{pp();
printf("\n");
}
return0;
}
实验结果:
实验结果分析:
进程一旦调用了wait()就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。
4.用信号量semget()、semctl()、semop()实现进程同步
tongbu.c
#include
#include
#include
#include
#include
#include
#include
#include
#defineSEMKEY(key_t)0x200
typedefunion_senum{
intval;
structsemid_ds*buf;
ushort*array;
}semun;
staticintsemid;
structsembufp1={0,-1,0};
structsembufv1={0,1,0};
intinitsem()
{
semunx;
x.val=0;
if((semid=semget(SEMKEY,1,0600|IPC_CREAT|IPC_EXCL))==-1)
{
if(errno==EEXIST)
semid=semget(SEMKEY,1,0);
}
if(semctl(semid,0,SETVAL,x)==-1)
{
perror("semctlfailed\n");
return(-1);
}
return(semid);
}
main()
{
inti=0,semid;
intj;
semid=initsem();
if(fork()==0)
{
semop(semid,&p1,1);
for(j=0;j<1000;j++)
{
printf("reader1%d\n",2*j+1);
sleep
(1);
}
printf("reader1finish!
!
!
\n");
}
else
{
if(fork()==0)
{
for(i=0;i<1000;i++)
{
printf("reader2%d\n",2*i);
sleep
(1);
}
printf("reader2finish!
!
!
\n");
semop(semid,&v1,1);
}
}
}
实验结果:
实验结果分析:
(1)Semget()函数,它的作用是创建一个新信号量或取得一个已有信号量。
第一个参数key是整数值(唯一非零),不相关的进程可以通过它访问一个信号量,它代表程序可能要使用的某个资源,程序对所有信号量的访问都是间接的,程序先通过调用semget()函数并提供一个键,再由系统生成一个相应的信号标识符(semget()函数的返回值),只有semget()函数才直接使用信号量键,所有其他的信号量函数使用由semget()函数返回的信号量标识符。
如果多个程序使用相同的key值,key将负责协调工作。
(2)Semop()函数,它的作用是改变信号量的值
(3)semctl()函数,该函数用来直接控制信号量信息
5.创建进可能多的进程,得到这个数目的极限,进程启动后可以进入死循环
xunhuan.c
#include
#include
#include
#include
#defineMAXPRO50
#defineSELLP10000
intmain(void)
{
longmax=0;
pid_tpid,pids[MAXPRO+1];
longi,l=0;
for(max=1;max { pid=fork(); if(pid<0)break; elseif(pid>0) { printf("\nForkprocess%d%d: ",pid,max); pids[max]=pid; } else { while (1) { l++; } } } for(i=1;i { if(kill(pids[i],SIGKILL)<0) { printf("\nProcess%dcannotkill! ",pids[i]); } elseprintf("\nProcess%dhavebeenkill! ",pids[i]); }} printf("\nThemaxprocessesnumberis: %d\n",max); return1; } 实验结果: 实验结果分析: 该程序定义一个最大的进程数,然后不断创建进程,使之进入死循环。 这样程序结束时需要将创建的进程强制关闭,并输出进程数的最大值。 6.递归创建200个进程,记录总体创建的起始时间和结束时间,最后求创建单个线程的平均时间 digui.c #include #include #include #include #include #include #defineMAXPRO200 #defineSELLP10000 #defineTESTTIME10 longmax=0,l=0; voidmyfork() { pid_tpid; intstatus; //if(max>=MAXPRO)exit (1); max++; pid=fork(); if(pid<0)exit (1); if(pid>0) { waitpid(pid,&status,0); if(max<2)return; exit (1); } if(pid==0) { if(max>=MAXPRO)exit (1); myfork(); exit (1); } } intmain(void) { longave=0; time_ttime1; structtm*t1,*t2; pid_tpid,pids[MAXPRO+1]; longi,ti; intstatus; structtimevaltv1[TESTTIME],tv2[TESTTIME]; structtimezonetz; for(l=0;l { max=0; gettimeofday(&tv1[l],&tz); myfork(); gettimeofday(&tv2[l],&tz); } for(l=0;l { printf("\nRound%d: Thestartimeis%ds%dus\n",l+1,tv1[l].tv_sec,tv1[l].tv_usec); printf("Round%d: Theendtimeis%ds%dus\n",l+1,tv2[l].tv_sec,tv2[l].tv_usec); ti=(tv2[l].tv_sec-tv1[l].tv_sec)*1000000+(tv2[l].tv_usec-tv1[l].tv_usec); printf("Round%d: Alltimeis%dus\n",l+1,ti); ave+=ti/MAXPRO; printf("Round%d: Theaveragetimeis%dus\n",l+1,ti/MAXPRO); } printf("Lasttheaveragetimeis%dus\n",ave/TESTTIME); return1; } 实验结果: 实验结果分析: 创建200个进程递归创建进程,等待子进程结束后,做十组测试,分别记录开始时间和结束时间,计算并输出创建单个线程的总时间和平均时间。 7.进程的并发执行 实验代码: 实验结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验