




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告书2009 / 2010 学年 第 1 学期课程名称: 操作系统实践课程设计 专业班级:_ _学 号:_姓 名:_指导教师:_题目1 进程的软中断通信11 题目的主要研究内容及预期达到的目标(1)编制一个程序,使其实现进程的软中断通信。父进程发信号控制子程序的终止。12 题目研究的工作基础或实验条件(1)硬件环境:ubuntu 9.04兼容机(2)软件环境:标准C语言。13 设计思想使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Proeess 1 is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent Process is Killed!14 流程图 图1.1流程图15 主要程序代码#include ;#include ;#include ;#include ;void killson();/主进程中SIGINT信号的处理函数void thread1();/子进程1中SIGHUP信号的处理函数void thread2();/子进程2中SIGHUP信号的处理函数int pid1=0,pid2=0;/子进程的ID的号main() signal(SIGINT,SIG_IGN); pid1=fork(); if (pid1=0) /child process one if(signal(SIGHUP,thread1)=SIG_ERR) printf(set hook for child 1 failed.n); else /parent process pid2=fork(); if(pid2=0) /child process two if(signal(SIGHUP,thread2)=SIG_ERR) printf(set hook for child 2 failed.n); else /parent process if(signal(SIGINT,killson)=SIG_ERR) printf(set hook for parent failed.n);printf(pid1:%d pid2:%d,i am %dn,pid1,pid2,getpid(); pause();void killson() printf(killson() pid1:%d,pid2:%dn,pid1,pid2); if(kill(pid1,SIGHUP) printf(error in kill child one! pid1:%dn,pid1); exit(1); sleep(2); if(kill(pid2,SIGHUP) printf(error in kill child two!n); exit(1); sleep(2); printf(Parent Process is Killed!n); exit(0);void thread1() /signal(SIGHUP,thread1); printf(child process 1 is killed by parent!n); exit(0);void thread2() /signal(SIGHUP,thread2); printf(child process 2 is killed by parent!n); exit(0);16 运行结果及分析图1.2运行结果17 心得体会通过本次实验,对fork()创建子进程以及用signal()配置信号处理有了更深的了解。题目2 进程的管道通信21 题目的主要研究内容及预期达到的目标(1)编制一个程序,使其实现子进程通过管道与父进程进行通信22 题目研究的工作基础或实验条件(1)硬件环境:ubuntu兼容机(2)软件环境:标准C语言。23 设计思想使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道各写一句话: The first message ! The second message ! 父进程从管道中读出来自于两个子进程的信息,显示在屏幕上。 要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。24 流程图图2.1流程图25 主要程序代码#include#include#include#include ;main() int id1,id2,fd2; char outpp130; char outpp230; char inpp1size=the first message!; char inpp2size=the second message!; pipe(fd); id1=fork(); if (id1=0) write(fd1,inpp1,30); exit(0); elseread(fd0,outpp1,30); id2=fork(); if (id2=0) write(fd1,inpp2,30); exit(0); else read(fd0,outpp2,30); printf(%sn,outpp1) printf(%sn,outpp2); exit(0); 26 运行结果及分析图2.2运行结果27 心得体会经过查阅Linux课本的进程管道具体的函数说明 初步了解pipe()子进程通过管道像父进程传递消息 最后参照课后实例 编写代码题目3 利用多线程模拟实现生产者/消费者问题31 题目的主要研究内容及预期达到的目标(宋体四号加粗左对齐)(1)掌握线程的创建和终止,加深对线程和进程概念的理解。(2)会用同步与互斥量方法实现线程之间的通信。(3)模拟出生产者/消费者问题的模型,及实现方法。32 题目研究的工作基础或实验条件(1)硬件环境:Windows XP兼容机(2)软件环境:标准C+语言。33 设计思想实验调用WinAPI函数,创建多线程的同步方法,把列表框封装在新的结构体类作为入口函数传递参数的指针,用以指定不同的列表框显示对应不同的内容.34 流程图图3.1流程图35 主要程序代码实验中使用WinAPI函数创建了一个互斥量h_Mutex,两个信号量bufferFullSemaphore用以录满的信号, bufferEmptySemaphore用以记录空的信号.其中用到的函数方法:h_Mutex = CreateMutex(NULL,false,NULL); bufferFullSemaphore = CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE,NULL); bufferEmptySemaphore = CreateSemaphore(NULL,0,BUFFER_SIZE,NULL);同时定义了:3个生产者入口函数为: DWORD WINAPI Producter1(LPVOID pthread)DWORD WINAPI Producter2(LPVOID pthread)DWORD WINAPI Producter3(LPVOID pthread)2个消费者入口函数:DWORD WINAPI Consumer1(LPVOID pthread)DWORD WINAPI Consumer2(LPVOID pthread)在每个入口函数中,使用函数:DWORD WINAPI WaitForSingleObject( _in HANDLE hHandle, _in DWORD dwMilliseconds); BOOL WINAPI ReleaseSemaphore( _in HANDLE hSemaphore, _in LONG lReleaseCount, _out LPLONG lpPreviousCount);BOOL WINAPI ReleaseMutex( _in HANDLE hMutex);对互斥量以及相应的信号量进行管理,使线程能够同步运行.然后在主函数中使用函数:HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,DWORD dwCreationFlags,Lpdword lpThread );分别为每个生产者和消费者创建线程.最后,使用函数BOOL WINAPI TerminateThread( _in_out HANDLE hThread, _in DWORD dwExitCode);结束所有线程.DWORD WINAPI Producter1(LPVOID pthread) /生产者入口函数int t;CTime c_Time;CString s_Time;lpthread temp=(lpthread)pthread; /参数指针转换CString str= P1:;while(control)t=1000*(rand()%9+1); /随机时间(110秒)c_Time=CTime:GetCurrentTime(); /获取当前系统时间 s_Time=c_Time.Format(%H:%M:%S ); /格式化时间WaitForSingleObject(bufferFullSemaphore,INFINITE); /等待信号量 WaitForSingleObject(h_Mutex,INFINITE); /等待互斥量bufferin=Z-rand()%26; /随机生成26个大写字母temp-pList-AddString(s_Time+str+bufferin); /在指定列表框添加内容m_Buffer.AddString(bufferin); /在缓冲区列表框添加内容in=(in+1)%BUFFER_SIZE; /循环队列指针加1Sleep(t); /函数阻塞时间ReleaseMutex(h_Mutex); /释放互斥量ReleaseSemaphore(bufferEmptySemaphore,1,NULL); /释放信号量 return true;DWORD WINAPI Consumer1(LPVOID pthread) /消费者入口函数int t,flag=0;CTime c_Time;CString s_Time;lpthread temp=(lpthread)pthread;/参数指针转换CString str= C1:;while(control)t=1000*(rand()%4+1); /随机时间(15秒) c_Time=CTime:GetCurrentTime(); /获取当前系统时间 s_Time=c_Time.Format(%H:%M:%S ); /格式化时间WaitForSingleObject(bufferEmptySemaphore,INFINITE); /等待信号量WaitForSingleObject(h_Mutex,INFINITE); /等待互斥量temp-pList-AddString(s_Time+str+bufferout); /相应列表框添加内容/缓冲区列表框寻找相应内容删去if(flag=m_Buffer.FindString(0,(LPCTSTR)bufferout)!=CB_ERR) m_Buffer.DeleteString(flag);bufferout=0; /缓冲区内空置空out=(out+1)%BUFFER_SIZE; /循环队列加1 Sleep(t); /函数阻塞时间ReleaseMutex(h_Mutex); /释放互斥量 ReleaseSemaphore(bufferFullSemaphore,1,NULL); /释放信号量return true;36 运行结果及分析图3.2运行结果37 心得体会通过此课题学习创建多线程 并且让不同的线程互斥的访问共同的资源 当有程序使用资源时候 另外的程序将等待 它的退出 在进入临界区之前的判断缓冲区时和有效限制线程运行速度以便正确的看到理想的生产者消费者关系遇到麻烦 最后通过依据时间来生成的随机时间来模拟题目4 银行家算法的实现41 题目的主要研究内容及预期达到的目标(1)熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。(2)通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。42 题目研究的工作基础或实验条件(1)硬件环境:Windows XP兼容机(2)软件环境:VC+43 设计思想创建MFC工程,在基于对话框的界面上设计布局 建立process类 并实现基本赋值 进程通过requset()申请资源系统为其查找当前的一个安全序列 并且提供在一个状态下的所有执行顺序的可行性44 流程图图4.1流程图45 主要程序代码/*M个进程对N类资源最大资源需求量*/ int MAXMN=7,5,3,3,2,2,9,0,2,2,2,2,4,3,3; /*系统可用资源数*/ int AVAILABLEN=10,5,7; /*M个进程对N类资源最大资源需求量*/ int ALLOCATIONMN=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; /*M个进程已经得到N类资源的资源量 */ int NEEDMN=7,5,3,3,2,2,9,0,2,2,2,2,4,3,3; /*M个进程还需要N类资源的资源量*/ int RequestN=0,0,0; void main() int i=0,j=0; char flag=Y; void showdata(); void changdata(int); void rstordata(int); int chkerr(int); showdata(); while(flag=Y|flag=y) i=-1; while(i=M) printf(请输入需申请资源的进程号(从0到); printf(%d,M-1); printf(,否则重输入!):); scanf(%d,&i); if(i=M)printf(输入的进程号不存在,重新输入!n); printf(请输入进程); printf(%d,i); printf(申请的资源数n); for (j=0;jNEEDij) printf(进程); printf(%d,i); printf(申请的资源数大于进程); printf(%d,i); printf(还需要); printf(%d,j); printf(类资源的资源量!申请不合理,出错!请重新选择!n); flag=N; break; else if(RequestjAVAILABLEj) printf(进程); printf(%d,i); printf(申请的资源数大于系统可用); printf(%d,j); printf(类资源的资源量!申请不合理,出错!请重新选择!n); flag=N; break; if(flag=Y|flag=y) changdata(i); if(chkerr(i) rstordata(i); showdata(); else showdata(); else showdata(); printf(n); void showdata() int i,j; printf(系统可用的资源数为:n); printf( ); for (j=0;jN;j+) printf( 资源); printf(%d,j); printf(:); printf(%d,AVAILABLEj); printf(n); printf(各进程还需要的资源量:n); for (i=0;iM;i+) printf( 进程); printf(%d,i); printf(:); for (j=0;jN;j+) printf(资源); printf(%d,j); printf(:); printf(%d,NEEDij); printf(n); printf(各进程已经得到的资源量: n); for (i=0;iM;i+) printf( 进程); printf(%d,i); for (j=0;jN;j+) printf(资源); printf(%d,j); printf(:); printf(%d,ALLOCATIONij); printf(n); void changdata(int k) int j; for (j=0;jN;j+) AVAILABLEj=AVAILABLEj-Requestj; ALLOCATIONkj=ALLOCATIONkj+Requestj; NEEDkj=NEEDkj-Requestj; ; void rstordata(int k) int j; for (j=0;jN;j+) AVAILABLEj=AVAILABLEj+Requestj; ALLOCATIONkj=ALLOCATIONkj-Requestj; NEEDkj=NEEDkj+Requestj; ; int chkerr(int s) int WORK,FINIS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025租房合同范本:房屋租赁协议书
- 2025合同模板通风空调工程施工合同
- 校园安全防止欺凌班会
- 生产数据管理软件系统架构与应用实践
- 肺泡灌洗术护理操作规范
- 医学检验检测技术概述
- 人教版小学语文一年级期末测试题
- 2025年初级汽车修理工试题
- 护理札记内容讲解
- 动脉支架术后创口护理规范
- 财务管理实务(浙江广厦建设职业技术大学)知到智慧树章节答案
- 2022-2023学年广东省东莞市高一(下)期末地理试卷
- 酒店食品安全知识培训
- 生活水泵房管理制度
- 市人民法院公开招考审判辅助人员考试题及答案
- 幼儿园 中班语言绘本《章鱼先生卖雨伞》
- 提高混淆效果研究
- 烹饪专业考评员培训
- 围手术期患者低温防治专家共识(2023版)解读课件
- 常州大学《高分子材料的稳定与降解》2022-2023学年第一学期期末试卷
- 装饰装修施工人员安全知识培训考试试卷及答案
评论
0/150
提交评论