版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上课 程 设 计课程设计名称: 操作系统原理 专 业 班 级 : 软件1301 学 生 姓 名 : 理金龙 学 号 : 6 指 导 教 师 : 刘於勋 课程设计时间: 2015年7月6-11日 软件工程 专业课程设计任务书学生姓名理金龙专业班级软件1301学号6题 目编程模拟多进程共享临界资源课题性质其它课题来源自拟课题指导教师刘於勋同组姓名主要内容要求产生3 个进程:1、 两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区”,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x 正在临界区
2、”;当时间结束,显示:“进程x 退出临界区”,同时向管理进程提出退出申请;当申请返回,显示:“进程x 已退出临界区。”2、一个进程作为原语的管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;3、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。4、进程间通信可以采用信号、消息传递、管道或网络通信方式。任务要求理解多进程共享临界资源的原理,并编程实现参考文献任满杰等操作系统原理实用教程 电子工业出版社 2006汤子瀛 计算机操作系统(修订版)西安电子科技大学出版社 2001张尧学 史美林计算机操作系统教程
3、实验指导 清华大学出版社 2000 罗宇等 操作系统课程设计机械工业出版社 2005审查意见指导教师签字:教研室主任签字: 2015 年 7 月 6 日 说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页信息科学与工程 学院课程设计成绩评价表课程名称:操作系统原理设计题目:编程模拟多进程共享临界资源专业: 软件工程 班级:软件1301 姓名:理金龙 学号:6序号评审项目分 数满分标准说明1内 容思路清晰,语言表达准确,概念清楚,论点正确;设计方法科学,分析归纳合理;结论严谨,设计有应用价值。任务饱满,工作量适中2创 新内容新颖,设计能反映新技术,对前人工作有改进
4、或突破,或有独特见解3完整性、实用性整体构思后合理,理论依据充分,设计完整,实用性强4数据准确、可靠数据准确,算法设计合理5规 范 性设计格式、绘图、实验数据、标准的运用等符合有关标准和规定6纪 律 性遵守课程设计纪律,听从指导教师安排,设计过程态度认真7答 辩准备充分,思路清晰、论点正确、对设计方案理解深入,问题回答有理有据,简明正确总 分综合意见 指导教师 2015 年 7 月 12 日专心-专注-专业1 需求分析1、要求产生至少3个进程:2、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区”,同时向管理进程提出申请;在临界区中等待一段随机时间,并显示
5、:“进程x正在临界区”;当时间结束,显示:“进程x退出临界区”,同时向管理进程提出退出申请。3、一个进程作为原语级管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;4、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。5、进程间通信可以采用信号、消息传递、管道或网络通信方式。2 概要设计2.1 其中包含两个重要的数据结构:2.11 临界区:Struct crform Int sem; /临界区的信号量值sem Int head; /临界区等待队列的头,指向的是最先到的进程 Int tail; /临界区等
6、待队列的尾,指向的是进入等待队列的进程 Int duilie20; /存放的是等待的进程的信息,以便唤醒待cr;Cr.sem=1; /初始临界区信号量必须为一,因为只允许一个进程进入临界区Cr.head=0; /初始时指向等待队列的第一个单元Cr.tail=0;2.12 消息队列:Struct msgform Long msgtype; /消息的类型,在取消息队列时用于区分哪些是该取的信息 Int mtext; /信息的内容,在这里是申请|退出进程的信息;2.2 进程创建和控制:fork()系统调用: 关键的语句:int x,y;while(x=fork()=-1);/创建子进程1if(x=0
7、) /子进程1执行程序段else while(y=fork()=-1); if(y=0) /子进程2执行程序段 else /父进程执行程序段2.3设计流程图:图1 用户进程流程图图 管理进程图3 申请进入临界区处理子进程图4 申请退出处理子程序3 运行环境3.1 linux操作系统3.2 Gcc编译器4 开发工具和编程语言4.1 开发工具:Gcc编译器4.2 编程语言:C语言5 详细设计子函数一:void into()/申请进入临界区 struct msgform msg;key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666
8、|IPC_CREAT); cr.sem-;/一旦申请进入临界区就得减1 msgrcv(msgqid,&msg,4,1,0);/接收消息-申请进入进程发送的类型为1 msg.msgtype=(long)msg.mtext;/并把接收到的消息内容作为回馈消息的消息类型 if(cr.sem>=0)/判断此时进程的状态,sem>=0 可以获得临界区 if(msg.mtext=3) printf("进程1: 进入临界区n"); else printf("进程2: 进入临界区n"); msg.mtext=1;/现在允许进入,发送内容为1的消息给申
9、请进程 msgsnd(msgqid,&msg,sizeof(int),0); Else/到等待队列 if(msg.mtext=3) printf("进程1: 进入等待队列n"); else printf("进程2: 进入等待队列n"); cr.duiliecr.tail=msg.mtext; cr.tail+; if(cr.tail=20) cr.tail=0; msg.mtext=-1; msgsnd(msgqid,&msg,sizeof(int),0);/若临界区忙,发送进入等待队列的消息给申请进入的进程 子函数二:void out(
10、)/申请退出临界区 struct msgform msg; key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); msgrcv(msgqid,&msg,4,2,0);/从消息队列上取下申请退出的消息 cr.sem+; if(cr.tail!=cr.head)/查看等待队列中是否有等待进入临界区的队列 /有则唤醒等待队列中等待的进程,并允许申请退出的进程退出 if(msg.mtext=3) printf("进程1: 退出临界区n"); else printf("进程
11、2: 退出临界区n"); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,sizeof(int),0); int pid2=cr.duiliecr.head; cr.head+; if(cr.head=20) cr.head=0; msg.mtext=1; msg.msgtype=pid2; if(pid2=3) printf("进程1: 进入临界区n"); else printf("进程2: 进入临界区n"); msgsnd(msgqid,&msg,sizeof(i
12、nt),0); else /如果等待队列上没有等待进入临界区的进程,直接向申请退出的进程发送消息,允许退出 if(msg.mtext=3) printf("进程1: 退出临界区n"); else printf("进程2: 退出临界区n"); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,sizeof(int),0); 6 调试分析在作这个课题过程中遇到了主要的这样几个问题:u 消息队列不能正常使用错误原因1: 消息队列没有建立成功解决办法: 在用消息队列之初先删除这个队列,然后再建立
13、使用错误原因2: 取到的结果总出现错误,没有统一的消息类型解决办法: 定制统一的消息类型规则,依照规则使用消息类型错误原因3: 进程需要的消息已经被取走,使得进程停留在取消息这一步不向下执行解决办法: 是程序逻辑上的问题,仔细查看程序流程并操控好使得可以处于正常逻辑u 申请到临界区退出临界区显示滞后(如有时会显示“进程一 获得临界区”然后“进程二 退出临界区”)错误原因: 在管理进程中已经将临界区状态修改为空闲,却没有显示哪个进程退出临界区,这个退出的信息必须等到子进程上cpu时才会显示出来,而这中间有别的进程上cpu执行申请的操作,就会获得临界区,就会显示“进程获得临界区”,在此后退出临界区
14、的进程才上cpu显示“退出临界区”。解决办法: 将显示放到管理进程中,一旦有进程获得临界区或者退出临界区就做出显示。7 测试结果测试数据:1,0; 1,2测试截图:图5 开始界面图6 主程序运行界面图7 输入1,暂停运行图8 输入0,程序继续运行图9 输入2,程序退出运行参考文献1 任满杰等操作系统原理实用教程 电子工业出版社 20062 汤子瀛 计算机操作系统(修订版)西安电子科技大学出版社 20013 张尧学 史美林计算机操作系统教程实验指导 清华大学出版社 2000 4 罗宇等 操作系统课程设计机械工业出版社 20055 赛奎春、张雨 编著,Visual C+ 工程应用与项目实践,海洋出
15、版社,2005.1心得体会这次操作系统课设给了我很大的启发和提高。一直以来自己我的编程基础不太好,常出现逻辑混乱,不注重细节问题,在这门课中我有了更深的理解;科学是不允许错误的,需要认真严谨的态度。也正是因为如此我才有了进步。理论联系实际,总会有更深刻的收获,通过这样的实际思考,动手修改操作,对理论有了深层次的理解,更加证实了理论,打消了心中不切实际的一些想法。慢慢的会形成自己的一个实际经验,为日后的工作学习打下心里和知识上的基础。小学期的课程真是紧张而又充实,确实是收获很多,心中也增加了几分自信,对未来的工作有更大的信息。程序源代码(工程)第一部分:OSP.c#include <std
16、io.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#include "ran.h"#define MSGKEY struct crform int sem; int head; int tail; int duilie20; cr;struct msgform long msgtype; int mte
17、xt; ;void into();void out();int main(void) puts("*提示信息*n");puts("在程序运行过程中:n");puts("-输入 0 继续运行程序n");puts("-输入 1 暂停运行程序n");puts("-输入 2 退出程序n");puts("*n");int ppid=getpid();cr.sem = 1; cr.head=0; cr.tail=0;struct ShMeint num;int flags;int p1;
18、int p2;int shmid=shmget(IPC_PRIVATE,1024,0666|IPC_CREAT);if(shmid=-1)printf("共享内存区创建错误-n");exit(0); pid_t id = fork(); if (id<0) printf("新进程创建错误! 2秒后自动退出。n"); sleep(2); exit(0); else if (id=0) pid_t id2 = fork(); if(id2<0) printf("新进程创建错误! 2秒后自动退出。n"); sleep(2); e
19、xit(0); else if (id2=0) struct msgform msg; key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); struct ShMe * addr; addr=(struct ShMe*)shmat(shmid,0,0); if(addr=(struct ShMe*)-1) printf("映射内存错误1-n"); int flags=0; flags=addr->flags; (*addr).p1=getpid(); while(flags=
20、1|flags=0) if(flags=0) int q=10; msg.mtext=3; msg.msgtype=1; printf("进程1: 申请进入临界区n"); msgsnd(msgqid,&msg,sizeof(int),0); kill(ppid,10); while(q>0) msgrcv(msgqid,&msg,sizeof(int),3,0); int m=msg.mtext; if(m=1) printf("进程1: 进入共享内存区n"); int ny=addr->num; int dg=rannum(
21、); int uh=0; for(uh=0;uh<dg;uh+) ny+; ny=ny%(99999-10000+1)+10000; (*addr).num=ny; msg.msgtype=2; msg.mtext=3; printf("进程1: 申请退出临界区n"); msgsnd(msgqid,&msg,sizeof(int),0); kill(ppid,12); continue; else if(m=-1) q-; else if(m=0) int bb=rannum()%5; sleep(bb); flags=addr->flags; brea
22、k; else int bb=rannum()%5; sleep(bb); flags=addr->flags; else struct msgform msg; key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); struct ShMe * addr; addr=(struct ShMe*)shmat(shmid,0,0); if(addr=(struct ShMe*)-1) printf("映射内存错误1-n"); int flags=0; flags=addr->
23、;flags; (*addr).p2=getpid(); while(flags=1|flags=0) if(flags=0) int q=10; msg.mtext=4; msg.msgtype=1; printf("进程2: 申请进入临界区n"); msgsnd(msgqid,&msg,sizeof(int),0); kill(ppid,10); while(q>0) msgrcv(msgqid,&msg,sizeof(int),4,0); int m=msg.mtext; if(m=1) printf("进程2: 进入临界区n"
24、;); int ny=addr->num; int dg=rannum(); int uh=0; for(uh=0;uh<dg;uh+) ny+; ny=ny%(99999-10000+1)+10000; (*addr).num=ny; msg.msgtype=2; msg.mtext=4; printf("进程2: 申请退出临界区n"); msgsnd(msgqid,&msg,sizeof(int),0); kill(ppid,12); continue; else if(m=-1) q-; else if(m=0) int bb=rannum()%5
25、; sleep(bb); flags=addr->flags; break; else int bb=rannum()%5; sleep(bb); flags=addr->flags; else key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); struct ShMe * addr; addr=(struct ShMe*)shmat(shmid,0,0); if(addr=(struct ShMe*)-1) printf("映射内存错误3-n"); (*addr).
26、num=999; (*addr).flags=0; int flags=0; signal(10,into); signal(12,out); scanf("%d",&flags); while(flags=0 | flags=1) (*addr).flags=flags; scanf("%d",&flags); if(flags=2) (*addr).flags=flags; wait(addr->p1); wait(addr->p2); if(shmdt(addr)=-1) printf("共享内存与控制进程断开
27、错误.n"); if(shmctl(shmid,IPC_RMID,NULL)=-1) printf("shmctl delete errorn"); msgctl(msgqid,IPC_RMID, 0); printf("*程序退出n"); return EXIT_SUCCESS;void into() struct msgform msg;key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); cr.sem-; msgrcv(msgqid,&m
28、sg,4,1,0); msg.msgtype=(long)msg.mtext; if(cr.sem>=0) if(msg.mtext=3) printf("进程1: 进入临界区n"); else printf("进程2: 进入临界区n"); msg.mtext=1; msgsnd(msgqid,&msg,sizeof(int),0); else if(msg.mtext=3) printf("进程1: 进入等待队列n"); else printf("进程2: 进入等待队列n"); cr.duiliecr.tail=msg.mtext; cr.tail+; if(cr.tail=20) cr.tail=0; msg.mt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课题申报参考:精神生活共同富裕视域下红色文化旅游深度融合的响应机制与路径研究
- 课题申报参考:教育治理现代化背景下现代产业学院内部治理结构的优化研究
- 2025年c语言实习心得体会模版(4篇)
- 2025版房地产尾款支付及产权过户协议3篇
- 二零二五年车辆抵押维修保养合同3篇
- 二零二五版贸促会棉花期货交易专区棉花现货买卖合同3篇
- 二零二五年度企业法律风险防控培训合同3篇
- 主体架构工程分包合同(2024年度)一
- 专属分店管理承包协议模板版A版
- 二零二五年度多人合伙经营酒吧合作协议范本3篇
- 《健康体检知识》课件
- 生产计划主管述职报告
- 名表买卖合同协议书
- JTG-T-F20-2015公路路面基层施工技术细则
- 2024年辽宁石化职业技术学院单招职业适应性测试题库附答案
- 中西方校服文化差异研究
- 《子宫肉瘤》课件
- 《准妈妈衣食住行》课件
- 给男友的道歉信10000字(十二篇)
- 客人在酒店受伤免责承诺书范本
- 练字本方格模板
评论
0/150
提交评论