网络服务器的设计模式.ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
轮询服务器的特点 轮询服务器结构简单,没有进程控制或线程控制,但是却存在着以下问题: 如果插口上的数据流量不大,则这种形式的轮询浪费了大量的系统资源,如cpu周期,因而效率比较低。 非阻塞的I/O使出错代码的处理复杂化了。既要处理真正的致命的错误(如,链路断),又要处理没有数据或可用缓存的情况。 串行的处理客户请求。轮询服务器在处理一个客户请求的同时不能读入并处理其他客户的请求,因此这种服务器不可能让所有客户满意。 select服务器 select可以监控插口集的读、写和异常状态,它阻塞进程直到条件满足返回或超时返回。 如果select是因为超时返回,则继续调用同样的select; 如果是因为监控的插口的状态发生了变化,则循环定位每一个状态发生变化的插口; 如果是有数据到达则读取数据并进行处理; 如果是出现了异常情况(如带外数据到)或插口上出现错误,则处理异常情况或错误。 处理完所有状态发生变化的插口后,继续下一次select阻塞等待。 Select服务器既可用于TCP服务器,也可用于UDP服务器或两种服务的混合服务器。 初始化(变量、打开插口并置为非阻塞方式等) for(;;) { FD_ZERO(infds);/*初始化输入描述符集*/ FD_ZERO(exfds);/*初始化异常描述符集*/ for(所有要监视输入的插口描述符) FD_SET(插口描述符,infds); for(所有要监视异常的插口描述符) FD_SET(插口描述符,exfds); select(0,infds,NULL,exfds,超时间隔); for(每一个被监视的插口描述符) { if(FD_ISSET(插口描述符,infds) { switch(插口类型) { case TCP监听插口: if(accept(...)==0)/*有连接请求到*/ {建立连接,将新建立的连接插口加入到被轮询的插口集中去;} else {if(致命错误){关闭插口,将插口从被轮询的插口集中删除;}} select服务器的控制流程 case TCP连接插口: if(recv(...)0) {处理请求;} else {if(连接断){关闭插口,将插口从被轮询的插口集中删除;}} break; case UDP插口: if(recvfrom(...)=0) {处理请求;} break; } } if(FD_ISSET(插口描述符,exfds) { switch(插口类型) { case TCP连接插口: 读入带外数据; break; } } } } select服务器的控制流程(续) select服务器的特点 同简单的轮询服务器相比,它克服了轮询服务器的不断轮询所造成的资源浪费。但是,select服务器与轮询服务器并没有本质的区别,它仍然是串行地处理客户请求,即在处理一个请求的同时,进程不能读入并处理其它插口的请求,而要实现这一点需要后面介绍的并发服务器。 并发服务器 串行服务器串行地处理客户请求,因而不能满足所有用户的服务要求。多进程和多线程的机制为服务器同时处理多个请求提供了可能。 根据实现机制的不同,可以将并发服务器分为两大类:多进程服务器和多线程服务器。具体分类如下图: 类型 子类型 说明 多进程服务器 进程池服务器 预先派生子进程(进程池),对于TCP服务器根据调用accept的方式又可细分为两种:每个子进程调用accept;主进程调用accept,传递描述符给子进程。 临时创建进程服务器 为每个客户临时创建子进程方式(父进程向子进程传递插口描述符) 多线程服务器 线程池服务器 预先创建一组线程(称为线程池),对于TCP服务器根据调用accept的方式还可细分为每个线程各自调用accept和主线程统一调用accept两种方式 临时创建线程服务器 为每一个客户临时创建一个线程为其服务 并发服务器的分类 进程池服务器 进程池服务器的原理:在服务器启动时预先创建一组子进程,做好为接入的客户作服务的准备。我们将这组子进程称为“进程池”。 对于TCP服务器,根据调用accept的方式的不同可分为以下几种情况: 父进程在派生子进程之前,创建服务器监听插口。然后,每个派生的子进程独立调用accept等待连接请求。让应用进程在调用accept前设置某种形式的锁,调用完毕释放锁。这样每次只有一个子进程阻塞在accept调用上,其他子进程阻塞在获取调用accept的权利锁上。 只有父进程调用accept,通过管道等进程间通信方式将连接描述符传递给子

文档评论(0)

676200 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档