教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 高等教育 >

天津科技大学操作系统实验1-5(7)

来源:网络收集 时间:2026-08-26
导读: 【实验结果与分析】 匿名管道是不命名的,它用于本地系统中父进程与 它启动的子程序之间的通信。而命名管 道由一个名字来标识,以使 客户端和服务端应用程序通过它可以进行彼此之间的通信。Windows中的匿名管道通信

【实验结果与分析】

匿名管道是不命名的,它用于本地系统中父进程与 它启动的子程序之间的通信。而命名管

道由一个名字来标识,以使 客户端和服务端应用程序通过它可以进行彼此之间的通信。Windows中的匿名管道通信机制是一种系统内部高效的数据通信 和同步机制,它不生成额外的文件,又能有效地管理通信过程中的 内存。这种隐藏的数据通信方式为应用程序进程间的通信和同步提 供了极大的灵活性。

(实验三选做题目,如果实现了本题目需要交此代码):在客户端输入数

据a和b,然后发送到服务器并计算a+b,然后把计算结果发送到客户端。可以多个客户端与同一个服务器并行通信。 界面设计如下:

17

难点所在:

实现的过程比较简单,但有一个难点。原本当服务端使用ConnectNamedPipe函数后,如果有客户端连接,就可以直接进行交互。原来在实现过程中,当管道空闲时,管道的线程函数会无限(INFINITE)阻塞。若现在需要停止服务,就必须结束所有的线程,TernimateThread可以作为一个结束线程的方法,但基本不用这个函数。一旦使用这个函数之后,目标线程就会立即结束,但如果此时的目标线程正在操作互斥资源、内核调用、或者是操作共享DLL的全局变量,可能会出现互斥资源无法释放、内核异常等现象。这里用重叠I/0来解决这个问题,在创建PIPE时使用FILE_FLAG_OVERLAPPED标志,这样使用ConnectNamedPipe后会立即返回,但线程的阻塞由等待函数WaitForSingleObject来实现,等待OVERLAPPED结构的事件对象被设置。 客户端主要代码: //提交按钮单击事件

void CMyDlg::OnSubmit() { // 打开管道 HANDLE hPipe = CreateFile(\ 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ; if ( hPipe == INVALID_HANDLE_VALUE ) { this->MessageBox ( \打开管道失败,服务器尚未启动,或者客户端数量过多\ return ; } DWORD nReadByte, nWriteByte ; char szBuf[1024] = {0} ; sprintf ( szBuf, \ // 把两个整数(a,b)格式化为字符串 WriteFile ( hPipe, szBuf, strlen(szBuf), &nWriteByte, NULL ) ; // 把数据写入管道 memset ( szBuf, 0, sizeof(szBuf) ) ; ReadFile ( hPipe, szBuf, 1024, &nReadByte, NULL ) ; // 读取服务器的反馈信息 sscanf ( szBuf, \ // 把返回信息格式化为整数 this->UpdateData ( false ) ; CloseHandle ( hPipe ) ; }

服务端主要代码: //启动服务

void CMyDlg::OnStart() { CString lpPipeName = \ for ( UINT i = 0; i < nMaxConn; i++ ) { PipeInst[i].hPipe = CreateNamedPipe ( lpPipeName, PIPE_ACCESS_DUPLEX|FILE_ FLAG_OVERLAPPED, PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_WAIT, nMaxConn, 0, 0, 1000, NULL ) ; // 创建管道实例 if ( PipeInst[i].hPipe == INVALID_HANDLE_VALUE )

18

{ DWORD dwErrorCode = GetLastError () ; this->MessageBox ( \创建管道错误!\ return ; } // 为每个管道实例创建一个事件对象,用于实现重叠IO PipeInst[i].hEvent = CreateEvent ( NULL, false, false, false ) ; // 为每个管道实例分配一个线程,用于响应客户端的请求 PipeInst[i].hTread = AfxBeginThread ( ServerThread, &PipeInst[i], THREAD_PRIORITY _NORMAL ) ; } this->SetWindowText ( \命名管道实例之服务器(运行)\ this->MessageBox ( \服务启动成功\}

// 停止服务

void CMyDlg::OnStop() { DWORD dwNewMode = PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_NOWAIT ; for ( UINT i = 0; i < nMaxConn; i++ ) { SetEvent ( PipeInst[i].hEvent ) ; CloseHandle ( PipeInst[i].hTread ) ; CloseHandle ( PipeInst[i].hPipe ) ; } this->SetWindowText ( \命名管道实例之服务器\ this->MessageBox ( \停止启动成功\}

// 线程服务函数

UINT ServerThread ( LPVOID lpParameter ) { DWORD nReadByte = 0, nWriteByte = 0, dwByte = 0 ; char szBuf[MAX_BUFFER_SIZE] = {0} ; PIPE_INSTRUCT CurPipeInst = *(PIPE_INSTRUCT*)lpParameter ; OVERLAPPED OverLapStruct = { 0, 0, 0, 0, CurPipeInst.hEvent } ; while ( true ) { memset ( szBuf, 0, sizeof(szBuf) ) ; // 命名管道的连接函数,等待客户端的连接(只针对NT) ConnectNamedPipe ( CurPipeInst.hPipe, &OverLapStruct ) ; // 实现重叠I/0,等待OVERLAPPED结构的事件对象 WaitForSingleObject ( CurPipeInst.hEvent, INFINITE ) ;

19

}

// 检测I/0是否已经完成,如果未完成,意味着该事件对象是人工设置,即服务需要停止 if ( !GetOverlappedResult ( CurPipeInst.hPipe, &OverLapStruct, &dwByte, true ) ) break ; }

// 从管道中读取客户端的请求信息

if ( !ReadFile ( CurPipeInst.hPipe, szBuf, MAX_BUFFER_SIZE, &nReadByte, NULL ) ) { MessageBox ( 0, \读取管道错误!\ break ; }

int a, b ;

sscanf ( szBuf, \pMyDlg->nFirst = a ; pMyDlg->nSecond = b ; pMyDlg->nResValue = a + b ; memset ( szBuf, 0, sizeof(szBuf) ) ;

sprintf ( szBuf, \// 把反馈信息写入管道

WriteFile ( CurPipeInst.hPipe, szBuf, strlen(szBuf), &nWriteByte, NULL ) ; pMyDlg->SetDlgItemInt ( IDC_FIRST, a, true ) ; pMyDlg->SetDlgItemInt ( IDC_SECOND, b, true ) ;

pMyDlg->SetDlgItemInt ( IDC_RESULT, pMyDlg->nResValue, true ) ; // 断开客户端的连接,以便等待下一客户的到来 DisconnectNamedPipe ( CurPipeInst.hPipe ) ;

return 0 ;

20

实验四 银行家算法模拟

【开发语言及实现平台或实验环境】 C++/C#

Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET 2003

【实验目的】

(1)进一步理解利用银行家算法避免死锁的问题; (2)在了解和掌握银行家算法。

(3)理解和掌握安全序列、安全性算法

【实验内容】

(1)编写安全性算法;

(2)编写银行家算法,并编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。

【实验原理】 一、安全状态

指系统能按照某种顺序如(称为序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。 二、银行家算法

假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。系统按下述步骤进行安全检查:

(1)如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。 (2)如果Requesti≤Available则继续以下检查,否则显示系统无足够资源,Pi阻塞等待。 (3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:

Available[j]∶=Available[j]-Requesti[j]; Allocation[i,j]∶=Allocation[i,j]+Requesti[j]; Need[i,j]∶=Need[i,j]-Requesti[j …… 此处隐藏:2349字,全部文档内容请下载后查看。喜欢就下载吧 ……

天津科技大学操作系统实验1-5(7).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/614421.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)