操作系统实验报告进程与进程通信Word文档下载推荐.docx
- 文档编号:812349
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:13
- 大小:199.40KB
操作系统实验报告进程与进程通信Word文档下载推荐.docx
《操作系统实验报告进程与进程通信Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告进程与进程通信Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。
•DWORDMsgSize;
//单个消息大小:
字节数
•intMsgMaxCount;
//消息的总数
•intMsgNum;
//消息的个数
•intReadIndex;
//可读消息索引
•intWriteIndex;
//可写消息索引
};
5.3、“实时”显示内容的处理与内存泄漏
这个显示消息的函数每隔50ms执行一次,所以实际上是是查询方式来实现实时显示
在此模式下可以发现一些被人遗忘的内存释放,我在实现这个函数时候发现进程占用内存和执行时间成正比,最后才发现内存泄漏的地方,尤其是读取共享内存的指针特别占内存
5.4、相关代码
5.4.1、声明类
1)enumoperation{SpaceEnum,SendEnum,ReceiveEnum,MutexEnum};
2)typedefstruct_MSGQ_HEADER
3){
4)DWORDMsgSize;
//单个消息大小:
5)intMsgMaxCount;
6)intMsgNum;
//消息的个数
7)intReadIndex;
//可读消息索引
8)intWriteIndex;
//可写消息索引
9)}MSGQ_HEADER,*PMSGQ_HEADER;
10)
11)classCMsgQ:
publicQDialog
12){
13)public:
14)CMsgQ(){}
15)
16)BOOLCreate(LPCTSTR**strname,intnowProcess,intmaxProcess,int*MsgMaxCount,DWORD*MsgSize);
17)
18)BOOLGetMsgQInfo(PDWORDmsgSize,PDWORDmsgCnt);
19)
20)BOOLSend(LPVOIDbuf,intwhichProcess,DWORDwaitTime=INFINITE);
21)BOOLReceive(LPVOIDbuf,DWORDwaitTime=INFINITE);
22)intRead(char**ReadMailBox);
23)
24)private:
25)PMSGQ_HEADERpMsgInfo;
26)HANDLEm_hMutex;
27)HANDLEm_SemaphoreSend;
//发送信号量
28)HANDLEm_SemaphoreReceive;
//接收信号量
29)HANDLEm_hFileMap;
//文件映像句柄
30)LPVOIDm_hViewBuf;
//文件映像映射到地址空间的首地址
31)
32)LPCTSTR**strName;
33)intnowProcess;
34)DWORD*msgSize;
35)int*msgCnt;
36)};
5.4.2、创建函数实现
1)BOOLCMsgQ:
:
Create(LPCTSTR**strname,intnowprocess,intmaxprocess,int*msgmaxcount,DWORD*msgsize)
2){
3)inti,j;
4)strName=newLPCTSTR*[maxprocess];
5)for(i=0;
i<
maxprocess;
i++)
6)strName[i]=newLPCTSTR[4];
7)for(i=0;
maxprocess;
i++)
8)for(j=0;
j<
4;
j++)
9)strName[i][j]=strname[i][j];
10)nowProcess=nowprocess;
11)msgSize=newDWORD[maxprocess];
12)for(i=0;
13)msgSize[i]=msgsize[i];
14)msgCnt=newint[maxprocess];
15)for(i=0;
16)msgCnt[i]=msgmaxcount[i];
17)//先创建文件映像
18)m_hMutex=CreateMutex(NULL,false,strname[nowProcess][MutexEnum]);
20)m_hFileMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,
21)PAGE_READWRITE,0,sizeof(_MSGQ_HEADER)+
22)sizeof(char)*msgCnt[nowProcess],strname[nowProcess][SpaceEnum]);
23)if(m_hFileMap==NULL)
24){
25)QMessageBox:
information(NULL,tr("
提示"
),
26)tr("
创建共享内存失败"
));
27)returnFALSE;
28)}
29)//映射文件映像
30)
31)m_hViewBuf=MapViewOfFile(m_hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
//映射全部Buffer
32)if(m_hViewBuf==NULL)
33){
34)QMessageBox:
35)tr("
读取共享内存失败"
36)returnFALSE;
37)}
38)
39)//信号量创建
40)m_SemaphoreSend=CreateSemaphore(NULL,msgCnt[nowProcess],msgCnt[nowProcess],strname[nowProcess][SendEnum]);
41)m_SemaphoreReceive=CreateSemaphore(NULL,0,msgCnt[nowProcess],strname[nowProcess][ReceiveEnum]);
42)
43)//设置MsgQ头信息
44){
45)pMsgInfo=(_MSGQ_HEADER*)m_hViewBuf;
46)pMsgInfo->
MsgMaxCount=msgCnt[nowProcess];
47)pMsgInfo->
MsgSize=msgSize[nowProcess];
48)pMsgInfo->
ReadIndex=0;
49)pMsgInfo->
WriteIndex=0;
//从索引0开始写
50)pMsgInfo->
MsgNum=0;
51)
52)//ReleaseMutex(m_Semaphore);
53)}
54)returnTRUE;
55)}
5.4.3、Send()函数实现
Send(LPVOIDbuf,intwhichProcess,DWORDwaitTime)
3)LPCVOIDori;
4)char*lpchar;
//地址指针
5)BOOLbRet=FALSE;
//返回值判断
6)_MSGQ_HEADER*potherMsgInfo;
//目的地的队列索引
7)
8)//打开目的地的邮箱
9)HANDLEother_hFileMap=OpenFileMapping(FILE_MAP_WRITE,FALSE,strName[whichProcess][SpaceEnum]);
10)if(other_hFileMap==NULL)
11){
12)QMessageBox:
13)tr("
打开共享内存失败"
14)returnFALSE;
15)}
16)
17)//打开目的地邮箱的发送信号量
18)HANDLEother_SemaphoreSend=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,strName[whichProcess][SendEnum]);
19)//打开目的地邮箱的接受信号量
20)HANDLEother_SemaphoreReceive=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,strName[whichProcess][ReceiveEnum]);
21)
22)
23)//ReleaseSemaphore(other_Semaphore,1,NULL);
24)//打开目的地邮箱的空间
25)QProcessgzip;
26)gzip.start("
clock.exe"
QStringList()<
<
"
28"
);
27)DWORDdRet=WaitForSingleObject(other_SemaphoreSend,waitTime);
28)
29)ori=MapViewOfFile(other_hFileMap,FILE_MAP_WRITE,0,0,0);
30)lpchar=(char*)ori;
31)potherMsgInfo=(_MSGQ_HEADER*)lpchar;
32)
33)HANDLEopenmutex=OpenMutex(MUTEX_ALL_ACCESS,false,strName[whichProcess][MutexEnum]);
34)//P操作
35)
36)
37)if(dRet==WAIT_OBJECT_0)
38){
39)gzip.close();
40)if(potherMsgInfo->
MsgNum!
=potherMsgInfo->
MsgMaxCount)//再次判断是否可写
41){
42)WaitForSingleObject(openmutex,waitTime);
43)potherMsgInfo->
MsgNum++;
44)lpchar+=sizeof(_MSGQ_HEADER)+sizeof(char)*potherMsgInfo->
MsgSize*potherMsgInfo->
WriteIndex;
45)strcpy(lpchar,(char*)buf);
46)
47)if(++potherMsgInfo->
WriteIndex==potherMsgInfo->
MsgMaxCount)//环形Queue
48)potherMsgInfo->
49)ReleaseMutex(openmutex);
50)bRet=TRUE;
51)}
52)//V操作
53)ReleaseSemaphore(other_SemaphoreReceive,1,NULL);
54)}elseif(dRet==WAIT_TIMEOUT)
55){
56)QMessageBox:
57)tr("
对方邮箱已满,发送失败"
58)}
59)//CloseHandle(other_hViewBuf);
60)UnmapViewOfFile(ori);
61)CloseHandle(openmutex);
62)CloseHandle(other_hFileMap);
63)CloseHandle(other_SemaphoreSend);
64)CloseHandle(other_SemaphoreReceive);
65)CloseHandle(other_SemaphoreReceive);
66)returnbRet;
67)}
5.4.4、Receive()函数实现
Receive(LPVOIDbuf,DWORDwaitTime)
6)//打开本地邮箱的发送信号量
7)HANDLEmy_SemaphoreSend=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,strName[nowProcess][SendEnum]);
8)//打开本地地邮箱的接受信号量
9)HANDLEmy_SemaphoreReceive=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,strName[nowProcess][ReceiveEnum]);
11)DWORDdRet=WaitForSingleObject(my_SemaphoreReceive,waitTime);
12)
13)if(dRet==WAIT_OBJECT_0)
14){
15)if(pMsgInfo->
=0)//再次判断是否可读
16){
17)ori=MapViewOfFile(m_hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
18)lpchar=(char*)ori;
19)lpchar+=sizeof(_MSGQ_HEADER)+sizeof(char)*msgSize[nowProcess]*pMsgInfo->
ReadIndex;
20)strcpy((char*)buf,lpchar);
21)lpchar[0]='
\0'
;
22)pMsgInfo->
MsgNum--;
23)if(++pMsgInfo->
ReadIndex==pMsgInfo->
24)pMsgInfo->
25)
26)bRet=TRUE;
27)}
28)ReleaseSemaphore(my_SemaphoreSend,1,NULL);
29)}elseif(dRet==WAIT_TIMEOUT)
30){
31)QMessageBox:
32)tr("
本进程邮箱已空,不可接收信息"
33)}
34)UnmapViewOfFile(ori);
35)CloseHandle(my_SemaphoreSend);
36)CloseHandle(my_SemaphoreReceive);
37)returnbRet;
38)}
5.4.5、实时显示函数
1)intCMsgQ:
Read(char**ReadMailBox)
5)inti;
6)for(i=0;
pMsgInfo->
MsgMaxCount;
7)ReadMailBox[i][0]='
8)i=0;
9)while(i!
=pMsgInfo->
MsgMaxCount)
10){
11)//ori=MapViewOfFile(m_hFileMap,FILE_MAP_READ,0,0,0);
12)ori=m_hViewBuf;
13)lpchar=(char*)ori;
14)lpchar+=sizeof(_MSGQ_HEADER)+sizeof(char)*msgSize[nowProcess]
15)*((pMsgInfo->
ReadIndex+i)%pMsgInfo->
MsgMaxCount);
16)strcpy(ReadMailBox[i++],lpchar);
17)if((pMsgInfo->
MsgMaxCount==pMsgInfo->
WriteIndex)//环形Queue
18)break;
19)//UnmapViewOfFile(ori);
20)}
21)returni;
22)}
6、演示效果图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 进程 通信