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