




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XX学校实验报告课程名称: 学 院: 专 业 班: 姓 名: 学 号: 指导教师: 2011 年 3 月目录实验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个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。2. 软中断通信使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。而父进程等待2个子进程终止后,输出信息“Parent process is killed!”后终止。三、实验要求1. 根据实验内容编写C程序。2. 上机调试程序。3. 记录并分析程序运行结果。四、程序说明和程序流程图实验1管道通信所涉及的流程图:实验2软中断信号所涉及的流程图:五、程序代码/*expe1_1.c*/#include void main( ) int i, r, p1, p2, fd2; char buf50, s50; pipe(fd); /* 父进程建立管道 */ while (p1=fork()=-1); /* 创建子进程P1,失败时循环 */ if (p1=0) /* 由子进程P1返回,执行子进程P1 */ lockf(fd1, 1, 0); /* 加锁锁定写入端 */ sprintf(buf, Child process P1 is sending messages! n); printf(Child process P1! n); write(fd1, buf, 50); /* 把buf中的50个字符写入管道 */ sleep(5); /* 睡眠5秒,让父进程读 */ lockf(fd1, 0, 0); /* 释放管道写入端 */ exit(0); /* 关闭P1*/ else /* 从父进程返回,执行父进程 */ while (p2=fork()=-1); /* 创建子进程P2,失败时循环 */ if (p2=0) /* 从子进程P2返回,执行子进程P2 */ lockf(fd1, 1, 0); /* 锁定写入端 */ sprintf(buf, Child process P2 is sending messages! n); printf(Child process P2! n); write(fd1, buf, 50); /* 把buf中的字符写入管道 */ sleep(5); /* 睡眠5秒,让父进程读 */ lockf(fd1, 0, 0); /* 释放管道写入端 */ exit(0); /* 关闭P2*/ wait(0);if (r=read(fd0, s, 50)= -1) printf(cannot read pipe! n); else printf(%s, s); wait(0);if (r=read(fd0, s, 50)= -1) printf(cannot read pipe! n); else printf(%s, s); exit(0); /*exp1-2.c*/#include#include#includeint p1,p2;void main() void ppdo();void p1do();void p2do();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(nParent process is killed!n); exit(0);void ppdo() kill(p1,SIGUSR1); kill(p2,SIGUSR2);void p1do() printf(nChild process p1 is killed by parent!n); exit(0);void p2do() printf(nChild process p2 is killed by parent!n); exit(0);六、程序运行结果及分析实验1管道通信运行结果截图实验1管道通信结果分析父进程建立后,创建了子进程P1,P2,然后P1,P2分别向管道中写入字符串“Child process p1 is sending message!”和“Child process p2 is sending message!”,父进程从管道中读取字符串。实验2软中断通信运行结果截图实验2软中断通信结果分析先预设中断信号SIGINT,再先后创建子进程P1和P2,预设中断信号SIGUSR1,SIGUER2,当我们按下“Ctrl+C”时,父进程发出中断信号SIGUSR1和SIGUSR2,通知子进程P1和P2,子进程捕捉到信号后分别输出相应的信息后,终止,最后输出“Parent process is killed!”后终止。实验后思考: 通过这次实验,深刻地了解到了管道通信和软中断通信的详细过程,深化了老师课堂上的讲解,对整个过程的把握也更加清晰了。 很值得的一次学习经历,做完实验,再画流程图,程序运行的细节熟悉于心,了如指掌。七指导教师评议 成绩等级 实验2 进程通信一、实验目的1. 了解进程间通信IPC的三种方式:消息队列、共享内存和信号量。2. 掌握使用消息队列进行进程间通信的有关系统调用和编程方法。3. 掌握使用共享内存进行进程间通信的有关系统调用和编程方法。二、实验内容1. 消息队列使用系统调用msgget( )、msgsnd( )、msgrcv( )和msgctl( ),用消息队列机制实现客户进程和服务器进程间的通信。客户进程首先建立一个描述符为msgqid的消息队列,接着向服务器进程发送一个消息正文为自己的进程标识pid且类型为1的消息,然后接收来自服务器进程的消息,并在屏幕上显示:“Client receives a message from xxxx!”,其中“xxxx”为服务器进程的进程标识。服务器进程首先捕捉软中断信号(除不能捕捉的SIGKILL),若捕捉到时则调用函数cleanup( )删除消息队列,终止服务器进程。否则重复下列操作:接收所有类型为1的消息,并在屏幕上显示:“Server receives a message from xxxx!”,其中“xxxx”为客户进程的进程标识;然后服务器进程将客户进程的进程标识作为返回消息的类型,而将自己的进程标识作为消息正文发送给客户进程。2. 共享内存使用系统调用shmget( )、shmat( )和shmctl( ),用共享内存机制实现进程间的通信。其中一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据并显示在屏幕上。三、实验要求1. 根据实验内容编写C程序。2. 上机调试程序。3. 记录并分析程序运行结果。四、程序说明和程序流程图实验1消息队列流程图五、程序代码实验1消息队列/* msg_client.c */#include #include #include #define MSGKEY 75struct msgform long mtype; char mtext256;main() struct msgform msg; int msgqid,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: receive from pid %dn,*pint);/* msg_server.c */#include #include #include #define MSGKEY 75struct msgform long mtype; char mtext256;msg;int msgqid;main() int i,pid,*pint; extern cleanup(); for (i=0;i20;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: receive from pid %dn,pid); msg.mtype=pid; *pint=getpid(); msgsnd(msgqid,&msg,sizeof(int),0);cleanup() msgctl(msgqid,IPC_RMID,0); exit(0);实验2共享内存#include#include#include#define SHMKEY 75#define K 1024int shmid;main() int i, * pint; char * addr;extern char * shmat(); shmid = shmget(SHMKEY, 8 * K, 0777); addr = shmat (shmid,0,0); pint = (int *)addr; while ( * pint=0 ) for (i=0; i256; *pint+) printf(%dn, *pint+);#include#include#include#define SHMKEY 75#define K 1024int shmid;main() int i, * pint; char * addr; extern char * shmat(); extern cleanup(); for(i=0; i20; i+) sinal (i, cleanup); shmid = shmget (SHMKEY, 16 * K, 0777|IPC_CREAT); addr = shmat (shmid,0,0); printf(addr 0x%x n, addr); pint = (int *)addr; for(i=0; i256; 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) 用户内存容量为432页面(page frame);(3) 用户虚存容量为32K(即32页)。若10条指令为1页,则320条指令在虚存中的存放方式为:第0页(虚存地址0,9)第0条第9条指令;第1页(虚存地址10,19)第10条第19条指令; 第31页(虚存地址310,319)第310条第319条指令。3. 计算并输出下列算法在不同内存容量下的命中率(命中率=1-缺页率)。(1) FIFOFirst In First Out Page Replacement Algorithm(2) LRULeast Recently Used Page Replacement Algorithm三、实验要求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) 用户内存容量为432页面(page frame);(3) 用户虚存容量为32K(即32页)。若10条指令为1页,则320条指令在虚存中的存放方式为:第0页(虚存地址0,9)第0条第9条指令;第1页(虚存地址10,19)第10条第19条指令; 第31页(虚存地址310,319)第310条第319条指令。3. 计算并输出下列算法在不同内存容量下的命中率(命中率=1-缺页率)。(1) FIFOFirst In First Out Page Replacement Algorithm(2) LRULeast Recently Used Page Replacement Algorithm流程图:五、程序代码#include #include / #include /* Windows环境,getpid()原型在process.h中 */#define TRUE 1#define FALSE 0#define INVALID -1#define NULL 0#define total_instruction 320/* 指令条数 */#define total_vp 32/* 虚页数 */#define clear_period 50/* NRU清0周期 */typedef struct /* 页表结构 */ int pn,pfn,counter,time;/* counter(LFU),time(LRU) */ pl_type;pl_type pltotal_vp;/*页表 */struct pfc_struct /* 存储页面表 */ int pn,pfn; struct pfc_struct *next;typedef struct pfc_struct pfc_type;pfc_type pfctotal_vp,*freepf_head,*busypf_head,*busypf_tail;int diseffect,atotal_instruction;/* 缺页次数,指令流 */int pagetotal_instruction,offsettotal_instruction;void initialize(int);void fifo(int);void lru(int);void opt(int); void lfu(int); void nur(int);void main() int s,i,j; srand(getpid()*10);/* 进程标识作为随机数种子 */ s=(float)319*rand()/;/* 0319 */ / s=(float)319*rand()/32767;/* 0319 */ for (i=0; itotal_instruction; i+=4) ai=s; /* s=0319 */ ai+1=ai+1; /* s+1 */ ai+2=(float)ai*rand()/;/*m=0s*/ / ai+2=(float)ai*rand()/32767;/*m=0s*/ ai+3=ai+2+1; /* m+1*/ s=(float)rand()*(317-ai+2)/+ai+2+2;/* m+2319 */ / s=(float)rand()*(317-ai+2)/32767+ai+2+2;/* m+2319 */ for (i=0;itotal_instruction;i+) pagei=ai/10; offseti=ai%10; for (i=4;i=32;i+)/* 用户内存工作区4-32个页面 */ printf(%2d page frames,i); fifo(i); lru(i); opt(i); lfu(i); nur(i); printf(n); void initialize(int total_pf) int i; diseffect=0; for (i=0;itotal_vp;i+) pli.pn=i;pli.pfn=INVALID; pli.counter=0;pli.time=-1; for (i=1;itotal_pf;i+) pfci-1.next=&pfci;pfci-1.pfn=i-1; pfctotal_pf-1.next=NULL; pfctotal_pf-1.pfn=total_pf-1; freepf_head=&pfc0; void fifo(int total_pf) int i,j; pfc_type *p; initialize(total_pf); busypf_head=busypf_tail=NULL;/* 置忙页面队列为空 */ for (i=0;inext; plbusypf_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=pagei; plpagei.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);void lru(int total_pf) int min,minj,i,j,present_time; initialize(total_pf);present_time=0; for (i=0;itotal_instruction;i+) if (plpagei.pfn=INVALID) diseffect+; if (freepf_head=NULL) min=32767; for (j=0;jplj.time&plj.pfn!=INVALID) min=plj.time;minj=j; freepf_head=&pfcplminj.pfn;/* 插入空闲链表 */ plminj.pfn=INVALID; plminj.time=-1; freepf_head-next=NULL; plpagei.pfn=freepf_head-pfn; plpagei.time=present_time; freepf_head=freepf_head-next; else plpagei.time=present_time; present_time+; printf( LRU: %6.4f,1-(float)diseffect/320); void opt(int total_pf) int i,j,max,maxpage,d,disttotal_vp; initialize(total_pf); for (i=0;itotal_instruction;i+) if (plpagei.pfn=INVALID) diseffect+; if (freepf_head=NULL) for (j=0;jtotal_vp;j+) if (plj.pfn!=INVALID) distj=32767; else distj=0;/* 页在内存中距离非0,不在内存距离为0 */ d=1;/* 计算内存中页面与当前访问页面的距离 */ for (j=i+1;jtotal_instruction;j+) if (plpagej.pfn!=INVALID) distpagej=d; d+; max=-1;/* 淘汰距离最远的页 */ for (j=0;jtotal_vp;j+) if (maxnext=NULL; plmaxpage.pfn=INVALID; plpagei.pfn=freepf_head-pfn; freepf_head=freepf_head-next; printf( OPT: %6.4f,1-(float)diseffect/320);void lfu(int total_pf) int i,j,min,minpage; initialize(total_pf); for (i=0;itotal_instruction;i+) if (plpagei.pfn=INVALID) diseffect+; if (freepf_head=NULL) min=32767; for (j=0;jplj.counter & plj.pfn!=INVALID) min=plj.counter;minpage=j; plj.counter=0; freepf_head=&pfcplminpage.pfn; plminpage.pfn=INVALID; freepf_head-next=NULL; plpagei.pfn=freepf_head-pfn; freepf_head=freepf_head-next; else plpagei.counter+; printf( LFU: %6.4f,1-(float)diseffect/320);void nur(int total_pf) int i,j,dp,cont_flag,old_dp; initialize(total_pf); dp=0; for (i=0;itotal_instruction;i+) if (plpagei.pfn=INVALID) diseffect+; if (freepf_head=NULL) cont_flag=TRUE;old_dp=dp; while (cont_flag) if (pldp.counter=0&pldp.pfn!=INVALID) cont_flag=FALSE; else dp+; if (dp=total_vp) dp=0; if (dp=old_dp) for (j=0;jnext=NULL; plpagei.pfn=freepf_head-pfn; freepf_head=freepf_head-next; else plpagei.counter=1; if (i%clear_period=0) for (j=0;jtotal_vp;j+) plj.counter=0; printf( NUR: %6.4f,1-(float)diseffect/320);六、程序运行结果及分析实验运行结果截图:实验结果分析:先随机产生320条指令,然后转化为页地址流,分别执行FIF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 弱电网络考试题及答案
- 药学本科试题及答案
- 气胸内科试题及答案
- 2025年合肥肥西县桃花初级中学教师招聘考试试题(含答案)
- 法院考试面试题及答案
- 湘西中考试题及答案
- 2025年灌南县教育系统招聘教师考试笔试试题(含答案)
- 校保卫处消防知识培训课件
- 急救技能知识模拟试题库及答案
- 饭店服务与管理试题库含答案
- 胶质瘤影像诊断
- 中药学专业大学生职业生涯规划与行业趋势
- ESD静电管理评审计划+管理评审报告全套资料
- 04735数据库系统原理-串讲
- 绿色工厂培训课件
- 制造业的网络安全培训
- 接触网工程图识图 六跨电分相绝缘锚段关节安装图的识图
- 工业厂房监理规划范本
- 中建硅墨烯保温板外墙保温施工方案
- 急性心肌梗死的护理PPT
- 花卉学 二年生花卉
评论
0/150
提交评论