




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE[键入文字]XX学校实验报告
课程名称:学院:专业班:姓名:学号:指导教师:
2011年3月PAGE5目录实验1进程管理 3一、实验目的 3二、实验内容 3三、实验要求 3四、程序说明和程序流程图 4五、程序代码 5六、程序运行结果及分析 7七.指导教师评议 8实验2进程通信 9一、实验目的 9二、实验内容 9三、实验要求 9四、程序说明和程序流程图 9五、程序代码 11七.指导教师评议 14实验3存储管理 15一、实验目的 15二、实验内容 15三、实验要求 15四、程序说明和程序流程图 16六、程序运行结果及分析 23七.指导教师评议 23实验4文件系统 24一、实验目的 24二、实验内容 24三、实验要求 24四、程序说明和程序流程图 24五、程序代码 26六、程序运行结果及分析 26七.指导教师评议 27
实验1进程管理一、实验目的1.弄清进程和程序的区别,加深对进程概念的理解。2.了解并发进程的执行过程,进一步认识并发执行的实质。3.掌握解决进程互斥使用资源的方法。二、实验内容1.管道通信使用系统调用pipe()建立一个管道,然后使用系统调用fork()创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Childprocessp1issendingmessage!”和“Childprocessp2issendingmessage!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。2.软中断通信使用系统调用fork()创建2个子进程p1和p2,在父进程中使用系统调用signal()捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill()分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Childprocessp1iskilledbyparent!”和“Childprocessp2iskilledbyparent!”后终止。而父进程等待2个子进程终止后,输出信息“Parentprocessiskilled!”后终止。三、实验要求1.根据实验内容编写C程序。2.上机调试程序。3.记录并分析程序运行结果。
四、程序说明和程序流程图实验1管道通信——所涉及的流程图:实验2软中断信号——所涉及的流程图:五、程序代码/*expe1_1.c*/#include<stdio.h>voidmain(){inti,r,p1,p2,fd[2];charbuf[50],s[50];pipe(fd);/*父进程建立管道*/while((p1=fork())==-1);/*创建子进程P1,失败时循环*/if(p1==0)/*由子进程P1返回,执行子进程P1*/{lockf(fd[1],1,0);/*加锁锁定写入端*/sprintf(buf,"ChildprocessP1issendingmessages!\n");printf("ChildprocessP1!\n");write(fd[1],buf,50);/*把buf中的50个字符写入管道*/sleep(5);/*睡眠5秒,让父进程读*/lockf(fd[1],0,0);/*释放管道写入端*/exit(0);/*关闭P1*/}else/*从父进程返回,执行父进程*/{while((p2=fork())==-1);/*创建子进程P2,失败时循环*/if(p2==0)/*从子进程P2返回,执行子进程P2*/{lockf(fd[1],1,0);/*锁定写入端*/sprintf(buf,"ChildprocessP2issendingmessages!\n");printf("ChildprocessP2!\n");write(fd[1],buf,50);/*把buf中的字符写入管道*/sleep(5);/*睡眠5秒,让父进程读*/lockf(fd[1],0,0);/*释放管道写入端*/exit(0);/*关闭P2*/}wait(0);if((r=read(fd[0],s,50))==-1)printf("cannotreadpipe!\n");elseprintf("%s",s);wait(0);if((r=read(fd[0],s,50))==-1)printf("cannotreadpipe!\n");elseprintf("%s",s);exit(0);}}/*exp1-2.c*/#include<stdio.h>#include<stdlib.h>#include<signal.h>intp1,p2;voidmain(){voidppdo();voidp1do();voidp2do();signal(SIGINT,ppdo);p1=fork();if(p1==0){signal(SIGUSR1,p1do);for(;;);}else{p2=fork();if(p2==0){signal(SIGUSR2,p2do);for(;;);}}wait(0);wait(0);printf("\nParentprocessiskilled!\n");exit(0);}voidppdo(){kill(p1,SIGUSR1);kill(p2,SIGUSR2);}voidp1do(){printf("\nChildprocessp1iskilledbyparent!\n");exit(0);}voidp2do(){printf("\nChildprocessp2iskilledbyparent!\n");exit(0);}六、程序运行结果及分析实验1管道通信运行结果截图实验1管道通信结果分析父进程建立后,创建了子进程P1,P2,然后P1,P2分别向管道中写入字符串“Childprocessp1issendingmessage!”和“Childprocessp2issendingmessage!”,父进程从管道中读取字符串。实验2软中断通信运行结果截图实验2软中断通信结果分析先预设中断信号SIGINT,再先后创建子进程P1和P2,预设中断信号SIGUSR1,SIGUER2,当我们按下“Ctrl+C”时,父进程发出中断信号SIGUSR1和SIGUSR2,通知子进程P1和P2,子进程捕捉到信号后分别输出相应的信息后,终止,最后输出“Parentprocessiskilled!”后终止。实验后思考:通过这次实验,深刻地了解到了管道通信和软中断通信的详细过程,深化了老师课堂上的讲解,对整个过程的把握也更加清晰了。很值得的一次学习经历,做完实验,再画流程图,程序运行的细节熟悉于心,了如指掌。七.指导教师评议成绩等级
实验2进程通信一、实验目的1.了解进程间通信IPC的三种方式:消息队列、共享内存和信号量。2.掌握使用消息队列进行进程间通信的有关系统调用和编程方法。3.掌握使用共享内存进行进程间通信的有关系统调用和编程方法。二、实验内容1.消息队列使用系统调用msgget()、msgsnd()、msgrcv()和msgctl(),用消息队列机制实现客户进程和服务器进程间的通信。客户进程首先建立一个描述符为msgqid的消息队列,接着向服务器进程发送一个消息正文为自己的进程标识pid且类型为1的消息,然后接收来自服务器进程的消息,并在屏幕上显示:“Clientreceivesamessagefromxxxx!”,其中“xxxx”为服务器进程的进程标识。服务器进程首先捕捉软中断信号(除不能捕捉的SIGKILL),若捕捉到时则调用函数cleanup()删除消息队列,终止服务器进程。否则重复下列操作:接收所有类型为1的消息,并在屏幕上显示:“Serverreceivesamessagefromxxxx!”,其中“xxxx”为客户进程的进程标识;然后服务器进程将客户进程的进程标识作为返回消息的类型,而将自己的进程标识作为消息正文发送给客户进程。2.共享内存使用系统调用shmget()、shmat()和shmctl(),用共享内存机制实现进程间的通信。其中一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据并显示在屏幕上。三、实验要求1.根据实验内容编写C程序。2.上机调试程序。3.记录并分析程序运行结果。四、程序说明和程序流程图实验1消息队列流程图
五、程序代码实验1消息队列/*msg_client.c*/#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#defineMSGKEY75structmsgform{longmtype;charmtext[256];}main(){structmsgformmsg;intmsgqid,pid,*pint;/*文件主同组用户其他用户rwxrwxrwx*/msgqid=msgget(MSGKEY,0777);/*rw-rw-rw-*/pid=getpid();pint=(int*)msg.mtext;*pint=pid;msg.mtype=1;msgsnd(msgqid,&msg,sizeof(int),0);msgrcv(msgqid,&msg,256,pid,0);printf("client:receivefrompid%d\n",*pint);}/*msg_server.c*/#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#defineMSGKEY75structmsgform{longmtype;charmtext[256];}msg;intmsgqid;main(){inti,pid,*pint;externcleanup();for(i=0;i<20;i++)signal(i,cleanup);msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(;;){msgrcv(msgqid,&msg,256,1,0);pint=(int*)msg.mtext;pid=*pint;printf("server:receivefrompid%d\n",pid);msg.mtype=pid;*pint=getpid();msgsnd(msgqid,&msg,sizeof(int),0);}}cleanup(){msgctl(msgqid,IPC_RMID,0);exit(0);}实验2共享内存#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>#defineSHMKEY75#defineK1024intshmid;main(){inti,*pint;char*addr;
externchar*shmat();shmid=shmget(SHMKEY,8*K,0777);addr=shmat(shmid,0,0);pint=(int*)addr;while(*pint==0)for(i=0;i<256;*pint++)printf("%d\n",*pint++);}
#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineSHMKEY75#defineK1024intshmid;main(){inti,*pint;char*addr;externchar*shmat();externcleanup();for(i=0;i<20;i++)sinal(i,cleanup);shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT);addr=shmat(shmid,0,0);printf("addr0x%x\n",addr);pint=(int*)addr;for(i=0;i<256;i++)*pint++=i;pint=(int*)addr;*pint=256;pause();}cleanup(){shmctl(shmid,IPC_RMID,0);exit(0);}六、程序运行结果及分析实验1消息队列运行结果截图客户端:服务器端:实验1消息队列结果分析服务端程序监听软中断,建立消息队列,循环在队列中接收类型为1的消息,每接收一个消息向队列中增加一个类型为客户进程ID的消息。当发生软中断时,删除消息队列。客户端进程创建和服务端相同的消息队列,并向消息队列中发送类型为1的消息,然后接收类型为客户进程ID的消息。实验后思考:对消息队列的运行情况有所了解,但关于内存共享部分尚需仔细研究。七.指导教师评议成绩等级
实验3存储管理一、实验目的1.了解虚拟存储管理技术的原理与特点。2.掌握请求页式存储管理的页面置换算法。二、实验内容1.通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:(1)50%的指令是顺序执行的;(2)25%的指令均匀分布在前地址部分;(3)25%的指令均匀分布在后地址部分。实现方法:(1)在[0,319]的指令地址中随机选取一起点s;(2)执行指令s;(3)顺序执行一条指令,即执行地址为s+1的指令;(4)在前地址[0,s]中随机选取一条地址为m的指令执行;(5)顺序执行一条指令,即执行地址为m+1的指令;(6)在后地址[m+2,319]中随机选取一条指令s;(7)重复(2)—(6),直到执行320次指令。2.将指令序列变换为页地址流,设:(1)页面大小为1K;(2)用户内存容量为4—32页面(pageframe);(3)用户虚存容量为32K(即32页)。若10条指令为1页,则320条指令在虚存中的存放方式为:第0页(虚存地址[0,9])——第0条~第9条指令;第1页(虚存地址[10,19])——第10条~第19条指令;••••••第31页(虚存地址[310,319])——第310条~第319条指令。3.计算并输出下列算法在不同内存容量下的命中率(命中率=1-缺页率)。(1)FIFO——FirstInFirstOutPageReplacementAlgorithm(2)LRU——LeastRecentlyUsedPageReplacementAlgorithm三、实验要求1.根据实验内容编写C程序。2.上机调试程序。3.记录并分析程序运行结果。四、程序说明和程序流程图程序说明为:1.通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:(1)50%的指令是顺序执行的;(2)25%的指令均匀分布在前地址部分;(3)25%的指令均匀分布在后地址部分。实现方法:(1)在[0,319]的指令地址中随机选取一起点s;(2)执行指令s;(3)顺序执行一条指令,即执行地址为s+1的指令;(4)在前地址[0,s]中随机选取一条地址为m的指令执行;(5)顺序执行一条指令,即执行地址为m+1的指令;(6)在后地址[m+2,319]中随机选取一条指令s;(7)重复(2)—(6),直到执行320次指令。2.将指令序列变换为页地址流,设:(1)页面大小为1K;(2)用户内存容量为4—32页面(pageframe);(3)用户虚存容量为32K(即32页)。若10条指令为1页,则320条指令在虚存中的存放方式为:第0页(虚存地址[0,9])——第0条~第9条指令;第1页(虚存地址[10,19])——第10条~第19条指令;••••••第31页(虚存地址[310,319])——第310条~第319条指令。3.计算并输出下列算法在不同内存容量下的命中率(命中率=1-缺页率)。(1)FIFO——FirstInFirstOutPageReplacementAlgorithm(2)LRU——LeastRecentlyUsedPageReplacementAlgorithm流程图:五、程序代码#include<stdio.h>#include<stdlib.h>//#include<process.h> /*Windows环境,getpid()原型在process.h中*/#defineTRUE1#defineFALSE0#defineINVALID-1#defineNULL0#definetotal_instruction320 /*指令条数*/#definetotal_vp32 /*虚页数*/#defineclear_period50 /*NRU清0周期*/typedefstruct{ /*页表结构*/intpn,pfn,counter,time; /*counter(LFU),time(LRU)*/}pl_type;pl_typepl[total_vp]; /*页表*/structpfc_struct{ /*存储页面表*/intpn,pfn;structpfc_struct*next;};typedefstructpfc_structpfc_type;pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;intdiseffect,a[total_instruction]; /*缺页次数,指令流*/intpage[total_instruction],offset[total_instruction];voidinitialize(int);voidfifo(int);voidlru(int);voidopt(int);voidlfu(int);voidnur(int);voidmain(){ints,i,j;srand(getpid()*10); /*进程标识作为随机数种子*/s=(float)319*rand()/2147483647; /*0~319*///s=(float)319*rand()/32767; /*0~319*/for(i=0;i<total_instruction;i+=4){a[i]=s; /*s=0~319*/a[i+1]=a[i]+1; /*s+1*/a[i+2]=(float)a[i]*rand()/2147483647; /*m=0~s*///a[i+2]=(float)a[i]*rand()/32767; /*m=0~s*/a[i+3]=a[i+2]+1; /*m+1*/s=(float)rand()*(317-a[i+2])/2147483147+a[i+2]+2; /*m+2~319*///s=(float)rand()*(317-a[i+2])/32767+a[i+2]+2; /*m+2~319*/}for(i=0;i<total_instruction;i++){page[i]=a[i]/10;offset[i]=a[i]%10;}for(i=4;i<=32;i++) /*用户内存工作区4-32个页面*/{printf("%2dpageframes",i);fifo(i);lru(i);opt(i);lfu(i);nur(i);printf("\n");}}voidinitialize(inttotal_pf){inti;diseffect=0;for(i=0;i<total_vp;i++){pl[i].pn=i;pl[i].pfn=INVALID;pl[i].counter=0;pl[i].time=-1;}for(i=1;i<total_pf;i++){pfc[i-1].next=&pfc[i];pfc[i-1].pfn=i-1;}pfc[total_pf-1].next=NULL;pfc[total_pf-1].pfn=total_pf-1;freepf_head=&pfc[0];}voidfifo(inttotal_pf){inti,j;pfc_type*p;initialize(total_pf);busypf_head=busypf_tail=NULL; /*置忙页面队列为空*/for(i=0;i<total_instruction;i++)if(pl[page[i]].pfn==INVALID) /*页失效*/{diseffect++; /*失效次数加1*/if(freepf_head==NULL) /*无空闲页面*/{p=busypf_head->next;pl[busypf_head->pn].pfn=INVALID;freepf_head=busypf_head;/*释放忙队列中的第1个页面(淘汰1页),即出队*/freepf_head->next=NULL;busypf_head=p; /*插入到空闲页面链表*/}p=freepf_head->next;freepf_head->next=NULL;freepf_head->pn=page[i];pl[page[i]].pfn=freepf_head->pfn;if(busypf_tail==NULL) /*忙队列为空时,入队*/busypf_head=busypf_tail=freepf_head;else /*忙队列为非空时,入队*/{busypf_tail->next=freepf_head;busypf_tail=freepf_head;}freepf_head=p;}printf("FIFO:%6.4f",1-(float)diseffect/320);}voidlru(inttotal_pf){intmin,minj,i,j,present_time;initialize(total_pf);present_time=0;for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID){diseffect++;if(freepf_head==NULL){min=32767;for(j=0;j<total_vp;j++) /*查找内存中time最小的页面*/if(min>pl[j].time&&pl[j].pfn!=INVALID){min=pl[j].time;minj=j;}freepf_head=&pfc[pl[minj].pfn]; /*插入空闲链表*/pl[minj].pfn=INVALID;pl[minj].time=-1;freepf_head->next=NULL;}pl[page[i]].pfn=freepf_head->pfn;pl[page[i]].time=present_time;freepf_head=freepf_head->next;}elsepl[page[i]].time=present_time;present_time++;}printf("LRU:%6.4f",1-(float)diseffect/320);}voidopt(inttotal_pf){inti,j,max,maxpage,d,dist[total_vp];initialize(total_pf);for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID){diseffect++;if(freepf_head==NULL){for(j=0;j<total_vp;j++)if(pl[j].pfn!=INVALID)dist[j]=32767;elsedist[j]=0; /*页在内存中距离非0,不在内存距离为0*/d=1; /*计算内存中页面与当前访问页面的距离*/for(j=i+1;j<total_instruction;j++){if(pl[page[j]].pfn!=INVALID)dist[page[j]]=d;d++;}max=-1; /*淘汰距离最远的页*/for(j=0;j<total_vp;j++)if(max<dist[j]){max=dist[j];maxpage=j;}freepf_head=&pfc[pl[maxpage].pfn];freepf_head->next=NULL;pl[maxpage].pfn=INVALID;}pl[page[i]].pfn=freepf_head->pfn;freepf_head=freepf_head->next;}}printf("OPT:%6.4f",1-(float)diseffect/320);}voidlfu(inttotal_pf){inti,j,min,minpage;initialize(total_pf);for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID){diseffect++;if(freepf_head==NULL){min=32767;for(j=0;j<total_vp;j++){if(min>pl[j].counter&&pl[j].pfn!=INVALID){min=pl[j].counter;minpage=j;}pl[j].counter=0;}freepf_head=&pfc[pl[minpage].pfn];pl[minpage].pfn=INVALID;freepf_head->next=NULL;}pl[page[i]].pfn=freepf_head->pfn;freepf_head=freepf_head->next;}elsepl[page[i]].counter++;}printf("LFU:%6.4f",1-(float)diseffect/320);}voidnur(inttotal_pf){inti,j,dp,cont_flag,old_dp;initialize(total_pf);dp=0;for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID){diseffect++;if(freepf_head==NULL){cont_flag=TRUE;old_dp=dp;while(cont_flag)if(pl[dp].counter==0&&pl[dp].pfn!=INVALID)cont_flag=FALSE;else{dp++;if(dp==total_vp)dp=0;if(dp==old_dp)for(j=0;j<total_vp;j++)pl[j].counter=0;}freepf_head=&pfc[pl[dp].pfn];pl[dp].pfn=I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025财务审计业务合同书范本
- 2025标准企业办公室租赁合同样本下载
- 个人餐饮员工劳动合同标准文本
- 书法雕刻劳务合同标准文本
- 航空运输合同示范文本二零二五年
- 二零二五版珠海二手房买卖合同
- 证券资产抵押担保合同二零二五年
- 聘用人才劳动合同
- 二零二五版员工食堂劳务承包合同
- 建设工程施工合同的定义及特征二零二五年
- 消防更换设备方案范本
- 合伙开办教育培训机构合同范本
- 嵌入式机器视觉流水线分拣系统设计
- 《电力建设工程施工安全管理导则》(nbt10096-2018)
- 江苏省盐城市东台市第一教育联盟2024-2025学年七年级下学期3月月考英语试题(原卷版+解析版)
- 湖南省2025届高三九校联盟第二次联考历史试卷(含答案解析)
- 2024年全国职业院校技能大赛(高职组)安徽省集训选拔赛“电子商务”赛项规程
- 2025年中考数学复习:翻折问题(含解析)
- (统编版2025新教材)语文七下全册知识点
- 家具全屋定制的成本核算示例-成本实操
- 中国农业银行笔试题库(含答案)
评论
0/150
提交评论