操作系统课程设计报告handshake

上传人:仙*** 文档编号:80344079 上传时间:2022-04-25 格式:DOC 页数:21 大小:118KB
返回 下载 相关 举报
操作系统课程设计报告handshake_第1页
第1页 / 共21页
操作系统课程设计报告handshake_第2页
第2页 / 共21页
操作系统课程设计报告handshake_第3页
第3页 / 共21页
点击查看更多>>
资源描述
操作系统课程设计报告 计算机学院网络工程专业操作系统课程设计报告 (2011/2012学年 第一学期)学生姓名: 学生班级: 网络工程092001 学生学号: 指导教师: 2011年12月28日 目录第一章 基本原理11.1基本概念11.2各函数作用及关系51.Resource.h的作用52.CmnHdr.h的作用53.Handshake.rc的作用64.Handshake.cpp的作用及结构65.Processinfo.cpp的结构7第二章 功能描述8第三章 实现描述11第四章 总结体会1819操作系统课程设计报告 第一章 基本原理1.1基本概念1.句柄句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。 句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。当一个进程被初始化时,系统要为它分配一个句柄表。该句柄表只用于内核对象。2.快照快照就是给当前的系统所处的状态拍了张照片,那么自然,这张照片里面就存放了当前系统在拍照那会儿所处的状态,这就是快照了。所以如果要访问系统的当前状态,只需要给它拍一张快照就可以进行访问了。3.进程与线程进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。线程是进程中某个单一顺序的控制流。也被称为轻量进程。计算机科学术语,指运行中的程序的调度单位。 下面的内核对象可以处于已通知状态或未通知状态:a.进程b.线程c.作业d.文件e.控制台输入f.信标g.互斥对象线程可以使自己进入等待状态,直到一个对象变为已通知状态。用于控制每个对象的已通知 /未通知状态的规则要根据对象的类型而定。前面已经提到进程和线程对象的规则及作业的规则。线程具有如下的优点:(1)由于在进程内的线程共享和资源,因此创建线程无须进行资源的分配,比创建一个进程要顺利和会计诶得多;这也使得撤销线程比撤销一个进程所花费的时间短。(2) 同一进程中的线程间切换是在进程的地址空间中进行的,因此比进程间的不同地址空间中的切换开销要少得多。(3) 进程中的线程可以随时访问该进程所拥有的所有资源,而无需做任何切换工作。(4)同一进程中的诸多线程共享内存区域和文件 ,因此它们之间可以直接进行通信,不必通过系统内核。在看操作系统这本课本的时候,我尤其发现线程与进程在系统运行时的重要性,因此在参阅课本以及查阅网上资料的帮助下,我总结了一些线程与进程的区别:(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源(3)线程是处理器调度的基本单位,但进程不是.(4)二者均可并发执行简而言之,一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执。4.模块模块是在程序设计中,为完成某一功能所需的一段程序或子程序;或指能由编译程序、装配程序等处理的独立程序单位;或指大型软件系统的一部分。5.列表框列表框英文意思为ListBox,列表框中的项目是通过程序插入到其中的,用户无法向清单中输入数据,当选择其中的项目,并在用户单击一个按钮或者执行某个操作时,由应用程序完成对指定项目的具体操作。,ListBox窗口用来列出一系列的文本,每条文本占一行,用户可以从中选择一项或多项。当项总数超过可以显示的项数时,则会自动向ListBox控件添加滚动条。6.组合框组合框控件很简单,可以节省空间。组合框的风格取值定义了组合框的具体属性,包括是否自动排序,是否有滚动条。7.LRESULTLRESULT是一个数据类型。8.MFCMFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries),以C+类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。在MFC应用程序中传输的消息有三种类型:窗口消息、命令消息和控件通知。1.2各函数作用及关系1.Resource.h的作用Resource.h是用户所有资源的ID,如果源代码中需要使用这些ID的话,就需要包含这个文件。它是由VC自己维护的,一般不用修改它。2.CmnHdr.h的作用此程序要包含CmmHdr.h头文件,并且要在其他头文件之前包含。这个文件包含 Unicode建立选项、窗口定义和第4级警告、Pragma消息帮助宏、chINRANGE和chDIMOF宏、chBEGINTHREADEX宏、对x86平台的调试断点改进、建立软件异常代码、chMB宏、chASSERT和chVERIFY宏、chHANDLE_DLGMSG宏、chSETDLGICONS宏、OS版本检查内联函数、确认宿主系统是否支持Unicode、强制链接程序寻找(w)WinMain进入点函数。3.Handshake.rc的作用设置了窗口的字体、字号、组合框、列表框、编辑控件的参数等。4.Handshake.cpp的作用及结构Handshake.cpp由5个函数组成,各个函数的作用如下:(1).DWORD WINAPI ServerThread(PVOID pvParam),是一个返回 DWORD(32位数据)的 API 函数。(2).BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)。OnInitDialog是MFC的面向对象编程语言的类CDialog中的成员函数名。他的函数原型为CDialog:OnInitDialog virtual BOOL OnInitDialog();调用这个成员函数是对WM_INITDIALOG消息作出的反应。这条消息是在对话框即将显示之前,在Create,CreateIndirect或DoModal调用期间发出的。如果在对话框初始化后需要执行特别处理,覆盖该函数。首先调用基类OnInitDialog,但不考虑其返回值。正常情况下,覆盖的函数返回TRUE。Windows调用OnInitDialog函数是通过标准的全局对话框过程(它们对于所有的Microsoft基础类库的对话框是通用的),而不是通过消息映射。因此该函数不需要消息映射入口。(3).void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify),主要是用来处理消息(控件,菜单,加速键)的。(4).INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)(5).int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) (6).ServerThread,函数,该函数立即让服务器等待客户机的请求。 (7).DialogBox函数,该函数负责显示应用程序的用户界面。5.Processinfo.cpp的结构函数之间的调用关系是:在运行函数5的时候需要调用函数4,而运行的函数4中需要分别调用函数3以及函数2,具体见下表: 5 4 3 2 表1-1第二章 功能描述在老师已给出的文件夹里有一个exe文件, 其中里面包含Handshake应用程序“09 Handshake.exe ”,它展示了自动重置事件的使用情况。当运行Handshake应用程序时,就会出现如下图所示的对话框。 图2-1 图2-2Handshake应用程序一开始会先收到一个请求字符串,Handshake应用程序在完成将请求字符串反转,将结果放入Result域时所用的方法不同一般的应用程序,而这也是其优点之所在吧。Handshake能够解决常见的编程问题。现在有一个之间需要互相进行通信的客户机和一个服务器。开始时,服务器会由于长期无事可做,因此它进入等待状态,直到客户机向服务器发送申请请求通知的时候。客户机想把一个请求提交给服务器时,它它会把请求先放入一个共享内存的缓冲区中,然后再向服务器发出一个事件通知。这时候,服务器会从等到状态走出,服务器线程会查看数据缓冲区并处理客户机的请求。相反,当服务器线程忙于处理该请求的时候,客户机的线程则会进入等待状态,直到服务器发出另一个事件通知,指明结果已经准备好。这时候客户机则要对服务器传出的结果进行相应的处理。当客户机再次被唤醒的时候,结果已经放入共享数据缓冲区中,并且客户机会把最终结果显示给用户。当Handshake用程序启动运行时,它立即创建两个未通知的自动重置的事件对象。一个事件是用于指明何时为服务器准备一个请求的g_hevtRequestSubmitted,服务器线程用来等待g_hevtRequestSubmitted,而客户机线程则会发出通知通知该事件。第二个事件是 g_hevtResultReturned,用来指明何时为客户机准备好结果。客户机线程等待该事件,而服务器线程则负责发出该事件的通知。当各个事件创建后,服务器线程就产生ServerThread函数。该函数立即让服务器等待客户机的请求。然后服务器线程会执行该函数, 与此同时,主线程也是客户机线程也会同时调用 DialogBox函数,该函数负责显示应用程序的用户界面。可以将一些文字输入 Request域,然后,当点击 Submit Request ToServer(将请求提交给服务器)时,请求字符串将被放入由客户机和服务器线程共享的一个缓冲区,并发出g_hevtRequestSubmitted事件的通知。然后客户机线程通过等待 g_hevtResultReturened事件来等待服务器的结果。服务器醒来,将共享内存缓冲区中的字符串反转,然后发出 g_hevtResultReturned事件的通知。服务器的线程循环运行,以便等待客户机的另一个请求。该应用程序决不会调用ResetEvent函数,因为没有必要。自动重置的事件在等待成功后会自动恢复未通知状态。与此同时,客户机线程发现 g_hevtResultReturned事件已经变为已通知状态。它醒来,并将字符串从共享内存缓冲区拷贝到用户界面的 Result域。关闭该应用程序时,只需要关闭它的对话框即可。这会导致调用的 _tWinMain中的DialogBox函数返回。这时,主线程将一个特殊字符串拷贝到共享缓冲区,并唤醒服务器的线程,以便处理该特殊请求。主线程等待服务器线程确认请求已经收到,并等待服务器线程终止运行。当服务器线程发现该特殊的客户机请求字符串时,它就退出循环,而该线程则终止运行。主线程等待服务器线程终止运行的方法是调用 WaitForMultipleObjects函数,这样,就可以看到该函数是如何使用的。实际上,也可以调用 WaitForSingleObject函数,传递服务器线程的句柄,一切将以完全相同的方式来运行。一旦主线程知道服务器线程已经停止运行后,我将 3次调用CloseHandle函数,以便正确地撤消应用程序正在使用的所有内核对象。当然,系统能够自动执行这项操作,但是如果我自己进行操作,我的感觉会更好些。我喜欢能够随时控制我的代码。第三章 实现描述#include .CmnHdr.h /*/* See Appendix A. */#include #include #include / For beginthreadex#include Resource.h/ 当客户端从服务器返回时该事件被通知(客户端将字符放入共享缓存时被通知)HANDLE g_hevtRequestSubmitted;/ 当服务器完成翻转字符串时该事件被通知HANDLE g_hevtResultReturned;/ 客户端和服务器共享的缓存区TCHAR g_szSharedRequestAndResultBuffer1024;/ 客户端发送这个指定的值导致服务端线程终止TCHAR g_szServerShutdown = TEXT(Server Shutdown);/ 这些代码被服务器端线程执行DWORD WINAPI ServerThread(PVOID pvParam) /假设服务器端线程不会永远执行 BOOL fShutdown = FALSE; while (!fShutdown) /等待事件对象通知 WaitForSingleObject(g_hevtRequestSubmitted, INFINITE); / 读取共享缓存区的值并与g_szServerShutdown比较,判断客户端线程是否要 求服务器端线程终止运行 Shutdown=(lstrcmpi(g_szSharedRequestAndResultBuffer, g_szServerShutdown) = 0); /如果不是预定义的字符被传入,那么将进行翻转处理 if (!fShutdown) / Process the clients request (reverse the string) _tcsrev(g_szSharedRequestAndResultBuffer); /翻转处理完成,通知客户端线程来读取共享缓存区的内容 SetEvent(g_hevtResultReturned); return(0);BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) /用来设置程序图标的宏 /隐藏由于ComboBoxValue不支持字符而引入的ModelHelp控件 chSETDLGICONS(hwnd, IDI_HANDSHAKE); /也是一个宏.用于设置文本框的初始值 Edit_SetText(GetDlgItem(hwnd, IDC_REQUEST), TEXT(Some test data); return(TRUE);/响应菜单选择事件的回调函数void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) switch (id) /消息处理退出消息 case IDCANCEL: EndDialog(hwnd, id); break; /处理按钮点击消息 case IDC_SUBMIT: /获取文本框的值,第一个参数句柄,第二个缓存区,第三个要获取的长度 Edit_GetText(GetDlgItem(hwnd, IDC_REQUEST), g_szSharedRequestAndResultBuffer, chDIMOF(g_szSharedRequestAndResultBuffer); /将g_hevtRequestSubmitted置为通知状态使客户端线程可以读取缓存区内容 SetEvent(g_hevtRequestSubmitted); /等待服务器端线程翻转成功的事件通知并将结果文本框内容更新 WaitForSingleObject(g_hevtResultReturned, INFINITE); Edit_SetText(GetDlgItem(hwnd, IDC_RESULT), g_szSharedRequestAndResultBuffer); break; INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch (uMsg) chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog); chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand); return(FALSE);int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) /自动重置的未通知状态的事件对象 g_hevtRequestSubmitted = CreateEvent(NULL, FALSE, FALSE, NULL); g_hevtResultReturned = CreateEvent(NULL, FALSE, FALSE, NULL); /创建服务器线程 DWORD dwThreadID;HANDLE hThreadServer = chBEGINTHREADEX(NULL, 0, ServerThread, NULL, 0, &dwThreadID); /这是一个模态的对话框,运行客户端线程的用户界面。 DialogBox(hinstExe, MAKEINTRESOURCE(IDD_HANDSHAKE), NULL, Dlg_Proc); / 模态对话框退出以后,向服务器线程发送g_szServerShutdown / 并将g_hevtRequestSubmitted事件设为通知状态让服务器端线程运行(退出的代码) lstrcpy(g_szSharedRequestAndResultBuffer, g_szServerShutdown); SetEvent(g_hevtRequestSubmitted); / 等待服务器线程得到关闭通知并且完全关闭 HANDLE h2; h0 = g_hevtResultReturned; h1 = hThreadServer; WaitForMultipleObjects(2, h, TRUE, INFINITE); CloseHandle(hThreadServer); /此时g_hevtRequestSubmitted依然为未通知状态因为是自动重置事件对象 /当服务器线程结束的时候它的内核对象变为通知状态,并且这种过程是不可逆的。 CloseHandle(g_hevtRequestSubmitted); CloseHandle(g_hevtResultReturned); return(0);第四章 总结体会经过这次的课程设计我真的对它有了更深的体会,以前的课程设计全部是老师给出设计要求题目,让我们得以实现某种系统功能,而这次的第二组老师则给了我们一种新的设计课题把源代码给我们让我们自己首先看懂弄明白,然后在完全看懂已给的代码之后完成报告的设计与书写。当然重点就放在对代码的了解与分析上了,对于本来就对代码不是很熟悉的我,这绝对不比编写代码省事多少,不会的东西老师让我们自己查自己找,可以借用网络资源找出各类函数的作用以及在整篇代码中的含义。我从头开始从百度百科,再到CSDN当中的各种资料找到了一部分的函数含义,以及向那些学习相对较好的同学请教,算是大体上看懂了一小部分吧。在此过程中,让我感到最难受就是对自己当初没有好好学习的悔恨,看着别人快速的编写者报告,还不知道从何下笔的我真的是肠子都悔青了。说实话这样的一次真正课程设计报告真的是不同以往在网上找就能找到的报告。这次真的是需要我在网上针对问题自己查阅,要下的功夫确实不小,很多东西不知道是自己本还是什么,即使是找到了还是看不懂,估计是自己的水平太差吧。再向网上的那些高手请教了之后,突然觉得能成为一个对计算机研究很到位什么都会的人是那么的帅。看来到大三的时候我真的有必要重新审视一下自己的规划了,虽然不能说我是一个对自己不负责的人,但是就以往在学习上表现上我真的对自己很不满意。老师我知道这个总结体会应该更加着重在过程的体会,而非自己的懊恼悔恨。不过在我看来过程当中的艰辛远远比不上完成之后的悔恨。整个过程中我曾经有几次放弃的念头,幸好我坚持了下来。这次课程设计给我上了一个很重要的一课,我想以后的路我会更加认真地踏实地走的。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!