第五章 并发服务器.ppt

  1. 1、本文档共58页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.1并发服务器基础(1) 理解多客户问题 5.1并发服务器基础(2) 服务器分类 按连接类型 面向连接的服务器 采用TCP协议,可靠。不足之处是:每个连接需要相应的套接字,服务器要管理这些套接字,占用系统资源;连接需要建立和关闭过程,影响传输效率和响应时间,增加服务器负担。 无连接的服务器 采用uCP协议,但效率高,占用较少系统资源,服务器不必管理连接套接字。缺点:不可靠,需要程序中实现相应机制。 按处理方式 重复性服务器:每次只处理一个客户请求,当上一个客户请求处理完成后,才处理下一个请求,简单,效率低。 并发服务器:每次可处理多个客户请求,复杂,效率高。 5.1并发服务器基础(3) 重复性服务器 实现:使用setsockopt()的SO_REUSEADDR选项实现 典型代码: int opt, len; len=sizeof(opt) opt=SO_REUSEADDR; setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,opt,len); 实例: 源程序名:itrclient.cpp和itrserver.cpp 5.1并发服务器基础(4) 功能: 服务器等候客户连接,连接显示信息,并循环接收来自客户的信息;收到后显示之,反转后发回客户,直到某客户端输入“bye”关闭连接,就能等待下一客户请求。 客户首先与服务器连接,接收键盘输入字符串,发给服务器,接收服务器发回信息并显示,循环,直到bye,关闭连接。 运行程序: 服务器:%itrserver You got a connection from 127.0.0.1 received client message: 1234 客户1:%itrclient 127.0.0.1 connected to server. 输入: 1234 输出: 4321 (可以反复输入,均得到反序字符串,直到“bye”为止) 思考: 客户2、客户3同时运行该程序,结果如何? 5.1并发服务器基础(5) 并发服务器与并发技术 进程 进程是程序的一次运行。多个进程可以执行相同的代码(如父子进程),支持并发;单CPU采用分时系统使多个进程同时执行。通过主进程和子进程实现并发,主进程只接收客户请求,子进程只与客户通信。 线程 与进程类似,也支持并发。同一进程中的线程共享相同的全程变量和系统分配给该进程的资源,线程间切换更快。进程是最小的资源分配单位,而线程是最小的调度单位。 I/O多路复用 系统提供select()函数,在多个描述符中选择被击活的描述符进行操作。如一个服务器同时与多个客户端连接,就有多个TCP套接字描述符,采用时分多路复用技术实现进程或线程的并发处理。 5.1并发服务器基础(6) 三种并发服务器算法 (1)并发无连接服务器算法 无连接服务,不需要等待每个已连接上的数据,不必采用并发技术也能有效处理多个用户,用多进程/线程需处理大量系统开销,因此无连接服务一般不采用并发技术。 (2)并发面向连接服务器算法 通过主进程/线程和子进程/线程实现并发,主进程只接收客户请求,子进程只与客户通信。 (3)单进程/线程的并发服务器算法 进程/线程需要较多的系统开销,采用I/O多路复用实现处理多个客户连接,不必产生多个进程/线程。 5.2多进程服务器(1) 5.2多进程服务器(2) 进程概念 进程是程序在一个数据集上以并发方式运行的一次过程。 进程是程序的动态执行。 有生存期。 由程序、数据、进程控制块构成。 一个进程可包括多个程序,一个程序也可对应多个进程。 每个进程有唯一的进程标识符pid。 用ps命令看当前系统运行的进程。 5.2多进程服务器(3) 系统调用 创建进程fork() 原型:#include sys/types.h #include unistd.h pid_t fork(void); 功能:创建一个新进程,父子进程共享代码段。 返回值:子进程中为0,父进程中为子进程ID, 出错为-1。 注:用getpid()可以获得当前进程标识符,用getppid()可以获得父进程标识符;通过分支语句控制父子进程执行不同代码(如C/S模式中)。 典型代码: pid_t pid; if((pid=fork())0) {/*parent process*/} else if(pid==0) {/*child process*/ ;exit(0);} else {cout“fork error!\n”;exit(0);} 5.2多进程服

文档评论(0)

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

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

1亿VIP精品文档

相关文档