操作系统实践报告Word格式.docx
《操作系统实践报告Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实践报告Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
256M
硬盘:
40G(局域网)
2.软件环境:
操作系统:
WindowsXP
开发工具:
MicrosoftVisualC++6.0
三.实验内容
3.1实验六
1.内容描述
在Windows环境下创建子进程,在父子进程之间实验进程通信。
2.实验过程
2.1实验原理:
系统内部进程间通讯和数据交换有多种方式:
消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。
其中利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中。
Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。
Windows应用程序开始执行后,Windows为该程序创建一个"
消息队列(messagequeue)"
,用以存放邮寄给该程序可能创建的各种不同窗口的消息。
消息队列中消息的结构(MSG)为
typedefstructtagMSG{
HWNDhwnd;
UINTmessage;
WPARAMwParam;
LPARAMlParam;
DWORDtime;
POINTpt;
}MSG;
其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;
第二个参数便是消息标识号,如WM_PAINT;
第三个和第四个参数的具体意义同message值有关,均为消息参数。
前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。
把消息传送到应用程序有两种方法:
一种是由系统将消息"
邮寄(post)"
到应用程序的"
消息队列"
这是"
进队消息"
Win32API有对应的函数PostMessage(),此函数不等待该消息处理完就返回;
而另一种则是由系统在直接调用窗口函数时将消息"
发送(send)"
给应用程序的窗口函数,属于"
不进队消息"
对应的函数是SendMessage()其必须等待该消息处理完后方可返回。
2.2父进程的实现
1)新建一工程文件:
FatherProcess,选取MFCAppWizard(exe)。
2)第二步选取Singledocument(单文档)。
3)其余几步均为确省值。
4)添加三个菜单“进程通信”,子菜单“向“子进程”发送命令“和与其对应的函数:
//FatherProcessView.cpp文件中,向子进程发送命令
voidCFatherProcessView:
:
OnMenuCommand1()
{
//TODO:
Addyourcommandhandlercodehere
CStringstr="
Son(子进程)"
;
CWnd*pWnd=CWnd:
FindWindow(NULL,str);
if(pWnd)
pWnd->
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)
{
AfxMessageBox("
收到,Son,“命令”"
);
}
在MainFrame.h文件中修改如下:
a)添加自定义消息:
#defineWM_MSG_TOFATHERWM_USER+101
b)添加头文件定义
voidOnToFatherMsg(WPARAMwParam,LPARAMlParam)
6)在BOOLCFatherProcessApp:
InitInstance()函数末尾添加:
m_pMainWnd->
SetWindowText("
Father(父进程)"
//非常重要,否则消息将收不到
7)编译调试并运行程序。
2.3子进程的实现
SonProcess,选取MFCAppWizard(exe)。
4)添加三个菜单“进程通信”,子菜单“向“父进程”发送命令“和与其对应的函数:
//SonProcessView.cpp文件中,//向父进程发送命令
voidCSonProcessView:
OnMenuitemCommand1()
FindWindow(NULL,str);
SendMessage(WM_MSG_TOFATHER,0,0);
在SonProcessView.h中
ON_MESSAGE(WM_COMM,OnSendMsg)
OnSendMsg(WPARAMwParam,LPARAMlParam)
收到,Father,“命令”"
}
voidOnSendMsg(WPARAMwParam,LPARAMlParam);
6)在BOOLCSonProcessApp:
3.运行结果
父进程向子进程发送消息结果如下图:
3.2实验七
编程模拟磁盘移臂调度算法。
程序清单:
//*****************实验七:
模拟磁盘移臂调度程序*******************
#include"
stdio.h"
stdlib.h"
voidCopyL(intSour[],intDist[],intx);
//数组Sour复制到数组Dist,复制到x个数
voidSetDI(intDiscL[]);
//随机生成磁道数
voidPrint(intPri[],intx);
//打印输出数组Pri
voidDelInq(intSour[],intx,inty);
//数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)
voidFCFS(intHan,intDiscL[]);
//先来先服务算法(FCFS)
voidSSTF(intHan,intDiscL[]);
//最短寻道时间优先算法(SSTF)
intSCAN(intHan,intDiscL[],intx,inty);
//单向扫描算法(SCAN)
voidCSCAN(intHan,intDiscL[]);
//电梯调度扫描算法(CSCAN)
voidPaiXu();
//寻道长度由低到高排序
intNAll=0;
intBest[5][2];
//用作寻道长度由低到高排序时存放的数组
intLimit=0;
//输入寻找的范围磁道数i
intJage;
floatAver=0;
intmain()
inti;
intDiscLine[10];
//声明准备要生成的随机磁道号的数组
intHand;
//磁道数
intCon=1;
intn;
while(Con==1)
Jage=0;
Hand=143;
//初始的磁道数
Limit=300;
//输入寻找的范围
if(Limit>
65536)
{
printf("
超出范围!
"
}
else
*********************************************\n"
****************磁盘调度算法******************\n"
*1.先来先服务算法(FCFS)*\n"
*2.最短寻道时间优先算法(SSTF)*\n"
*3.单向扫描算法(CSCAN)*\n"
*4.电梯调度算法(SCAN)*\n"
scanf("
%d"
&
n);
if(n==0)
exit(0);
\n"
switch(n)
{
case1:
SetDI(DiscLine);
FCFS(Hand,DiscLine);
break;
case2:
SSTF(Hand,DiscLine);
case3:
CSCAN(Hand,DiscLine);
//单向扫描算法(CSCAN)
case4: