操作系统课程设计.doc_第1页
操作系统课程设计.doc_第2页
操作系统课程设计.doc_第3页
操作系统课程设计.doc_第4页
操作系统课程设计.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统课 程 设 计 书 学院 专业 班级 题目 操作系统实验报告 教师 学生 目 录一、 实验题目与要求1实验一 进程创建及进程通信1实验二 生产者-消费者问题1实验三 存储管理实验1二、总的设计思想及环境语言、工具等1三、数据结构与模块说明23.1数据结构设计23.2模块说明2四、源程序及运行结果44.1、实验一 进程创建及进程通信4exam1:创建子进程示例14exam2:创建子进程示例25exam3:利用管道实现单向通信5exam4:利用管道实现父子进程双向通信64.2、实验二 生产者-消费者问题7exam5:实现进程互斥示例程序7exam6:实现进程同步示例程序11exam7:生产者和消费者问题154.3、实验三 存储管理实验20exam8:请求页式存储管理页面置换算法比较20五、自我评价和总结25六、课程设计教材及主要参考资料261、 实验题目与要求实验一 进程创建及进程通信实验目的:掌握linux进程创建的基本方法及进程间的通信实验要求:利用fork()创建子进程,利用pipe()实现进程间的通信。实验二 生产者-消费者问题实验目的:掌握进程之间的同步与互斥实验要求:利用信号量实现生产者-消费者问题。实验三 存储管理实验实验目的:通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。实验要求:(1).通过随机数产生一个页地址流,共640页(2).用户内存容量为4页到32页(3).计算并输出下述各种算法在不同内存容量下的命中率。a.FIFO 先进先出算法b.LRU 最近最少使用页面算法c.OPT 最佳淘汰算法二、总的设计思想及环境语言、工具等总的设计思想:1.利用fork()创建子进程,利用pipe()实现进程间的通信。2.利用信号量实现生产者-消费者问题。3.(1)通过随机数产生一个页地址流,共640页 (2)用户内存容量为4页到32页 (3)计算并输出下述各种算法在不同内存容量下的命中率。a.FIFO 先进先出算法b.LRU 最近最少使用页面算法c.OPT 最佳淘汰算法环境语言:cygwin环境C语言工具: cygwin2.738三、数据结构与模块说明3.1数据结构设计a.实验一1.利用fork()创建一个新进程。2.利用pipe()实现进程间的通信。使子进程与父进程之间实现同步。 3.子进程将信息写入管道并向父进程发出信号,父进程接到信号后从管道中读取信息,并将信息输出,如果读取失败则输出“fork error”。b.实验二生产者进程的功能:生产东西,供消费者消费;消费者进程的功能:消费生产者生产的东西。生产者生产产品并存入缓冲区供消费者取走使用,消费者从缓冲器内取出产品去消费;在生产者和消费者同时工作时,必须禁止生产者将产品放入已装满的缓冲器内,禁止消费者从空缓冲器内取产品。c.实验三系统功能流程图:3.2模块说明a.实验一系统功能模块文字说明:子进程将管道的写入口加锁;将信息“Im fine, and you?”输入到变量line中,n=1,2;将line中的信息写入管道;将管道写入口解锁;exit(1);父进程利用pipe()创建管道;利用fork()创建子进程1;利用fork()创建子进程2;等待从管道中读出子进程1写入的数据,并显示在屏幕上;等待从管道中读出子进程2写入的数据,并显示在屏幕上;exit(1);图3.2.1 进程的创建及通信模块演示b.实验二系统功能模块图:图3.2.2 生产消费者进程模块演示c.实验三系统功能模块图:图3.2.3 页式存储管理模块划分四、源程序及运行结果4.1、实验一 进程创建及进程通信exam1:创建子进程示例1/父进程创建一个子进程,父进程显示金木水火土,子进程显示日月星辰,多次运行该程序会得到不同的运行结果。#include #include #include main()int pid,n=0;srand(getpid();/*设置随机种子*/if (pid=fork()!=0)while(n5)printf(%d,n+);printf(金木水火土n);sleep(rand()%3); /睡眠elsewhile(n5)printf(%d,n+);printf(日月星辰n);sleep(rand()%3);运行结果:exam2:创建子进程示例2/子进程改变了全局变量globa 和局部变量vari的值。通过调试运行,体会进程的运动轨迹。#include #include #include int globa=4;int main(void)pid_t pid;int vari=5;printf(before forkn);if (pid=fork()0)printf(fork errorn);exit(0); else if (pid=0) globa+;vari-; printf(Child changed the vari anf globa.n); else printf(Parent didnt changed the vari and globa.n);printf(globa=%d,vari=%dn,globa,vari);运行结果:exam3:利用管道实现单向通信#include #include #include #define MAXLINE 80int main(void)int n,fd2;pid_t pid;char lineMAXLINE;if (pipe(fd)0)printf(pipe error!n);exit(1);if (pid=fork()0)close(fd0);write(fd1,How are you?n,15);printf(Parent: successfully!n);else close(fd1);n=read(fd0,line,MAXLINE);printf(Child:Reading from the pipe:%sn,line);运行结果:exam4:利用管道实现父子进程双向通信#include #include #include #define MAXLINE 80int main(void)int n,fd12,fd22;pid_t pid;char lineMAXLINE;if (pipe(fd1)0)printf(pipe1 error!n);exit(1);if (pipe(fd2)0)printf(pipe2 error!n);exit(2);if (pid=fork()0)close(fd10);close(fd21);write(fd11,How are you?n,15);printf(Parent: successfully!n);n=read(fd20,line,MAXLINE);printf(Parent:Reading from the pipe:%sn,line);else close(fd11);close(fd20);n=read(fd10,line,MAXLINE);printf(Child:Reading from the pipe:%sn,line);write(fd21,Im fine, and you?n,30);printf(Child:successfullyn);运行结果:4.2、实验二 生产者-消费者问题exam5:实现进程互斥示例程序/*由于cgywin模拟器软件没有完全模拟linux的功能,比如信号量,内存共享、消息缓冲器等,所以实现进程的同步和互斥较为困难。本指导书提供了一个模拟的P和V操作,利用它可实现进程的互斥与同步,本模拟程序在运行过程中可能会出现一些问题,感兴趣的同学可参考本程序,共同研究探讨,逐步完善。源程序 sem.h 模拟P和V操作,在使用信号量时,先通过set_sem_init(int order,int value) 函数对信号量赋初值,参数order说明信号量序号,value为信号呈的初值。P操作的调用为p(int order),order 为信号量的序号。V操作的调用为v(int order),order 为信号量的序号,注意本程序对信号量的使用是通过序号来实现的! */#include #include#include #include #include #include #include #include #define BUF 128#define BUF1 136set_sem_init(int order, int value)int fp; char pv5=pv0,buf1024; buf3=value;buf1=0;buf2=0; pv2+=order; if (fp=open(pv,O_RDWR|O_CREAT)0) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);pv2+=order;if (fp=open(pv,O_RDWR)0)exit(1);read(fp, buf,BUF1); (char)buf3-;if (char)buf30) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);if (fp=open(pv,O_RDWR)0)exit(1);read(fp, buf,BUF1);if (sit0) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);pv2+=order;if (fp=open(pv,O_RDWR)0) exit(1);read(fp, buf,BUF1); (char)buf3+;if (char)buf3=0)buf2+;lseek(fp,0,0);write(fp,buf,BUF1);close(fp);remove(pvfl);main()int pid,n=0;set_sem_init(1,1);if (pid=fork()0)printf(create process errorn);exit(3);elseif (pid=0)while (n4)printf(%d will enter CS!n,getpid();p(1);/p和v操作之间的代码为CSprintf(%d in CS!n,getpid();sleep(1);printf(%d out CS!n,getpid();v(1); n+;elsewhile(n4)printf(tt%d will enter CS!n,getpid();/p和v操作之间的代码为CSp(1); printf(tt%d in CS!n,getpid();sleep(1);printf(tt%d out csn,getpid();v(1); n+;运行结果:exam6:实现进程同步示例程序/实现同步的示例程序,两个进程,一个为写者,一个为读者,一个缓冲器/(注:用文件模拟缓冲器)#include #include#include #include #include #include #include #include #define BUF 128#define BUF1 136set_sem_init(int order, int value)int fp; char pv5=pv0,buf1024; buf3=value;buf1=0;buf2=0; pv2+=order; if (fp=open(pv,O_RDWR|O_CREAT)0) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);pv2+=order;if (fp=open(pv,O_RDWR)0)exit(1);read(fp, buf,BUF1); (char)buf3-;if (char)buf30) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);if (fp=open(pv,O_RDWR)0)exit(1);read(fp, buf,BUF1);if (sit0) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);pv2+=order;if (fp=open(pv,O_RDWR)0) exit(1);read(fp, buf,BUF1); (char)buf3+;if (char)buf3=0)buf2+;lseek(fp,0,0);write(fp,buf,BUF1);close(fp);remove(pvfl);main()int pid,n=0,fp,message; char file10=buffer,buf1024;/ 创建一个文件模拟一个缓冲器 if (fp=open(file,O_RDWR|O_CREAT)0) exit(1); close(fp); chmod(file,666); /设置两个信号量,第一个信号量表示缓冲器空,初值为1,第二个信号量表示缓冲器中是否/准备好数据,初值为0set_sem_init(1,1);set_sem_init(2,0);if (pid=fork()0)printf(create process errorn);exit(3);elseif (pid=0)while (n4)printf(%d will write message!n,getpid();/write messagep(1);message=rand()%127;buf0=message;printf(%d write message: %dn,getpid(),message);if (fp=open(file,O_RDWR)0) exit(1);write(fp,buf,10);close(fp);printf(%d write message OK!n,getpid();v(2); n+;elsewhile(n4)printf(%d will read message!n,getpid();/write messagep(2);if (fp=open(file,O_RDWR)0) exit(1);read(fp,buf,10);close(fp);printf(%d read message: %dn,getpid(),buf0);printf(%d read message OK!n,getpid();v(1); n+;运行结果:exam7:生产者和消费者问题/消费者进程有K个进程,生产者进程有M个,一个有N个单元的缓冲器/(注:用文件模拟缓冲器)#include #include#include #include #include #include #include #include #define BUF 128#define BUF1 136#define N 8#define M 2#define K 2set_sem_init(int order, int value)int fp; char pv5=pv0,buf1024; buf3=value;buf1=0;buf2=0; pv2+=order; if (fp=open(pv,O_RDWR|O_CREAT)0) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);pv2+=order;if (fp=open(pv,O_RDWR)0)exit(1);read(fp, buf,BUF1); (char)buf3-;if (char)buf30) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);if (fp=open(pv,O_RDWR)0)exit(1);read(fp, buf,BUF1);if (sit0) sleep(1);flfp=open(pvfl,O_RDWR|O_CREAT);close(flfp);pv2+=order;if (fp=open(pv,O_RDWR)0) exit(1);read(fp, buf,BUF1); (char)buf3+;if (char)buf3=0)buf2+;lseek(fp,0,0);write(fp,buf,BUF1);close(fp);remove(pvfl);void producer();void consumer();main()int pid,n=0,fp,message,i; char file10=buffers,buf1024;/ 创建一个文件模拟一个缓冲器if (fp=open(file,O_RDWR|O_CREAT)0) exit(1); buf0=0;buf1=0;write(fp,buf,128);close(fp); chmod(file,666); /设置两个信号量,第一个信号量表示缓冲器单元个数,初值为N,第二个信号量表示缓冲器中是否/准备好数据,初值为0,第三个信号量实现互斥,互斥地访问缓冲器。set_sem_init(1,N);set_sem_init(2,0);set_sem_init(3,1);/创建生产者进程for (i=0;iM;i+)if (pid=fork()0) printf(Create producer process error!n);exit(2);if (pid=0)producer();exit(0);/创建消费者进程for (i=0;iK;i+)if (pid=fork()0) printf(Create consumer process error!n);exit(2);if (pid=0)consumer();exit(0);for (i=0;i(M+K);i+)wait(NULL);exit(0);void producer()char buf1024,file10=buffers;int message,fp,n=0;srand(getpid();/*设置随机种子*/while(n3)message=rand()%127;p(1);p(3);printf(%d write buffer: %dn,getpid(),message);if (fp=open(file,O_RDWR)0) exit(1); read(fp,buf,128);bufbuf0+2=message; buf0=(buf0+1)%N;lseek(fp,0,0);write(fp,buf,128);close(fp);printf(%d write okn,getpid();v(3);v(2);n+;void consumer()char buf1024,file10=buffers;int message,fp,sit,n=0;while(n3)p(2);p(3);printf(%d read buffer.n,getpid();if (fp=open(file,O_RDWR)0) exit(1); read(fp,buf,128);message=bufbuf1+2;buf1=(buf1+1)%N;lseek(fp,0,0);write(fp,buf,128);close(fp);printf(%d read ok! message is %dn,getpid(),message);v(3);v(1);n+;运行结果:4.3、实验三 存储管理实验exam8:请求页式存储管理页面置换算法比较#include #include#include #include #include #include #include #include #define BUF 128#define BUF1 136#include #define total_page_address 640 /*作业的地址流数*/#define total_page 32 /*作业的页面数*/int pagetotal_page_address;void FIFO(int mem_frame);void LRU(int mem_frame);void OPT(int mem_frame);main()int i,p,fl;srand(getpid();/*设置随机种子*/*产生页地址流,假设有50%的指令是顺序执行的*/for (i=0;itotal_page_address;i+)pagei=-1;for (i=0;itotal_page_address;i+=2) fl=0;while (fl=0)p=rand()%total_page_address;if (pagep=-1)fl=1;pagep=rand()%total_page; p=0;for (i=0;itotal_page_address;i+)if (pagei=-1) pagei=p;else p=pagei;for (i=4;i=32;i+) /*用户内存工作区从4 个页面到32 个页面*/printf(%2d page frames ,i);FIFO(i);LRU(i);OPT(i);printf(n);void FIFO(int mem_frame)int page_message100,i,ptr=0,j; int invalid=0,exist;/*page_message 存放页面信息,ptr指向最早进入的页面*/for (i=0;i100;i+) page_messagei=-1; /*-1表示无页面*/for (i=0;itotal_page_address;i+)/查找该页是否在内存exist=0;for (j=0;jmem_frame;j+)if (page_messagej=pagei)exist=1; /该页在内存中if (exist=0) /该页不在内存中,失败invalid+;for (j=0;j=mem_frame)page_messageptr=pagei; /淘汰最早进入的页面ptr=(ptr+1) % mem_frame;printf(FIFO: %6.4f ,1-(float)invalid/total_page_address);void LRU(int mem_frame)int page_message100,i,ptr=0,j,m,n; int invalid=0,exist,sit1,sit2;/*page_message 存放页面信息,ptr指向最早进入的页面*/for (i=0;i100;i+) page_messagei=-1; /*-1表示无页面*/for (i=0;itotal_page_address;i+)/查找该页是否在内存exist=0;for (j=0;jmem_frame;j+)if (page_messagej=pagei)exist=1; /该页在内存中if (exist=0) /该页不在内存中,失败invalid+;for (j=0;j=mem_frame)/查找最久未用页面进行淘汰 exist=3333;for (m=0;m=0;n-)if(page_messagem=pagen) sit1=n;break;if (existsit1) exist=sit1;sit2=m;page_messagesit2=pagei;printf(LRU: %6.4f ,1-(float)invalid/total_page_address);void OPT(int mem_frame)int page_message100,i,ptr=0,j,m,n; int invalid=0,exist,sit1,sit2;/*page_message 存放页面信息,ptr指向最早进入的页面*/for (i=0;i100;i+) page_messagei=-1; /*-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论