资料:并发服务实验报告

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子科技大学通信学院

《网络软件设计实验报告》

并发服务

班级

学生

学号

教师

模板资料资源共享

并发服务实验

【实验目的】

1、掌握并发服务程序设计的特点

2、体会并发服务程序执行特点

3、了解进程(线程)控制、调度的原理和方法

【实验环境】

两人或三人一组实验,也可作为教师演示性实验。

【实验原理】

(见实验指导书相关部分)

【实验方法】

在中级阶段的程序中设计和实现主线程及子线程的核心部分。利用对比实验感受设计成果。利用VC的Spy工具观察进程和线程的状态。

【实验步骤】

1.实验前可先利用MSDN或查阅相关书籍了解本实验的重点实验对象:CreateThread()函数的使用方法及相关知识。

2.打开服务器工程,先来感受一下多线程并发执行的情况。

使用CtreateThread创建线程:服务器将在接受每个客户的连接时创建一个新线程,线程执行server_proc_test( ),该函数的原理是在一段空循环造成的延时后打印套接字,整个过程将不断反复进行,实验者可以观察到线程不断打印套接字标识符的现象,并进一步通过不同的线程打印不同的套接字标识符来体会线程之间调度的情况。在程序中,实验者可以通过调整空循环的次数,使线程一次连续输出的次数控制在3~10个,以便观察。

请连续启动4~5个客户机,观察多线程独立调度的情况。

2

当多个客户机连接后让程序执行一段时间,(如输出结果有4行以上),使用Break键,暂时停止系统,记录各线程输出结果的序列:

观察这个序列,特别注意各线程每次连续输出的个数是否一定相等:(即考察线程分得的时间片情况)。

各线程的输出结果是否一定按照固定的顺序轮流出现:,(多观察一些数据,本环节考察线程独立调度的情况)。

3.使用任务管理器观察CPU使用率,了解多线程下对CPU的使用情况。

按Ctrl+Alt+Del,

产生多个线程以前CPU的使用率:,

产生多个线程以后的CPU使用率:。

4.停止测试,回到服务器工程,这一次设计子线程执行函数:server_proc()。

要求:子线程控制一次连接的通信过程,即从客户端接收到一个字符串,打印,并发送回去一个确认字符串。

这样,服务器就只接收连接,而线程只在已建立连接的套接字上完成通信。

请记录server_proc的流程(简要的语言描述核心功能):

5.执行服务器,连续执行多个客户机,并尝试和服务器通信。

多个客户机是否能与服务器同时通信:。

6.使用任务管理器观察CPU利用率,和步骤3对比,思考为什么CPU利用率下降了。

3

多条连接并发服务下,CPU的使用率:。

7.打开spy++,在进程窗口里,查找COSERVER(注意大写)进程,找到后展开该进程,观察属于该进程的线程的情况。

spy++在Microsoft visual studio 6.0的Microsoft visual studio 6.0 tools下。

查找进程时,注意将待查进程的ID栏删空,在进程MODLUE栏中填入进程外部名:COSERVER,如图:

COSERVER有多少个线程:,当前与服务器建立连接的客户机数量:。

8.对比实验,将创建线程的语句改为直接调用server_proc()——即替换CreateThread为server_proc,不是步骤4中只是将CreateThread的参数3改为server_proc 。测试这样的服务能否实现多路复用,对比步骤5,体会多线程并发服务的效果。

单个客户机能否实现与服务器的正常通信:,

多个客户机同时连接服务器,能否实现多路复用:,

使用spy++观察,COSERVER有多少个线程:,当前与服务器建立连接的客户机数量:。

9.测试参数4——在主线程和子线程之间传递参数的方法。

再次替换server_proc为CreateThread,改参数3为server_proc_test2。

——server_proc_test2()功能是打印输入的参数,在打印之前使用gets()阻塞子线程的执行。

1)重新编译,并运行服务器程序。

2)执行客户机程序,观察服务器的输出,此时服务器希望传递给子线程的套接字标识符为:。

4

3)不关闭客户机的情况下,再次执行客户机程序,得到客户2,观察服务器的输出,,此时服务器希望传递给子线程的套接字标识符为:。

4)在服务器窗口内随便输入一个字符串,然后按回车键结束。

gets()的功能是从键盘输入一个字符串,以回车作为结束。在本实验中我们利用这个功能来暂时阻塞子线程,然后再通过人工输入的方式控制子线程继续。子线程继续执行以后,将取得传入的套接字标识符:。

再次输入一个字符串,以回车结束,子线程2也继续运行,取得了自己的传入参数:。

5)对比希望传入的和实际传入的参数,发生了什么现象:

6)请根据指导书的提示,改写主线程和server_proc_test2中相关语句,完成正确的参数传递.

主线程修改的语句为:

子线程修改的语句为:

启动测试,按步骤1)~5),希望传入的参数分别为:

实际得到的参数为:

是否正确传递了参数:。

【实验结果分析及结论】

(提示:多线程并发服务的特点)

5

【思考】

1、通过分析步骤2的实验现象,你对线程的调度有些什么体会?

2、步骤5的实验现象和之前的哪个实验的现象类似?为什么并发服务可以提供

多路复用的功能?

3、为什么利用spy看到的COSERVER的线程个数比实际因客户连接而创建的线

程数多一个?

4、本实验中服务器创建的子线程将在何时结束?

6

相关文档
最新文档