欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    操作系统实验报告 进程间通信.docx

    • 资源ID:9609654       资源大小:56.46KB        全文页数:14页
    • 资源格式: DOCX        下载积分:1金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要1金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统实验报告 进程间通信.docx

    1、操作系统实验报告 进程间通信 计算机操作系统实验报告(二)学号:030702412 姓名: 陈楠 学院: 数计学院 专业: 计算机类 年级: 2007级 班级: 4班 实验时间:20092010学年第一学期指导教师:丁善镜、黄志华1、实验题目2、实验目的掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法。3、实验环境Windows XP SP34、实验原理邮箱机制类似于日常使用的信箱。对于用户而言使用起来比较方便,用户只需使用send()向对方邮箱发邮件 receive()从自己邮箱取邮件, send()和 receive()的内部操作用户无需

    2、关心。因为邮箱在内存中实现,其空间有大小限制。其实send()和 receive()的内部实现主要还是要解决生产者与消费者问题。5、实验内容进程通信的邮箱方式由操作系统提供形如send()和receive()的系统调用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可以直观地体现在界面上。在此基础上查找所选用操作系统平台上支持信号量机制的系统调用具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱需要有创建、发信、收信、撤销等函数,至少能够支持两个进程互相交换信息,比较自己实现的信箱

    3、与操作系统本身提供的信箱,分析两者之间存在的异同。5.1、Mutex和Semaphore区别在windows环境下两者有着类似之处但不完全相同。 Semaphore可以比喻成是一个银行(临界区)有N人的服务窗口(最大允许同步进程数量),如果申请的客户(进程)少于N就可以办理业务,如果客户满了,就要等待某一个客户服务的结束。 Mutex可以比喻成是一个银行只有1各服务窗口,如果客户A正在办理,那么后续客户申请时只能等待,只有当客户A办理结束离开服务窗口时,后续客户依据申请顺序逐一获得被服务的资格。 Mutex在没有被任何线程所拥有时是有信号的,这时任何线程可以使用Wait functions去获

    4、取该对象的所有权。当Mutex被某个线程拥有后就处于没信号状态,并且只有当该线程使用ReleaseMutex释放该互斥对象时,它才能被其它线程获得。 在windows环境下一个线程中试图释放另个线程所拥有的Mutex是不会成功的,Mutex只能被所有者线程所释放。 在前面的例子中就是不允许插队。 Semaphore可以被其他进程释放 在前面的例子中就是允许插队,这样会导致超过允许服务的进程上限5.2、共享内存实现邮箱的数据结构由于共享内存的方法不直接提供队列功能故采用循环队列思想模拟缓冲区,下面是共享内存的头部,用来存储索引信息 struct DWORD MsgSize; /单个消息大小:字节

    5、数int MsgMaxCount; /消息的总数int MsgNum; /消息的个数int ReadIndex; /可读消息索引int WriteIndex; /可写消息索引;5.3、“实时”显示内容的处理与内存泄漏这个显示消息的函数每隔50ms执行一次,所以实际上是是查询方式来实现实时显示 在此模式下可以发现一些被人遗忘的内存释放,我在实现这个函数时候发现进程占用内存和执行时间成正比,最后才发现内存泄漏的地方,尤其是读取共享内存的指针特别占内存 5.4、相关代码5.4.1、声明类1)enum operation SpaceEnum,SendEnum,ReceiveEnum,MutexEnum

    6、;2)typedef struct _MSGQ_HEADER3)4) DWORD MsgSize; /单个消息大小:字节数5) int MsgMaxCount; /消息的总数6) int MsgNum; /消息的个数7) int ReadIndex; /可读消息索引8) int WriteIndex; /可写消息索引9)MSGQ_HEADER, *PMSGQ_HEADER;10)11)class CMsgQ:public QDialog12)13)public:14) CMsgQ()15)16) BOOL Create(LPCTSTR *strname,int nowProcess,int m

    7、axProcess,int *MsgMaxCount,DWORD *MsgSize);17)18) BOOL GetMsgQInfo(PDWORD msgSize, PDWORD msgCnt);19)20) BOOL Send(LPVOID buf,int whichProcess, DWORD waitTime=INFINITE);21) BOOL Receive(LPVOID buf, DWORD waitTime=INFINITE);22) int Read(char *ReadMailBox);23)24)private:25) PMSGQ_HEADER pMsgInfo;26) H

    8、ANDLE m_hMutex;27) HANDLE m_SemaphoreSend; /发送信号量28) HANDLE m_SemaphoreReceive; /接收信号量29) HANDLE m_hFileMap; /文件映像句柄30) LPVOID m_hViewBuf; /文件映像映射到地址空间的首地址31)32) LPCTSTR *strName;33) int nowProcess;34) DWORD *msgSize;35) int *msgCnt;36);5.4.2、创建函数实现1)BOOL CMsgQ:Create(LPCTSTR *strname,int nowprocess

    9、,int maxprocess,int *msgmaxcount,DWORD *msgsize)2)3) int i,j;4) strName = new LPCTSTR * maxprocess;5) for( i=0 ;imaxprocess ;i+)6) strNamei = new LPCTSTR 4;7) for( i=0 ;imaxprocess; i+)8) for(j=0 ;j4 ;j+)9) strNameij=strnameij;10) nowProcess = nowprocess;11) msgSize = new DWORD maxprocess;12) for( i

    10、=0 ;imaxprocess ;i+)13) msgSizei=msgsizei;14) msgCnt = new int maxprocess;15) for( i=0 ;iMsgMaxCount = msgCntnowProcess;47) pMsgInfo-MsgSize = msgSizenowProcess;48) pMsgInfo-ReadIndex = 0;49) pMsgInfo-WriteIndex = 0; /从索引0开始写50) pMsgInfo-MsgNum = 0;51)52) /ReleaseMutex(m_Semaphore);53) 54) return TR

    11、UE;55)5.4.3、Send()函数实现1)BOOL CMsgQ:Send(LPVOID buf,int whichProcess, DWORD waitTime)2)3) LPCVOID ori;4) char *lpchar; /地址指针5) BOOL bRet=FALSE; /返回值判断6) _MSGQ_HEADER *potherMsgInfo; /目的地的队列索引7)8) /打开目的地的邮箱9) HANDLE other_hFileMap=OpenFileMapping(FILE_MAP_WRITE,FALSE,strNamewhichProcessSpaceEnum);10)

    12、if(other_hFileMap = NULL)11) 12) QMessageBox:information(NULL,tr(提示),13) tr(打开共享内存失败);14) return FALSE;15) 16)17) /打开目的地邮箱的发送信号量18) HANDLE other_SemaphoreSend = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, strNamewhichProcessSendEnum);19) /打开目的地邮箱的接受信号量20) HANDLE other_SemaphoreReceive = OpenSemaphore

    13、(SEMAPHORE_ALL_ACCESS, FALSE, strNamewhichProcessReceiveEnum);21)22)23) /ReleaseSemaphore(other_Semaphore,1,NULL);24) /打开目的地邮箱的空间25) QProcess gzip;26) gzip.start(clock.exe, QStringList() MsgNum != potherMsgInfo-MsgMaxCount) /再次判断是否可写41) 42) WaitForSingleObject(openmutex, waitTime);43) potherMsgInfo-

    14、MsgNum+;44) lpchar += sizeof(_MSGQ_HEADER)+sizeof(char)*potherMsgInfo-MsgSize*potherMsgInfo-WriteIndex;45) strcpy(lpchar,(char *)buf);46)47) if(+potherMsgInfo-WriteIndex = potherMsgInfo-MsgMaxCount)/环形Queue48) potherMsgInfo-WriteIndex = 0;49) ReleaseMutex(openmutex);50) bRet = TRUE;51) 52) /V操作53) R

    15、eleaseSemaphore(other_SemaphoreReceive,1,NULL);54) else if(dRet = WAIT_TIMEOUT)55) 56) QMessageBox:information(NULL,tr(提示),57) tr(对方邮箱已满,发送失败);58) 59) /CloseHandle(other_hViewBuf);60) UnmapViewOfFile(ori);61) CloseHandle(openmutex);62) CloseHandle(other_hFileMap);63) CloseHandle(other_SemaphoreSend)

    16、;64) CloseHandle(other_SemaphoreReceive);65) CloseHandle(other_SemaphoreReceive);66) return bRet;67)5.4.4、Receive()函数实现1)BOOL CMsgQ:Receive(LPVOID buf, DWORD waitTime)2)3) LPCVOID ori;4) char *lpchar;5) BOOL bRet=FALSE;6) /打开本地邮箱的发送信号量7) HANDLE my_SemaphoreSend = OpenSemaphore(SEMAPHORE_ALL_ACCESS,

    17、FALSE, strNamenowProcessSendEnum);8) /打开本地地邮箱的接受信号量9) HANDLE my_SemaphoreReceive = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, strNamenowProcessReceiveEnum);10)11) DWORD dRet=WaitForSingleObject(my_SemaphoreReceive, waitTime);12)13) if(dRet = WAIT_OBJECT_0)14) 15) if(pMsgInfo-MsgNum != 0) /再次判断是否可读16

    18、) 17) ori = MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS,0,0,0);18) lpchar = (char *)ori;19) lpchar += sizeof(_MSGQ_HEADER) + sizeof(char)*msgSizenowProcess*pMsgInfo-ReadIndex;20) strcpy(char *)buf,lpchar);21) lpchar0 = 0;22) pMsgInfo-MsgNum-;23) if(+pMsgInfo-ReadIndex = pMsgInfo-MsgMaxCount)/环形Que

    19、ue24) pMsgInfo-ReadIndex = 0;25)26) bRet = TRUE;27) 28) ReleaseSemaphore(my_SemaphoreSend,1,NULL);29) else if(dRet = WAIT_TIMEOUT)30) 31) QMessageBox:information(NULL,tr(提示),32) tr(本进程邮箱已空,不可接收信息);33) 34) UnmapViewOfFile(ori);35) CloseHandle(my_SemaphoreSend);36) CloseHandle(my_SemaphoreReceive);37)

    20、 return bRet;38)5.4.5、实时显示函数1)int CMsgQ:Read(char *ReadMailBox)2)3) LPCVOID ori;4) char *lpchar;5) int i;6) for(i=0 ;iMsgMaxCount ;i+)7) ReadMailBoxi0=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)*msgSizenowProcess15) *(pMsgInfo-ReadIndex+i)%pMsgInfo-MsgMaxCount);16) strcpy(ReadMailBoxi+,lpchar);17) if(pMsgInfo-ReadIndex+i)%pMsgInfo-MsgMaxCount = pMsgInfo-WriteIndex)/环形Queue18) break;19) /UnmapViewOfFile(ori);20) 21) return i;22)6、演示效果图


    注意事项

    本文(操作系统实验报告 进程间通信.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开