操作系统课程设计.docx
- 文档编号:16698473
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:40
- 大小:193.11KB
操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(40页珍藏版)》请在冰点文库上搜索。
操作系统课程设计
操作系统
课程设计书
学院
专业
班级
题目操作系统实验报告
教师
学生
目录
一、实验题目与要求1
实验一进程创建及进程通信1
实验二生产者-消费者问题1
实验三存储管理实验1
二、总的设计思想及环境语言、工具等1
三、数据结构与模块说明2
3.1数据结构设计2
3.2模块说明2
四、源程序及运行结果4
4.1、实验一进程创建及进程通信4
exam1:
创建子进程示例14
exam2:
创建子进程示例25
exam3:
利用管道实现单向通信5
exam4:
利用管道实现父子进程双向通信6
4.2、实验二生产者-消费者问题7
exam5:
实现进程互斥示例程序7
exam6:
实现进程同步示例程序11
exam7:
生产者和消费者问题15
4.3、实验三存储管理实验20
exam8:
请求页式存储管理页面置换算法比较20
五、自我评价和总结25
六、课程设计教材及主要参考资料26
1、实验题目与要求
实验一进程创建及进程通信
实验目的:
掌握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.子进程将信息写入管道并向父进程发出信号,父进程接到信号后从管道中读取信息,并将信息输出,如果读取失败则输出“forkerror”。
b.实验二
生产者进程的功能:
生产东西,供消费者消费;
消费者进程的功能:
消费生产者生产的东西。
生产者生产产品并存入缓冲区供消费者取走使用,消费者从缓冲器内取出产品去消费;
在生产者和消费者同时工作时,必须禁止生产者将产品放入已装满的缓冲器内,禁止消费者从空缓冲器内取产品。
c.实验三
系统功能流程图:
3.2模块说明
a.实验一
系统功能模块文字说明:
子进程
将管道的写入口加锁;
将信息“I'mfine,andyou?
”输入到变量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()
{
intpid,n=0;
srand(getpid());/*设置随机种子*/
if((pid=fork())!
=0)
while(n<5)
{printf("%d",n++);
printf("金木水火土\n");
sleep(rand()%3);}//睡眠
else
while(n<5)
{printf("%d",n++);
printf("日月星辰\n");
sleep(rand()%3);
}
}
运行结果:
exam2:
创建子进程示例2
//子进程改变了全局变量globa和局部变量vari的值。
通过调试运行,体会进程的运动轨迹。
#include
#include
#include
intgloba=4;
intmain(void)
{pid_tpid;
intvari=5;
printf("beforefork\n");
if((pid=fork())<0){
printf("forkerror\n");
exit(0);
}
elseif(pid==0){
globa++;
vari--;
printf("Childchangedthevarianfgloba.\n");
}
elseprintf("Parentdidn'tchangedthevariandgloba.\n");
printf("globa=%d,vari=%d\n",globa,vari);
}
运行结果:
exam3:
利用管道实现单向通信
#include
#include
#include
#defineMAXLINE80
intmain(void)
{intn,fd[2];
pid_tpid;
charline[MAXLINE];
if(pipe(fd)<0)
{
printf("pipeerror!
\n");
exit
(1);
}
if((pid=fork())<0)
{printf("forkerror\n");
exit
(1);
}
elseif(pid>0){
close(fd[0]);
write(fd[1],"Howareyou?
\n",15);
printf("Parent:
successfully!
\n");
}
else{
close(fd[1]);
n=read(fd[0],line,MAXLINE);
printf("Child:
Readingfromthepipe:
%s\n",line);
}
}
运行结果:
exam4:
利用管道实现父子进程双向通信
#include
#include
#include
#defineMAXLINE80
intmain(void)
{intn,fd1[2],fd2[2];
pid_tpid;
charline[MAXLINE];
if(pipe(fd1)<0)
{
printf("pipe1error!
\n");
exit
(1);
}
if(pipe(fd2)<0)
{
printf("pipe2error!
\n");
exit
(2);
}
if((pid=fork())<0)
{printf("forkerror\n");
exit
(1);
}
elseif(pid>0){
close(fd1[0]);close(fd2[1]);
write(fd1[1],"Howareyou?
\n",15);
printf("Parent:
successfully!
\n");
n=read(fd2[0],line,MAXLINE);
printf("Parent:
Readingfromthepipe:
%s\n",line);
}
else{
close(fd1[1]);close(fd2[0]);
n=read(fd1[0],line,MAXLINE);
printf("Child:
Readingfromthepipe:
%s\n",line);
write(fd2[1],"I'mfine,andyou?
\n",30);
printf("Child:
successfully\n");
}
}
运行结果:
4.2、实验二生产者-消费者问题
exam5:
实现进程互斥示例程序
/*由于cgywin模拟器软件没有完全模拟linux的功能,比如信号量,内存共享、消息缓冲器等,所以实现进程的同步和互斥较为困难。
本指导书提供了一个模拟的P和V操作,利用它可实现进程的互斥与同步,本模拟程序在运行过程中可能会出现一些问题,感兴趣的同学可参考本程序,共同研究探讨,逐步完善。
源程序sem.h
模拟P和V操作,在使用信号量时,先通过set_sem_init(intorder,intvalue)函数对信号量赋初值,参数order说明信号量序号,value为信号呈的初值。
P操作的调用为p(intorder),order为信号量的序号。
V操作的调用为v(intorder),order为信号量的序号,
注意本程序对信号量的使用是通过序号来实现的!
*/
#include
#include
#include
#include
#include
#include
#include
#include
#defineBUF128
#defineBUF1136
set_sem_init(intorder,intvalue)
{
intfp;
charpv[5]="pv0",buf[1024];
buf[3]=value;buf[1]=0;buf[2]=0;
pv[2]+=order;
if((fp=open(pv,O_RDWR|O_CREAT))<0)exit
(1);
write(fp,buf,BUF1);
close(fp);
chmod(pv,666);
}
voidp(intorder)
{intflfp,fp,sit;
unsignedcharbuf[1024];
charpv[5]="pv0";
while((flfp=open("pvfl",O_RDWR))>0)sleep
(1);
flfp=open("pvfl",O_RDWR|O_CREAT);
close(flfp);
pv[2]+=order;
if((fp=open(pv,O_RDWR))<0)exit
(1);
read(fp,buf,BUF1);
(char)buf[3]--;
if((char)buf[3]<0)
{sit=buf[1]++;
lseek(fp,0,0);
write(fp,buf,BUF1);
close(fp);
remove("pvfl");
printf("%dblocked!
\n",getpid());
sleep
(1);
while
(1)
{while((flfp=open("pvfl",O_RDWR))>0)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(sit {close(fp); remove("pvfl"); break; } else {close(fp); remove("pvfl"); sleep (1); } } } else {lseek(fp,0,0); write(fp,buf,BUF1); close(fp); remove("pvfl"); } } voidv(intorder) {intflfp,fp,sit; unsignedcharbuf[1024]; charpv[5]="pv0"; while((flfp=open("pvfl",O_RDWR))>0)sleep (1); flfp=open("pvfl",O_RDWR|O_CREAT); close(flfp); pv[2]+=order; if((fp=open(pv,O_RDWR))<0)exit (1); read(fp,buf,BUF1); (char)buf[3]++; if((char)buf[3]<=0) buf[2]++; lseek(fp,0,0); write(fp,buf,BUF1); close(fp); remove("pvfl"); } main() { intpid,n=0; set_sem_init(1,1); if((pid=fork())<0) {printf("createprocesserror\n"); exit(3); } else if(pid==0) {while(n<4) {printf("%dwillenterCS! \n",getpid()); p (1); //p和v操作之间的代码为CS printf("%dinCS! \n",getpid()); sleep (1); printf("%doutCS! \n",getpid()); v (1);n++; } } else {while(n<4) {printf("\t\t%dwillenterCS! \n",getpid()); //p和v操作之间的代码为CS p (1); printf("\t\t%dinCS! \n",getpid()); sleep (1); printf("\t\t%doutcs\n",getpid()); v (1);n++; } } } 运行结果: exam6: 实现进程同步示例程序 //实现同步的示例程序,两个进程,一个为写者,一个为读者,一个缓冲器 //(注: 用文件模拟缓冲器) #include #include #include #include #include #include #include #include #defineBUF128 #defineBUF1136 set_sem_init(intorder,intvalue) {intfp; charpv[5]="pv0",buf[1024]; buf[3]=value;buf[1]=0;buf[2]=0; pv[2]+=order; if((fp=open(pv,O_RDWR|O_CREAT))<0)exit (1); write(fp,buf,BUF1); close(fp); chmod(pv,666); } voidp(intorder) {intflfp,fp,sit; unsignedcharbuf[1024]; charpv[5]="pv0"; while((flfp=open("pvfl",O_RDWR))>0)sleep (1); flfp=open("pvfl",O_RDWR|O_CREAT); close(flfp); pv[2]+=order; if((fp=open(pv,O_RDWR))<0)exit (1); read(fp,buf,BUF1); (char)buf[3]--; if((char)buf[3]<0) {sit=buf[1]++; lseek(fp,0,0); write(fp,buf,BUF1); close(fp); remove("pvfl"); printf("%dblocked! \n",getpid()); sleep (1); while (1) {while((flfp=open("pvfl",O_RDWR))>0)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(sit {close(fp); remove("pvfl"); break; } else {close(fp); remove("pvfl"); sleep (1); } } } else {lseek(fp,0,0); write(fp,buf,BUF1); close(fp); remove("pvfl"); } } voidv(intorder) {intflfp,fp,sit; unsignedcharbuf[1024]; charpv[5]="pv0"; while((flfp=open("pvfl",O_RDWR))>0)sleep (1); flfp=open("pvfl",O_RDWR|O_CREAT); close(flfp); pv[2]+=order; if((fp=open(pv,O_RDWR))<0)exit (1); read(fp,buf,BUF1); (char)buf[3]++; if((char)buf[3]<=0) buf[2]++; lseek(fp,0,0); write(fp,buf,BUF1); close(fp); remove("pvfl"); } main() {intpid,n=0,fp,message; charfile[10]="buffer",buf[1024]; //创建一个文件模拟一个缓冲器 if((fp=open(file,O_RDWR|O_CREAT))<0)exit (1); close(fp); chmod(file,666); //设置两个信号量,第一个信号量表示缓冲器空,初值为1,第二个信号量表示缓冲器中是否 //准备好数据,初值为0 set_sem_init(1,1); set_sem_init(2,0); if((pid=fork())<0) {printf("createprocesserror\n"); exit(3); } else if(pid==0) {while(n<4) {printf("%dwillwritemessage! \n",getpid()); //writemessage p (1); message=rand()%127; buf[0]=message; printf("%dwritemessage: %d\n",getpid(),message); if((fp=open(file,O_RDWR))<0)exit (1); write(fp,buf,10); close(fp); printf("%dwritemessageOK! \n",getpid()); v (2);n++; } } else {while(n<4) {printf("%dwillreadmessage! \n",getpid()); //writemessage p (2); if((fp=open(file,O_RDWR))<0)exit (1); read(fp,buf,10); close(fp); printf("%dreadmessage: %d\n",getpid(),buf[0]); printf("%dreadmessageOK! \n",getpid()); v (1);n++; } } } 运行结果: exam7: 生产者和消费者问题 //消费者进程有K个进程,生产者进程有M个,一个有N个单元的缓冲器 //(注: 用文件模拟缓冲器) #include #include #include #include #include #include #include #include #defineBUF128 #defineBUF1136 #defineN8 #defineM2 #defineK2 set_sem_init(intorder,intvalue) {intfp; charpv[5]="pv0",buf[1024]; buf[3]=value;buf[1]=0;buf[2]=0; pv[2]+=order; if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)