计算机网络编程第九讲并发服务器

上传人:tian****1990 文档编号:82521578 上传时间:2019-02-24 格式:PPT 页数:27 大小:2.71MB
返回 下载 相关 举报
计算机网络编程第九讲并发服务器_第1页
第1页 / 共27页
计算机网络编程第九讲并发服务器_第2页
第2页 / 共27页
计算机网络编程第九讲并发服务器_第3页
第3页 / 共27页
计算机网络编程第九讲并发服务器_第4页
第4页 / 共27页
计算机网络编程第九讲并发服务器_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《计算机网络编程第九讲并发服务器》由会员分享,可在线阅读,更多相关《计算机网络编程第九讲并发服务器(27页珍藏版)》请在金锄头文库上搜索。

1、计算机网络编程,第九讲 并发服务器,1,多进程实现并发(第11章) 多线程实现并发(第12章) 单线程实现并发(第13章),计算机网络编程,电子科大计算机学院,2,目录,并发的面向连接的服务器 采用算法8.4的最常用的服务器设计 主服务器进程在机器启动的时候自动一直运行,对每个客户的新连接创建一个新的从线程/进程进行处理 并发ECHO的例子 多进程(每个进程含一个线程)设计的并发服务器 多线程(属于同一个进程)设计的并发服务器 单线程设计的并发服务器,计算机网络编程,电子科大计算机学院,3,并发服务器概述,功能: 客户打开到某个服务器的连接,然后在该连接上重复发送数据,并读取从服务器返回的回显

2、, 服务器响应每个客户,接受连接,读取来自该客户的数据,并原样返回给客户。 服务器在发送响应前并非读取全部输入,只是交替读写 服务器在遇到文件结束的条件后,关闭连接,计算机网络编程,电子科大计算机学院,4,并发ECHO,如果使用循环服务器实现 某些客户可能发送大量的数据,导致其他的客户延迟 使用并发服务器实现 避免了长时间的延迟,不允许单个客户占用所有的资源 使服务器与许多客户同时进行通信 客户感觉服务器提供了较短的响应时间,计算机网络编程,电子科大计算机学院,5,循环与并发实现的比较,服务器包括一个主进程,以及零个或者多个从进程。每个进程一个线程 主服务器使用accept阻塞调用,节约CPU

3、资源,连接到来的时候,accept马上返回。,计算机网络编程,电子科大计算机学院,6,进程结构,#include 语句 变量定义,宏定义,函数声明 主函数 参数处理 建立被动套接字 循环等待连接,如果有新连接,则fork一个新的线程,调用TCPechod进行处理 TCPechod函数 处理echo服务,计算机网络编程,电子科大计算机学院,7,并发ECHO服务器举例,使用fork的服务器动态生成进程,可能导致不完全的进程终止 linux在一个子进程退出的时候,会给父进程一个信号(signal) 正在退出的进程保持在死状态,直到父进程执行wait3系统调用为止 signal(SIGCHLD, re

4、aper)主服务器进程收到子进程退出信号的时候,执行函数reaper 函数reaper调用函数wait3完成子进程的终止并退出。 参数WNOHANG指明wait3不要为了进程退出而阻塞等待,计算机网络编程,电子科大计算机学院,8,清除游离进程,面向连接的并发技术 使用多进程的方式实现:fork 主进程的线程永远不会和任何客户打交道,只接受连接,创建一个从进程处理各个连接 从进程从主进程调用fork后立即执行 主进程关闭新连接所用的描述符的副本 从进程关闭主描述符的副本,计算机网络编程,电子科大计算机学院,9,小结,一个进程中有一个或者多个线程 linux中的线程符合POSIX线程标准,1003

5、.1c linux中线程的特点 动态创建:pthread_create,具有上限 并发执行:多处理机上可以并行 抢先:系统自动在多个线程中调动CPU资源 私有局部变量:每个线程有自己的私有堆栈,存放局部变量 共享全局变量:一个进程的所有线程共享全局变量 共享文件描述符:一个进程内的所有线程共享一组文件描述符 协调和同步函数:具有线程协调和同步执行的函数,计算机网络编程,电子科大计算机学院,10,使用线程来实现并发(TCP,算法8.4),多线程的进程和单线程的进程比较 更高的效率:上下文切换的额外开销减少 上下文切换:线程切换需要执行的指令 同一进程中的两个线程比不同进程中的两个线程切换要快 进

6、程内的线程切换不用改变虚拟存储器的映射 共享存储器: 并发服务器中的多个副本需要相互通信或者访问共享的数据 利用线程容易构造监控系统,计算机网络编程,电子科大计算机学院,11,线程的优点,由于线程间共享存储器和进程状态,一个线程的动作可能对同一个进程内的其他线程产生影响。 两个线程如果同一时刻访问同一个变量,会产生相互干扰 将指针返回给一个静态的数据项的库函数不是线程安全(thread safe)的,覆盖将会导致错误 缺乏健壮性,一个线程出错,服务器将会终止整个进程,计算机网络编程,电子科大计算机学院,12,线程的缺点,许多动态分配的资源都是和进程相关的 一个线程打开某个文件,同一进程的其他线

7、程也可以使用同一个描述符访问文件 虽然有些操作系统调用只会影响调用它的线程 I/O调用阻塞,只影响调用它的线程; 但是有些系统调用会影响整个进程 exit函数会让整个进程退出 线程的退出方法 线程的顶级过程返回时终止该线程 调用pthread_exit终止该线程,计算机网络编程,电子科大计算机学院,13,描述符、延迟和退出,线程协调和同步是必要的 线程可能被阻塞。 线程的同步机制:互斥,信号量,条件变量 互斥 对共享数据的排他性访问 pthread_mutex_init,产生并初始化一个互斥 pthread_mutex_lock, 使用共享数据前调用 pthread_mutex_unlock,

8、使用共享数据后释放,计算机网络编程,电子科大计算机学院,14,线程的协调与同步,信号量:同步机制 用于系统中有N个资源可用的情况允许N个线程同时执行使用 sem_init,初始化一个信号量 sem_wait, 线程使用一个资源前必须调用 sem_post,使用完后返还资源,计算机网络编程,电子科大计算机学院,15,线程的协调与同步,条件变量 最复杂和难以理解的一种同步机制 一组线程使用互斥对同一个资源提供排它性访问。 一旦某个线程获得资源,它需要等待一个特定的条件发生 pthread_cond_wait: 同时指定了等待的条件变量和所拥有的互斥,执行后阻塞。 pthread_cond_sign

9、al只允许一个线程继续执行 pthread_cond_broadcast允许多个线程继续执行 等待条件变量的时候要暂时放弃互斥 得到条件变量的时候自动重新获得互斥,计算机网络编程,电子科大计算机学院,16,线程的协调与同步,多线程的ECHO服务 并发的面向连接的算法 连接到达后,调用pthread_create创建一个新的线程来处理连接。 新线程执行TCPechod过程。 TCPmtechod.c page110 线程处理函数 统计结构的互斥使用 互斥处理函数,计算机网络编程,电子科大计算机学院,17,使用线程服务器实例,采用一个独立的线程prstats打印统计信息 每睡眠INTERVAL打印

10、一次 监控线程和从线程使用一个共享的全局数据结构:stats相互通信 采用互斥的机制:stats.st_mutex 实际的服务器监控程序可以让管理员以更加复杂的形式和服务器交互 可以控制服务器 可以按需提供信息 可以得到更加全面的信息,计算机网络编程,电子科大计算机学院,18,监控,并发服务器可以在一个进程中用若干线程实现 优点是: 开销少 共享存储器 可以监控 缺点是: 增加了编程的复杂性 必须使用同步机制协调线程对全局变量和一些库程序的访问 必须弄清一些可能影响整个进程的系统函数,计算机网络编程,电子科大计算机学院,19,小结,大多数并发服务器使用前面提供的两种方法,使用操作系统的设施创建

11、独立的进程或者线程,利用分时来占用处理器 使用单线程也可以提供表面上的并发性 为什么是可行的 什么时候比较好 如何实现,计算机网络编程,电子科大计算机学院,20,单线程并发服务器(算法8.5),对一个请求的响应中如果I/O占了主导地位,服务器可以使用异步I/O来实现表面并发性,使用数据触发处理。 ECHO服务器 理论上是时间分片机制让多线程共享CPU 实际上是数据的到达控制了处理的进行 每个从线程大部分时间花在read的阻塞上 若并发服务器处理每个请求仅需要很少时间,可以由数据到达驱动。 在工作量太大,以致CPU不能顺序执行的时候,分时机制才取而代之,计算机网络编程,电子科大计算机学院,21,

12、服务器中的数据驱动处理,理解单线程如何完成并发服务器任务 打开许多客户的TCP连接 线程阻塞等待数据的到达 任何一个连接上有数据到达,线程就被唤醒 处理请求,发送响应后,再次阻塞,等待 另一个连接上数据到达 同多线程或者多进程比较,可能处理略高些的负荷(因为减少了上下文切换开销) 关键是使用OS的select原语实现异步I/O 算法8.5列出了实现,计算机网络编程,电子科大计算机学院,22,用单线程进行数据驱动处理,单线程、并发服务器的线程和套接字结构 一个执行线程管理所有的套接字,计算机网络编程,电子科大计算机学院,23,单线程服务器的线程结构,单线程服务器必须完成主线程和从线程双方的职责

13、维护一组套接字 组中某套接字绑定到接受连接的熟知端口上 其它套接字对应一个连接 服务器把这组套接字描述符作为一个参数传递给select,并等待任何一个套接字的活动 使用描述符来区别主线程和从线程的操作 主套接字描述符准备就绪,使用主线程的操作 从套接字的描述符就绪,使用从线程的操作,计算机网络编程,电子科大计算机学院,24,单线程服务器的线程结构,TCPmechod.c page118 在熟知端口上打开一个被动套接字 使用系统函数getdtablesize来决定描述符最大个数 使用FD_ZERO和FD_SET创建一个比特向量,对应于希望测试的套接字描述符 select等待一个或者多个描述符就绪

14、 FD_ISSET测试哪个描述符就绪 FD_CLR关闭连接后,从描述符组中删除,计算机网络编程,电子科大计算机学院,25,单线程的ECHO服务器,Select调用时,根据描述符集中被设置的位得到描述符值,进而找到对应的套接字结构,看是否有数据就绪(读/写/异常就绪),没有就绪的描述符在描述符集中对应位就被清0,所以每次调用select前都要将我们所关心的描述符在描述符集中置1. select返回描述符集中已经准备好的总位数。,Select原理,计算机网络编程,电子科大计算机学院,26,并发服务器通常是数据驱动的,不是下层操作系统中的时间分片机制驱动的 服务处理很少的情况下,单线程应用异步I/O管理多个连接,和多线程实现一样高效 单线程实现中,一个执行线程完成了主线程和从线程的职责 一组描述符表 使用select函数 ECHO服务器的例子,计算机网络编程,电子科大计算机学院,27,小结,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号