您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 操作系统-实验三-进程管理-实验报告
计算机与信息工程学院实验报告姓名学号专业软件工程年级2017级课程操作系统主讲教师党兰学实验时间(年月日时)2019年10月23日实验地点计算机学院201机房辅导教师党兰学实验题目进程管理实验目的1.加深对进程概念的理解,明确进程和程序的区别;2.进一步认识并发执行的实质;3.了解父进程和子进程之间的关系;4.查看进程管理命令。实验环境(硬件和软件)硬件:PC机软件:OracleVMVirtualboxLinux一、实验内容1.练习在shell环境下编译执行程序(注意:①在vi编辑器中编写名为sample.c的c语言源程序②用linux自带的编译器gcc编译程序,例如:gcc–otestsample.c③编译后生成名为test.out的可执行文件;④最后执行分析结果;命令为:./test)注意:linux自带的编译程序gcc的语法是:gcc–o目标程序名源程序名,例如:gcc–osample1sample1.c,然后利用命令:./sample来执行。如果仅用“gcc源程序名”,将会把任何名字的源程序都编译成名为a.out的目标程序,这样新编译的程序会覆盖原来的程序,所以最好给每个源程序都起个新目标程序名。2.进程的创建仿照例子自己编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和“c”。观察记录屏幕上的显示结果,并分析原因。3.分析程序实验内容要在给出的例子程序基础上,根据要求进行修改,对执行结果进行分析。二、实验步骤1.利用fork()创建一个小程序(1)编写程序#includesys/types.hmain(){inti=5;pid_tpid;pid=fork();for(;i0;i--){if(pid0)printf(errorinfork!);elseif(pid==0)printf(iamthechildprocess,myprocessidis%dandi=%d\n,getpid(),i);elseprintf(iamtheparentprocess,myprocessidis%dandi=%d\n,getpid(),i);}for(i=5;i0;i--){if(pid0)printf(errorinfork!);elseif(pid==0)printf(thechildprocess,myprocessidis%dandi=%d\n,getpid(),i);elseprintf(theparentprocess,myprocessidis%dandi=%d\n,getpid(),i);}}(2)运行程序(3)分析程序在这里,主程序先运行,在屏幕上输出一个a,之后两个子程序分别运行而输出c和b。2子进程对存取空间的复制(1)编写程序(2)运行程序(3)分析程序通过scanf(“%d”,&i);语句读取一个整数存在i,之后创建两个子程序,输入10后,子程序运行,之后经过一些读取赋值操作,输出i的值。3父子进程执行进程分析(1)编写程序(2)运行程序(3)程序分析三次结果不同是因为printf(“Inwhichprocess?\n”);所处位置经过变换,处于父子程序之后,父子程序之前和父程序之中。4修改程序验证父子进程关系(1)编写程序文本代码:#includesys/types.h#includeunistd.h#includesignal.h#includestdio.h#includestring.h#includesys/ipc.h#includesys/shm.h#includesys/sem.h#includestdlib.h#defineMY_SHMKEY10071500//needtochange#defineMY_SEMKEY10071500//needtochangevoidsigend(int);intshmid,semid;intmain(void){int*shmptr,semval,local;structsembufsemopbuf;if((shmid=shmget(MY_SHMKEY,sizeof(int),IPC_CREAT|IPC_EXCL|0666))0){/*sharedmemoryexists,actasclient*/shmid=shmget(MY_SHMKEY,sizeof(int),0666);semid=semget(MY_SEMKEY,2,0666);shmptr=(int*)shmat(shmid,0,0);printf(Actasproducer.Toend,input0whenprompted.\n\n);printf(Inputanumber:\n);scanf(%d,&local);while(local){semopbuf.sem_num=0;semopbuf.sem_op=-1;semopbuf.sem_flg=SEM_UNDO;semop(semid,&semopbuf,1);/*P(S1)*/*shmptr=local;semopbuf.sem_num=1;semopbuf.sem_op=1;semopbuf.sem_flg=SEM_UNDO;semop(semid,&semopbuf,1);/*V(S2)*/printf(Inputanumber:\n);scanf(%d,&local);}}else/*actsasserver*/{semid=semget(MY_SEMKEY,2,IPC_CREAT|0666);shmptr=(int*)shmat(shmid,0,0);semval=1;semctl(semid,0,SETVAL,semval);/*setS1=1*/semval=0;semctl(semid,1,SETVAL,semval);/*setS2=0*/signal(SIGINT,sigend);signal(SIGTERM,sigend);printf(ACTCONSUMER!!!Toend,tryCtrl+Corusekill.\n\n);while(1){semopbuf.sem_num=1;semopbuf.sem_op=-1;semopbuf.sem_flg=SEM_UNDO;semop(semid,&semopbuf,1);/*P(S2)*/printf(Sharedmemorysetto%d\n,*shmptr);semopbuf.sem_num=0;semopbuf.sem_op=1;semopbuf.sem_flg=SEM_UNDO;semop(semid,&semopbuf,1);/*V(S1)*/}}}voidsigend(intsig){shmctl(shmid,IPC_RMID,0);semctl(semid,IPC_RMID,0);exit(0);}(2)运行程序(3)分析程序本示例主要体现进程间的直接制约关系,由于使用共享存储区,也存在间接制约关系。进程分为服务进程和客户进程,服务进程只有一个,作为消费者,在每次客户进程改变共享存储区内容时显示其数值。各客户进程作为生产者,如果共享存储区内容已经显示(被消费),可以接收用户从键盘输入的整数,放在共享存储区。编译后执行,第一个进程实例将作为服务进程,提示:ACTCONSUMER!!!Toend,tryCtrl+Corusekill.服务进程一直循环执行,直到用户按Ctrl+C终止执行,或使用kill命令杀死服务进程。其他进程实例作为客户进程,提示:Actasproducer.Toend,input0whenprompted.客户进程一直循环执行,直到用户输入0。5模拟临界资源访问的示例程序(1)编写程序文本代码:#includesys/types.h#includeunistd.h#includesignal.h#includestdio.h#includestring.h#includesys/ipc.h#includesys/shm.h#includestdlib.h#defineMY_SHMKEY10071800//needtochange#defineMAX_BLOCK1024#defineMAX_CMD8structshmbuf{inttop;intstack[MAX_BLOCK];}*shmptr,local;charcmdbuf[MAX_CMD];intshmid,semid;voidsigend(int);voidrelblock(void);intgetblock(void);voidshowhelp(void);voidshowlist(void);voidgetcmdline(void);intmain(void){if((shmid=shmget(MY_SHMKEY,sizeof(structshmbuf),IPC_CREAT|IPC_EXCL|0666))0){/*sharedmemoryexists,actasclient*/shmid=shmget(MY_SHMKEY,sizeof(structshmbuf),0666);shmptr=(structshmbuf*)shmat(shmid,0,0);local.top=-1;showhelp();getcmdline();while(strcmp(cmdbuf,end\n)){if(!strcmp(cmdbuf,get\n))getblock();elseif(!strcmp(cmdbuf,rel\n))relblock();elseif(!strcmp(cmdbuf,list\n))showlist();elseif(!strcmp(cmdbuf,help\n))showhelp();getcmdline();}}else/*actsasserver*/{inti;shmptr=(structshmbuf*)shmat(shmid,0,0);signal(SIGINT,sigend);signal(SIGTERM,sigend);printf(NOOTHEROPERATIONbutpressCtrl+Corusekilltoend.\n);shmptr-top=MAX_BLOCK-1;for(i=0;iMAX_BLOCK;i++)shmptr-stack[i]=MAX_BLOCK-i;sleep(1000000);/*causesleepforever.*/}}voidsigend(intsig){shmctl(shmid,IPC_RMID,0);semctl(semid,IPC_RMID,0);exit(0);}voidrelblock(void){if(local.top0){printf(Noblocktorelease!);return;}shmptr-top++;shmptr-stack[shmptr-top]=local.stack[local.top--];}intgetblock(void){if(shmptr-top0){printf(Nofreeblocktoget!);return;}local.stack[++local.top]=shmptr-stack[shmptr-top];shmptr-top--;}voidshowhelp(void){printf(\navailableCOMMAND:\n\n);printf(help\tlistthishelp\n);printf(list\tlistallgottenblocknumber\n);printf(get\tgetanewblock\n);printf(rel\treleasethelastgottenblock\n);printf(
本文标题:操作系统-实验三-进程管理-实验报告
链接地址:https://www.777doc.com/doc-6020430 .html