ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:746.99KB ,
资源ID:8776374      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8776374.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统原理实验报告最终版汇总.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统原理实验报告最终版汇总.docx

1、操作系统原理实验报告最终版汇总XX学校实验报告课程名称: 学 院: 专 业 班: 姓 名: 学 号: 指导教师: 2011 年 3 月实验1 进程管理一、实验目的1. 弄清进程和程序的区别,加深对进程概念的理解。2. 了解并发进程的执行过程,进一步认识并发执行的实质。3. 掌握解决进程互斥使用资源的方法。二、实验内容1. 管道通信使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending

2、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个子进程终止后

3、,输出信息“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返回,执行子进程P

4、1 */ 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,失

5、败时循环 */ 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,

6、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,

7、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 pa

8、rent!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,通知子进

9、程P1和P2,子进程捕捉到信号后分别输出相应的信息后,终止,最后输出“Parent process is killed!”后终止。实验后思考: 通过这次实验,深刻地了解到了管道通信和软中断通信的详细过程,深化了老师课堂上的讲解,对整个过程的把握也更加清晰了。 很值得的一次学习经历,做完实验,再画流程图,程序运行的细节熟悉于心,了如指掌。七指导教师评议 成绩等级 实验2 进程通信一、实验目的1. 了解进程间通信IPC的三种方式:消息队列、共享内存和信号量。2. 掌握使用消息队列进行进程间通信的有关系统调用和编程方法。3. 掌握使用共享内存进行进程间通信的有关系统调用和编程方法。二、实验内容1.

10、消息队列使用系统调用msgget( )、msgsnd( )、msgrcv( )和msgctl( ),用消息队列机制实现客户进程和服务器进程间的通信。客户进程首先建立一个描述符为msgqid的消息队列,接着向服务器进程发送一个消息正文为自己的进程标识pid且类型为1的消息,然后接收来自服务器进程的消息,并在屏幕上显示:“Client receives a message from xxxx!”,其中“xxxx”为服务器进程的进程标识。服务器进程首先捕捉软中断信号(除不能捕捉的SIGKILL),若捕捉到时则调用函数cleanup( )删除消息队列,终止服务器进程。否则重复下列操作:接收所有类型为1

11、的消息,并在屏幕上显示:“Server receives a message from xxxx!”,其中“xxxx”为客户进程的进程标识;然后服务器进程将客户进程的进程标识作为返回消息的类型,而将自己的进程标识作为消息正文发送给客户进程。2. 共享内存使用系统调用shmget( )、shmat( )和shmctl( ),用共享内存机制实现进程间的通信。其中一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据并显示在屏幕上。三、实验要求1. 根据实验内容编写C程序。2. 上机调试程序。3. 记录并分析程序运行结果。四、程序说明和程序流程图实验1消息队列流程图五、程序代码实验1消息队列/

12、* 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,&

13、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=msg

14、get(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

15、#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() i

16、nt 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();c

17、leanup() shmctl (shmid, IPC_RMID, 0); exit(0);六、程序运行结果及分析实验1消息队列运行结果截图客户端:服务器端:实验1消息队列结果分析服务端程序监听软中断,建立消息队列,循环在队列中接收类型为1的消息,每接收一个消息向队列中增加一个类型为客户进程ID的消息。当发生软中断时,删除消息队列。客户端进程创建和服务端相同的消息队列,并向消息队列中发送类型为1的消息,然后接收类型为客户进程ID的消息。实验后思考: 对消息队列的运行情况有所了解,但关于内存共享部分尚需仔细研究。七指导教师评议 成绩等级 实验3 存储管理一、实验目的1. 了解虚拟存储管理技术的原

18、理与特点。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

19、. 将指令序列变换为页地址流,设:(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

20、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) 顺序执行一条指令,即执行地址为

21、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

22、 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 cl

23、ear_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_ta

24、il;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()/2147483647; /* 0319 */ /

25、 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()/2147483647; /*m=0s*/ / ai+2=(float)ai*rand()/32767; /*m=0s*/ ai+3=ai+2+1; /* m+1*/ s=(float)rand()*(317-ai+2)/2147483147+ai+2+2; /* m+2319 */ / s=(float)rand()*(31

26、7-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.p

27、fn=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=NU

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1