




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、课程设计目的本课程设计是学生学习完计算机操作系统课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。二、课程设计要求从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:每位同学从所给题目中任选一个(如自拟题目,需经教师同意),且必须独立完成课程设计,不能相互抄袭。设计完成后,将所完成的作品交由老师检查。要求写出一份详细的设计报告。三、课程设计题目编程模拟多进程共享临界资源四、课程设计功能和目标1、要求产生至少3个进程:2、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显
2、示:“进程x请求进入临界区”,同时向管理进程提出申请;在临界区中等待一段随机时间,并显示:“进程x正在临界区”;当时间结束,显示:“进程x退出临界区”,同时向管理进程提出退出申请。3、一个进程作为原语级管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;4、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。5、进程间通信可以采用信号、消息传递、管道或网络通信方式。五、课程设计实现原理 通过编写,创建两个进程模拟需要进入临界区,另外编写一个进程作为原语的管理进程,其负责两个进程的进入!接着设置一个临界区,让
3、其进程在其中访问遵循空闲让进、忙则等待、有限等待、让权等待的准则。当进程和临界区建立好后,临界区的数据传输,受到了系统硬件的支持,不耗费多余的资源;而进程间通信传递,由软件进行控制和实现,需要消耗一定的CPU资源。从这个意义上讲,临界区更适合频繁和大量的数据传输。进程信息的传递,自身就带有同步的控制。当等到信息的时候,进程进入睡眠状态,不再消耗CPU资源。而共享队列如果不借助其他机制进行同步,接收数据的一方必须进行不断的查询,白白浪费了大量的CPU资源。六、课程设计思想、方法和技术(含数据结构、算法、流程图)6.1、 设计思想和设计函数功能:6.1.1 、总体构思:软件主要是由两部分组成:用户
4、进程和管理进程; 管理进程:控制设置相应的临界区,实现对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。用户进程:循环的随机申请进入临界区,进入临界区执行一段时间,再申请结束。6.1.2 、具体功能:用户进程随机的进入cpu执行,先向在信息队列中写入自己的信息(已经约定好的信息类型)然后给管理进程发送信号(告知管理进程申请进入临界区并已在消息队列中写入自己的信息)。然后循环的读取管理进程给用户进程发回的回馈信息(针对当前临界区的状态)允许进入、临界区忙等待。如果允许进入则在临界区执行一段时间以后,申请退出,给管理进程发退出的信号,管理进程再给用户进程发送回馈信息。取会指导回馈信
5、息以后则这次过程结束,进入新的过程。 管理进程接收申请进入的信号,在消息队列中取下申请进入队列的用户进程的信息,针对当前临界区状态,写一个回馈信息放入消息队列。6.2、包含的数据结构6.1.1 、临界区:Struct crform Int sem; /临界区的信号量值sem Int head; /临界区等待队列的头,指向的是最先到的进程Int tail; /临界区等待队列的尾,指向的是进入等待队列的进程 Int duilie20; /存放的是等待的进程的信息,以便唤醒cr; Cr.sem=1; /初始临界区信号量必须为一,因为只允许一个进程进入临界区Cr.head=0; /初始时指向等待队列的
6、第一个单元Cr.tail=0;6.1.2 、消息队列:Struct msgform Long msgtype; /消息的类型,在取消息队列时用于区分哪些是该取的信息 Int mtext; /信息的内容,在这里是申请退出进程的信息 ;6.3、主要用到的技术6.3.1进程创建和控制:系统调用:fork()包含头文件<unistd.h> 关键的语句: int x,y; while(x=fork()=-1);/创建子进程1 if(x=0) /子进程1执行程序段 else while(y=fork()=-1); if(y=0) /子进程2执行程序段 else /父进程执行程序段 6.3.2软
7、中断:系统调用kill()和signal()包含头文件:<sys/types.h>和<signal.h> Kill(pid,signalname) 发送信号给pid号为pid的进程,中断类型为signalname6.3.3消息队列:系统调用msgget()、msgsnd()、msgrev()、msgctl()包含头文件:<sys/msg.h>6.4、设计流程图图1 用户进程流程图图2 管理进程图3 申请进入临界区处理子进程图4 申请退出处理子程序七、运行环境Linux操作系统C+编译器八、开发工具和编程语言开发工具:C+编译器编程语言:C语言九、详细设计子函
8、数一:void into()/申请进入临界区 msgqid=msgget(MSGKEY,0777|IPC_CREAT); sem-;一旦申请进入临界区,减一 msgrcv(msgqid,&msg,4,1,0); /接收消息-申请进入进程发送的类型为1 msg.msgtype=msg.mtext; /并把接收到的消息内容作为回馈消息的消息类型 if(sem>=0) /判断此时进程的状态,sem>=0 可以获得临界区 if(msg.mtext=3) printf(" p1 IN areann"); else printf(" p2 IN arean
9、n"); msg.mtext=1; /现在允许进入,发送内容为1的消息给申请进程 msgsnd(msgqid,&msg,sizeof(int),0); else if(msg.mtext=3) printf(" p1 IN waitingnn"); else printf(" p2 IN waitingnn"); cr.duilietail=msg.mtext; tail+; msg.mtext=-1; msgsnd(msgqid,&msg,sizeof(int),0); /若临界区忙,发送进入等待队列的消息给申请进入的进程 子
10、函数二: void out() msgqid=msgget(MSGKEY,0777|IPC_CREAT); msgrcv(msgqid,&msg,4,2,0); /从消息队列上取下申请退出的消息 sem+; if(tail!=head) /查看等待队列中是否有等待进入临界区的队列 /有则唤醒等待队列中等待的进程,并允许申请退出的进程退出 if(msg.mtext=3) printf(" p1 OUT areann"); else printf(" p2 OUT areann"); msg.msgtype=msg.mtext; msg.mtext=
11、0; msgsnd(msgqid,&msg,sizeof(int),0); pid2=cr.duilietail; tail+; msg.mtext=1; msg.msgtype=pid2; if(pid2=3) printf(" p1 IN areann"); else printf(" p2 IN areann"); msgsnd(msgqid,&msg,sizeof(int),0); msg.mtext=1; else/如果等待队列上没有等待进入临界区的进程,直接向申请退出的进程发送消息,允许退出 if(msg.mtext=3) p
12、rintf(" p1 OUT areann"); else printf(" p2 OUT areann"); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,sizeof(int),0); int main() int sem=1; int head=0; int tail=0; int msgqid1; msgqid1=msgget(MSGKEY,0777); msgctl(msgqid1,IPC_RMID,NULL); int m1,m2; int q,t; int pid; q
13、=MAXTIMES; t=MAXTIMES; int count1,count2; struct msgform msg; int msgqid; pid=getpid(); signal(10,into); /建立连接,收到软中断后转向INTO子处理程序signal(12,out); / 建立连接,收到软中断后转向OUT子处理程序 msgqid=msgget(MSGKEY,0777|IPC_CREAT); /获取消息队列的队列号 while(p1=fork()=-1); if(p1=0) count1=10; while(count1>0) q=MAXTIMES; /设置有限等待次数
14、msg.mtext=3; msg.msgtype=1; /申请进入临界区的消息类型都为1 printf(" p1 Qing IN areann"); msgsnd(msgqid,&msg,sizeof(int),0); /发送申请进入的消息 kill(pid,10); /发送申请进入的信号 while(q>0) msgrcv(msgqid,&msg,sizeof(int),3,0); /接收管理进程发送的回馈信息 m1=msg.mtext; if(m1=1) /判断回馈信息,有三种情况:允许进入,忙进入等待队列、允许退出 msg.msgtype=2;
15、msg.mtext=3; printf(" p1 Qing OUT areann"); msgsnd(msgqid,&msg,sizeof(int),0); kill(pid,12); continue; else if(m1=-1) q-; else if(m1=0) break; sleep(8); count1-; else while(p2=fork()=-1); if(p2=0) count2=10; while(count2>0) t=MAXTIMES; msg.mtext=4; msg.msgtype=1; printf(" p2 Qi
16、ng IN areann"); msgsnd(msgqid,&msg,sizeof(int),0); kill(pid,10); while(t>0) msgrcv(msgqid,&msg,4,4,0); m2=msg.mtext; if(m2=1) msg.msgtype=2; msg.mtext=4; printf(" p2 Qing OUT areann"); msgsnd(msgqid,&msg,sizeof(int),0); kill(pid,12); continue; else if(m2=0) break; sleep
17、(8); count2-; else while(1) sleep(8); 十 调试分析在作这个课题过程中遇到了主要的这样几个问题:u 消息队列不能正常使用错误原因1: 消息队列没有建立成功解决办法: 在用消息队列之初先删除这个队列,然后再建立使用错误原因2: 取到的结果总出现错误,没有统一的消息类型解决办法: 定制统一的消息类型规则,依照规则使用消息类型错误原因3: 进程需要的消息已经被取走,使得进程停留在取消息这一步不向下执行解决办法: 是程序逻辑上的问题,仔细查看程序流程并操控好使得可以处于正常逻辑u 申请到临界区退出临界区显示滞后(如有时会显示“进程一 获得临界区”然后“进程二 退出临
18、界区”)错误原因: 在管理进程中已经将临界区状态修改为空闲,却没有显示哪个进程退出临界区,这个退出的信息必须等到子进程上cpu时才会显示出来,而这中间有别的进程上cpu执行申请的操作,就会获得临界区,就会显示“进程获得临界区”,在此后退出临界区的进程才上cpu显示“退出临界区”。解决办法: 将显示放到管理进程中,一旦有进程获得临界区或者退出临界区就做出显示。7 测试结果测试截图:图1 主程序运行界面图2 主程序运行界面 图3 主程序运行界面参考文献1 任满杰等操作系统原理实用教程 电子工业出版社 2006任满杰/dp/B0011BURI2/475-6225805-5830756?ie=UTF8
19、&*Version*=1&*entries*=02 张尧学 宋红 张高编著计算机操作系统教程实验指导 清华大学出版社 第四版5 赛奎春、张雨 编著,Visual C+ 工程应用与项目实践,海洋出版社,2005.1心得体会这次操作系统课设给了我很大的启发和提高。一直以来自己我的编程基础不太好,常出现逻辑混乱,不注重细节问题,在这门课中我有了更深的理解;科学是不允许错误的,需要认真严谨的态度。也正是因为如此我才有了进步。理论联系实际,总会有更深刻的收获,通过这样的实际思考,动手修改操作,对理论有了深层次的理解,更加证实了理论,打消了心中不切实际的一些想法。慢慢的会形成自己的一个实际
20、经验,为日后的工作学习打下心里和知识上的基础。小学期的课程真是紧张而又充实,确实是收获很多,心中也增加了几分自信,对未来的工作有更大的信息。程序源代码(工程)#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<signal.h>#define MAXTIMES 5#define MSGKEY 56int p,p1,p2,pi
21、d1,pid2,pid3,pid4;int msgqid,*pint1,*pint2,*pint3,*pint4;struct crform int sem; int head; int tail; int duilie10;cr;int sem=1;int head=0;int tail=0;struct msgform long msgtype; int mtext;msg;void into() msgqid=msgget(MSGKEY,0777|IPC_CREAT); sem-; msgrcv(msgqid,&msg,4,1,0); msg.msgtype=msg.mtext;
22、 if(sem>=0) if(msg.mtext=3) printf(" p1 IN areann"); else printf(" p2 IN areann"); msg.mtext=1; msgsnd(msgqid,&msg,sizeof(int),0); else if(msg.mtext=3) printf(" p1 IN waitingnn"); else printf(" p2 IN waitingnn"); cr.duilietail=msg.mtext; tail+; msg.mtex
23、t=-1; msgsnd(msgqid,&msg,sizeof(int),0); void out() msgqid=msgget(MSGKEY,0777|IPC_CREAT); msgrcv(msgqid,&msg,4,2,0); sem+; if(tail!=head) if(msg.mtext=3) printf(" p1 OUT areann"); else printf(" p2 OUT areann"); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,si
24、zeof(int),0); pid2=cr.duilietail; tail+; msg.mtext=1; msg.msgtype=pid2; if(pid2=3) printf(" p1 IN areann"); else printf(" p2 IN areann"); msgsnd(msgqid,&msg,sizeof(int),0); msg.mtext=1; else if(msg.mtext=3) printf(" p1 OUT areann"); else printf(" p2 OUT areann&
25、quot;); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,sizeof(int),0); int main() int sem=1; int head=0; int tail=0; int msgqid1; msgqid1=msgget(MSGKEY,0777); msgctl(msgqid1,IPC_RMID,NULL); int m1,m2; int q,t; int pid; q=MAXTIMES; t=MAXTIMES; int count1,count2; struct msgform msg; int msgqid; pid=getpid(); signal(10,into); signal(12,out); msgqid=msgget(MSGKEY,0777|IPC_CREAT); while(p1=fork()=-1); if(p1=0) count1=10; while(count1>0) q=MAXTIMES; m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年自考专业(汉语言文学)练习题含答案详解(典型题)
- 红外光谱仪培训
- 2026届山东省邹平双语学校化学九上期末联考试题含解析
- 柳中庸《听筝》古诗鉴赏试题及答案
- 威海市重点中学2026届九年级英语第一学期期末调研模拟试题含解析
- 酒店地震应急培训
- 2026届陕西省宝鸡市岐山县化学九上期中考试模拟试题含解析
- 副班个人工作总结
- 护士核心能力培训
- 2026届福建省厦门市海沧区鳌冠学校英语九年级第一学期期末考试模拟试题含解析
- 2025年第一届安康杯安全生产知识竞赛试题题库及答案(完整版)
- 电力工程冬季施工安全技术措施
- 贵州省贵阳市2026届高三上学期摸底考试数学试卷含答案
- 公司年度员工安全教育培训计划
- 潍坊市2026届高三开学调研监测考试化学试题及答案
- 供电所安全教育培训课件
- 2025年杭州市上城区望江街道办事处 编外人员招聘8人考试参考试题及答案解析
- 百果园水果知识培训资料课件
- 商业地产策划流程
- 2025年灌注桩考试题及答案
- 公司安全生产责任书范本
评论
0/150
提交评论