操作系统实践报告_第1页
操作系统实践报告_第2页
操作系统实践报告_第3页
操作系统实践报告_第4页
操作系统实践报告_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统实践报告准考证号:考生姓名:一实验目的操作系统是一门实践性很强的计算机专业课程,它要求我们掌握操作系统的工作原理和基本理论知识。它注重方法、技术的实际应用。在上机实践考核中,为培养考生良好的学习与工作作风。要求考生按一定的规范进行上机前的考核准备。熟悉软硬件环境。上机调试和正确运行程序,以及提交实践考核报告。上机实践考核在机器环境上调试、运行程序和产生正确的结果。但准备阶段和整理实践报告也十分重要,只有做好充分的准备,熟悉机器及环境,尽可能的正确编码,才能高效率地利用机时。在书写报告时,必须依照规定的格式整理好文档资料,为考生将来从事于软件开发和研制工作,打下一个坚实的基础。二实验环境

2、1.硬件环境:CPU:P42.4GHz内存:256M硬盘:40G(局域网)2软件环境:操作系统:WindowsXP开发工具:MicrosoftVisualC+6.0三.实验内容3.1实验六1. 内容描述在Windows环境下创建子进程,在父子进程之间实验进程通信2. 实验过程2.1 实验原理:系统内部进程间通讯和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。其中利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中。Windows是一种面向对象

3、的体系结构,Windows环境和应用程序都是通过消息来交互的。Windows应用程序开始执行后,Windows为该程序创建一个“消息队列(messagequeue)",用以存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构(MSG)为typedefstructtagMSGHWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;MSG;其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数

4、。前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。把消息传送到应用程序有两种方法:一种是由系统将消息"邮寄(post)"到应用程序的"消息队列"这是"进队消息"Win32API有对应的函数PostMessage(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息”发送(send)”给应用程序的窗口函数,属于"不进队消息"对应的函数是SendMessage()其必须等待该消息处理完后方可返回。2.2 父进程的实现1 )新建一工程文件:Fat

5、herProcess,选取MFCAppWizard(exe)。2 )第二步选取Singledocument(单文档)。3 )其余几步均为确省值。4 )添加三个菜单“进程通信”,子菜单“向“子进程”发送命令“和与其对应的函数:/FatherProcessView.cpp文件中,向子进程发送命令voidCFatherProcessView:OnMenuCommand1()/TODO:AddyourcommandhandlercodehereCStringstr="Son(子进程)"CWnd*pWnd=CWnd:FindWindow(NULL,str);if(pWnd)pWnd-

6、>SendMessage(WM_COMM,0,0);在FatherProcessView.h添加自定义消息:#defineWM_COMMWM_USER+100。5 )在MainFrame.cpp文件中,添加收到子进程命令的消息函数:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_MESSAGE(WM_MSG_TOFATHER,OnToFatherMsg)END_MESSAGE_MAP()voidCMainFrame:OnToFatherMsg(WPARAMwParam,LPARAMlParam)if(wParam=0&&lParam=0

7、)AfxMessageBox("收到,Son,“命令”");在MainFrame.h文件中修改如下:a) 添加自定义消息:#defineWM_MSG_TOFATHERWM_USER+101b) 添加头文件定义voidOnToFatherMsg(WPARAMwParam,LPARAMlParam)6 )在BOOLCFatherProcessApp:InitInstance()函数末尾添加:m_pMainWnd->SetWindowText("Father(父进程)");/非常重要,否则消息将收不到7 )编译调试并运行程序。8 .3子进程的实现1 )新

8、建一工程文件:SonProcess,选取MFCAppWizard(exe)。2 )第二步选取Singledocument(单文档)。3 )其余几步均为确省值。4 )添加三个菜单“进程通信”,子菜单“向“父进程”发送命令“和与其对应的函数:/SonProcessView.cpp文件中,/向父进程发送命令voidCSonProcessView:OnMenuitemCommand1()CStringstr="Father(父进程)"CWnd*pWnd=CWnd:FindWindow(NULL,str);if(pWnd)pWnd->SendMessage(WM_MSG_TOF

9、ATHER,0,0);在SonProcessView.h中添加自定义消息:#defineWM_MSG_TOFATHERWM_USER+1015 )在MainFrame.cpp文件中,添加收到子进程命令的消息函数:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_MESSAGE(WM_COMM,OnSendMsg)END_MESSAGE_MAP()voidCMainFrame:OnSendMsg(WPARAMwParam,LPARAMlParam)if(wParam=0&&lParam=0)AfxMessageBox("收到,Fathe

10、r,“命令”");在MainFrame.h文件中修改如下:a)添加自定义消息:#defineWM_MSG_TOFATHERWM_USER+101b)添加头文件定义voidOnSendMsg(WPARAMwParam,LPARAMIParam);6 )在BOOLCSonProcessApp二InitInstance()函数末尾添加:m_pMainWnd->SetWindowText("Son(子进程)");/非常重要,否则消息将收不到7)编译调试并运行程序。3.运行结果父进程向子进程发送消息结果如下图:3.2实验七1.内容描述编程模拟磁盘移臂调度算法2.实验过

11、程程序清单:/*#include"stdio.h"#include"stdlib.h"voidCopyL(intSour,intDist,intx);/复制到x个数voidSetDI(intDiscL);voidPrint(intPri,intx);voidDelInq(intSour,int并把y前面的数向前移动,实验七:模拟磁盘移臂调度程序/x,inty);/*数组Sour复制到数组Dist随机生成磁道数打印输出数组Pri数组Sour把x位置的数删除,y后的数保持不变(即会出现2个y)先来先服务算法(FCFS)最短寻道时间优先算法单向扫描算法(SCA

12、N)电梯调度扫描算法(CSCAN)寻道长度由低到高排序voidFCFS(intHan,intDiscL);/voidSSTF(intHan,intDiscL);/(SSTF)intSCAN(intHan,intDiscL,intx,inty);/voidCSCAN(intHan,intDiscL);/voidPaiXu();/intNAll=0;intBest52;/用作寻道长度由低到高排序时存放的数组intLimit=0;/输入寻找的范围磁道数iintJage;floatAver=0;intmain()inti;intDiscLine10;/声明准备要生成的随机磁道号的数组intHand;/

13、磁道数intCon=1;intn;while(Con=1)Jage=0;Hand=143;/初始的磁道数Limit=300;/输入寻找的范围if(Limit>65536)printf("超出范围!");elseprintf("*n");*n");printf("*printf("*n");printf("*1*n");printf(" *2.*n");printf(" *3.磁盘调度算法先来先服务算法(FCFS)最短寻道时间优先算法 (SSTF)单向扫描算法(

14、CSCAN)*n");printf("*4.(SCAN)先来先服务算法(FCFS)最短寻道时间优先算法单向扫描算法(CSCAN)(SCAN)*n");printf("*n");scanf("%d",&n);if(n=0)exit(0);printf("n");switch(n)case1:SetDI(DiscLine);FCFS(Hand,DiscLine);/break;case 2:SetDI(DiscLine);SSTF(Hand,DiscLine);/(SSTF)break;case 3:

15、SetDI(DiscLine);CSCAN(Hand,DiscLine);/break;case 4:SetDI(DiscLine);SCAN(Hand,DiscLine,0,9);/break;case 5:break;printf("nn+是否继续(按0结束,按1继续)?");scanf("%5d",&Con);/数组Sour复制到数组Dist,复制到x个数voidCopyL(intSour,intDist,intx)inti;for(i=0;i<=x;i+)Disti=Souri;/打印输出数组PrivoidPrint(intPri,

16、intx)inti;for(i=0;i<=x;i+)printf("%5d",Prii);/随机生成磁道数voidSetDI(intDiscL)inti;intnQueueQUEUELEN=143,86,145,93,179,95,150,103,176,132;for(i=0;i<QUEUELEN;i+)DiscLi=nQueuei;/随机生成10个磁道号printf("+需要寻找的磁道号:");Print(DiscL,9);/输出随机生成的磁道号printf("n");/数组Sour把x位置的数删除,并把y前面的数向前

17、移动,y后的数保持不变(即会出现2个y)voidDelInq(intSour,intx,inty)inti;for(i=x;i<y;i+)Souri=Souri+1;x+;/先来先服务算法(FCFS)voidFCFS(intHan,intDiscL)intRLine10;/将随机生成的磁道数数组Discl复制给数组RLineint i,k,All,Temp; /Temp是计算移动的磁道距离的临时变量All=0;/统计全部的磁道数变量k=9;/限定10个的磁道数CopyL(DiscL,RLine,9);/复制磁道号到临时数组RLineprintf("n+按照FCF就法磁道的访问顺

18、序为:");All=Han-RLine0;for(i=0;i<=9;i+)Temp=RLine0-RLine1;/求出移动磁道数,前一个磁道数减去后一个磁道数得出临时的移动距离if(Temp<0)Temp=(-Temp);/移动磁道数为负数时,算出相反数作为移动磁道数printf("%5d",RLine0);All=Temp+All;/求全部磁道数的总和DelInq(RLine,0,k);/每个磁道数向前移动一位k-;BestJage1=All;/Best1存放移动磁道数BestJage0=1;/Best0存放算法的序号为:1Jage+;/排序的序号加

19、1Aver=(float)All)/10;/求平均寻道次数printf("n+臂移动总量:<%5d>",All);/最短寻道时间优先算法(SSTF)voidSSTF(intHan,intDiscL)inti,j,k,h,All;intTemp;/Temp是计算移动的磁道距离的临时变量intRLine10;/将随机生成的磁道数数组Discl复制给数组RLineintMin;All=0;/统计全部的磁道数变量k=9;/限定10个的磁道数CopyL(DiscL,RLine,9);/复制磁道号到临时数组RLineprintf("n+按照SSTF算法磁道的访问顺

20、序为:");for(i=0;i<=9;i+)Min=64000;for(j=0;j<=k;j+)/内循环寻找与当前磁道号最短寻道的时间的磁道号if(RLinej>Han)/如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLinej-Han;/求出临时的移动距离elseTemp=Han-RLinej;/求出临时的移动距离if(Temp<Min)/如果每求出一次的移动距离小于Min,执行下一句Min=Temp;/Temp临时值赋予Minh=j;/把最近当前磁道号的数组下标赋予hAll=All+Min;/统计一共移动的距离printf("

21、%5d",RLineh);Han=RLineh;DelInq(RLine,h,k);/每个磁道数向前移动一位k-;BestJage1=All;/Best1存放移动磁道数BestJage0=2;/Best0存放算法的序号为:2Jage+;/排序序号加1Aver=(float)All)/10;/求平均寻道次数printf("n+臂移动总量:<%5d>",All);/扫描算法(SCAN)intSCAN(intHan,intDiscL,intx,inty)intj,n,k,h,m,All;intt=0;intTemp;intMin;intRLine10;/将随

22、机生成的磁道数数组Discl复制给数组RLineintOrder;Order=1;k=y;m=2;/控制while语句的执行,即是一定要使当前磁道向内向外都要扫描到All=0;/统计全部的磁道数变量CopyL(DiscL,RLine,9);/复制磁道号到临时数组RLineprintf("n+按照电梯调度算法磁道的访问顺序为:");Min=64000;寻找与当前磁道号最短寻道的时间的磁道for(j=x;j<=y;j+)/if(RLinej>Han)/如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLinej-Han;/求出临时的移动距离elseT

23、emp=Han-RLinej;/求出临时的移动距离if(Temp<Min)Min=Temp;/Temp临时值赋予Minh=j;/把最近当前磁道号的数组下标赋予hAll=All+Min;printf("%5d",RLineh);if(RLineh>=Han)/由外向里Order=0;t=1;Han=RLineh;DelInq(RLine,h,k);/k-;while(m>0)if(Order=1)/order1的话,磁道向内移动判断磁道的移动方向,即是由里向外还是每个磁道数向前移动一位是判断磁盘扫描的方向标签,order是for(j=x;j<=y;j+

24、)h=-1;Min=64000;for(n=x;n<=k;n+)/判断离当前磁道最近的磁道号if(RLinen<=Han)Temp=Han-RLinen;if(Temp<Min)Min=Temp;/Temp临时值赋予Minh=n;/把最近当前磁道号的数组下标赋予hif(h!=-1)All=All+Min;/叠加移动距离printf("%5d",RLineh);Han=RLineh;/最近的磁道号作为当前磁道DelInq(RLine,h,k);k-;Order=0;/当完成向内的移动,order赋予0,执行else语句,使磁道向外移动m-;向内完成一次,m减

25、一次,保证while循环执行两次else/order是0的话,磁道向外移动for(j=x;j<=y;j+)h=-1;Min=64000;for(n=x;n<=k;n+)/判断离当前磁道最近的磁道号if(RLinen>=Han)Temp=RLinen-Han;if(Temp<Min)Min=Temp;/Temp临时值赋予Minh=n;/把最近当前磁道号的数组下标赋予hif(h!=-1)All=All+Min;/叠加移动距离printf("%5d",RLineh);Han=RLineh;/最近的磁道号作为当前磁道DelInq(RLine,h,k);k-;

26、Order=1;/当完成向内的移动,order赋予0,执行else语句,使磁道向外移动m-;向内完成一次,m减一次,保证while循环执行两次NAll=NAll+All;if(y-x)>5)BestJage1=All;/Best1存放移动磁道数BestJage0=3;/Best0存放算法的序号为:3Jage+;/排序序号加1Aver=(float)All)/10;/求平均寻道次数printf("n+臂移动总量:<%5d>",All);return(Han);/单向扫描算法(CSCAN)voidCSCAN(intHan,intDiscL)intj,h,n,T

27、emp,m,k,All,Last,i;intRLine10;/将随机生成的磁道数数组Discl复制给数组RLineintMin;inttmp=0;m=2;k=9;All=0;/统计全部的磁道数变量Last=Han;CopyL(DiscL,RLine,9);/复制磁道号到临时数组RLineprintf("n+按照单向扫描算法磁道的访问顺序为:");while(k>=0)for(j=0;j<=9;j+)/从当前磁道号开始,由内向外搜索离当前磁道最近的磁道号h=-1;Min=64000;for(n=0;n<=k;n+)if(RLinen>=Han)Temp

28、=RLinen-Han;if(Temp<Min)Min=Temp;h=n;if(h!=-1)All=All+Min;/统计一共移动的距离printf("%5d",RLineh);Han=RLineh;Last=RLineh;DelInq(RLine,h,k);k-;if(k>=0)tmp=RLine0;for(i=0;i<k;i+)/算出剩下磁道号的最小值if(tmp>RLinei)tmp=RLinei;Han=tmp;/把最小的磁道号赋给HanTemp=Last-tmp;/求出最大磁道号和最小磁道号的距离差All=All+Temp;BestJage1=All;/Best1存放移动磁道数BestJage0=4;/Best0存放算法的序号为:4Jage+;/排序序号加1Aver=(float)All)/10;/求平均寻道次数printf("n+臂移动总量:<%5d>",All);voidPaiXu()inti,j,Temp;for(i=0;i<5;i+)for(j=0;j<4;j+)if(Bestj1>Bestj+11)/如果前一个算法的移动磁道距离大于后一个移动磁道数,执行下面语句Temp=Bestj+11;/从这起下三行执行冒泡法将移动距离大小排序,排完后则执行每个算法的排序Be

温馨提示

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

评论

0/150

提交评论