服务器软件设计的算法和问题.ppt

上传人:za****8 文档编号:15892508 上传时间:2020-09-13 格式:PPT 页数:30 大小:815.05KB
返回 下载 相关 举报
服务器软件设计的算法和问题.ppt_第1页
第1页 / 共30页
服务器软件设计的算法和问题.ppt_第2页
第2页 / 共30页
服务器软件设计的算法和问题.ppt_第3页
第3页 / 共30页
点击查看更多>>
资源描述
计算机通信与网络编程,第七讲 服务器软件设计的算法和问题 电子科技大学计算机学院,服务器软件设计概述,循环和并发的服务器的实现 无连接和面向连接的服务器访问 无状态和有状态的服务器应用 简单服务器的算法: 创建套接字 绑定到一个熟知端口 期望在这个端口上接收请求 进入无限循环,接受客户请求并应答 只适用于最简单的服务,并发服务器和循环服务器,循环服务器:一个时刻只处理一个请求 并发服务器:一个时刻可以处理多请求 多数只提供表面并发:执行多个线程,每个线程处理一个请求 使用线程的可能性:计算量小,主要是异步I/O, 便于同时使用多个通信信道 并发处理多个请求,而不是指下层是否使用了多个并发线程 循环服务器容易构建,但是性能差;并发服务器难以构建和设计,但是性能好,面向连接和无连接的访问,连接性问题是传输协议的中心,TCP/IP提供了两种协议:TCP, UDP 使用TCP的服务器是面向连接的服务器 使用UDP的服务器是无连接的服务器 选择面向连接或者无连接的服务,依赖于应用协议 设计上使用面向连接的传输服务的应用协议时,如果实际中使用了无连接的传输协议时,将可能不能正确地运行或者不能有效运行。,传输协议的语义,1. TCP的语义 点到点通信 建立可靠连接 可靠交付 具有流控的传输 双工传输 流模式,2. UDP的语义 多队多通信 不可靠服务 缺乏流控制 报文模式,选择传输协议,需要考虑应用程序要求的语义,面向连接的服务器,面向连接的服务的优点: 易于编程 自动处理分组丢失,分组失序 自动验证数据差错,处理连接状态 面向连接的服务的缺点: 对每个连接都有一个单独的套接字,耗费更多的资源 在空闲的连接上不发送任何分组 始终运行的服务器会因为客户的崩溃,导致无用套接字的过多而耗尽资源,无连接的服务器,优点:没有资源耗尽问题 缺陷:需要自己完成可靠通信问题 必要时,需要一种自适应重传的复杂技术,需要程序员具有相当的专业知识 对于可靠通信的场合,尽量使用tcp 是否需要组播或者广播是考虑选择何种传输方式的一个因素 支持组播或者广播的服务器必须是无连接的,今后会不断增加这样的应用。,故障、可靠性和无状态,状态信息:服务器维护的,关于它和客户正进行的交互状态信息 无状态服务器:没有保留任何状态信息 状态服务器:维护状态信息的服务器 无状态源于对确保可靠性的要求:无连接传输不可靠,要求无连接 传输协议不能保证可靠,应用协议的设计必须保证可靠 实现服务器如果有状态依赖,必须慎重,优化无状态服务器,一个无连接服务器,允许客户从服务器机器磁盘上读出文件 要保持无状态,每个客户请求都必须指定文件名,文件中的位置,读取的字节数 设计服务器的时候,我们注意到: 文件打开和关闭的额外开销较高 使用该服务器的客户请求可能只读十来字节 客户通常按顺序读取文件数据 服务器从内存缓冲区读取数据比磁盘快得多 优化服务器性能维护一个小的文件信息表,优化无状态服务器,使用IP地址和端口号索引 将没有发现的读取数据从磁盘读到内存,文件名:X 偏移量:512 缓存指针:,文件名:Y 偏移量:1024 缓存指针:,用于文件X的缓存从 512字节开始,用于文件Y的缓存从 1024字节开始,hash(IP addr,port),有关客户使用的文件的信息表,优化无状态服务器,上述的信息表格可以改善服务器性能 需要程序员极其小心:检查文件名等 如果客户出了故障重新启动,将会重新获得一个不同的端口号,先前的表项将会失去作用,最终会耗尽服务器资源 服务器可以选择删除LRU(最近最少使用)但是如果客户经常崩溃,可能让服务器删除一个合法的客户条目 优化无状态服务器的时候,程序员必须小心 如果客户经常崩溃或者重启,或者网络使报文重复或者迟延,管理少量状态信息也会消耗资源,四种基本类型的服务器,循环的或者并发的 使用面向连接的或者无连接的传输,请求处理时间,循环服务器是最简单的,客户按照顺序等待。是否能够满足要求取决于所需的反应时间 观测响应时间:客户发送请求到服务器相应之间的全部时延。 请求处理时间:服务器处理单个孤立的请求所花费的时间。 循环服务器一次处理一个请求。如果N代表请求的平均长度,观测响应时间大约是N/2+1服务请求处理时间 如果一个服务器设计处理K个客户,每个客户每秒发送R个请求,服务器请求处理时间必须小于每请求1/KR秒。否则请求队列将溢出。这时设计者必须考虑并发实现,循环的面向连接的服务器算法,通过TCP的面向连接的循环服务器算法 创建套接字并将其绑定到它所提供服务的熟知端口上; 将该端口设置为被动模式,使其准备为服务器所用; 从该套接字上接收下一个连接请求,获得该连接的新的套接字; 重复地读取来自客户的请求,构造响应,按照应用协议向客户发回响应; 当某个特定客户完成交互时,关闭连接,并返回步骤3以接受新的连接。,用INADDR_ANY绑定熟知端口,服务器需要创建套接字并将其绑定到所熟知的端口上 getportbyname:服务名映射到熟知端口上 bind为某个套接字指明某个端点,使用结构sockaddr_in,该结构含有IP地址和端口号 对于多接口主机使用INADDR_ANY指明了一个通配地址,让该主机的任何一个IP地址都匹配。,将套接字置于被动模式,调用listen:将套接字置于被动模式 一个参数指明套接字内部的请求队列长度 请求队列保存一组TCP传入连接请求,来自客户,都向这个服务器请求一个连接 接收连接并使用这些连接 调用accept:获得下一个传入连接请求 返回新的连接的套接字的描述符 服务器接收连接,使用read获得来自客户的应用协议,使用write发回应答。 服务器结束连接,使用close释放套接字,无连接循环服务器的算法,循环服务器的设计,编程,排错,修改很容易。往往使用无连接的协议。 循环服务器对于小的处理时间的服务工作很好。 无连接服务器算法如下: 创建套接字并将其绑定到所提供服务的熟知端口上; 重复读取来自客户的请求,构造响应,按照应用协议向客户发回响应。,无连接的服务器中构造应答,connect函数限制了套接字的使用 无连接服务器使用sendto:指明了发送的数据报和它将去的地址 retcode = sendto(s, msg, len, flags, toaddr, toaddrlen); 服务器从收到的请求中的源地址获得应答的地址。调用recvfrom得到数据和对方的地址 retcode = recvfrom(s, buf, len, flags, from, fromlen);,并发服务器的算法,给多个客户提供快速响应时间需要使用并发服务器 构造要求有相当的I/O时间的响应 可以部分重叠地使用处理器和外设 各个请求所要求的处理时间变化很大 时间分片允许单个处理处理那些只要求少量处理的请求尽快完成 服务器运行在具有多个处理器的计算机上 不同的处理器处理不同的请求 并发服务器通过使处理和I/O部分重叠来达到高性能。,主线程和从线程,尽管可以使用一个单线程实现并发服务器,但是大多数使用多线程: 主线程最先开始执行在熟知的端口上打开一个套接字,等待一个请求,并为每个请求创建一个从线程(可能在一个新进程中) 主线程不与客户直接通信,每个从线程处理一个客户的通信。 从线程构成响应并发送给客户后,这个从线程便退出,并发的无连接的服务器的算法,最简单的算法: 主1 、 创建套接字并将其绑定到所提供服务的熟知地址上。让该套接字保持为未连接的 主2 、 反复调用recvfrom接收来自客户的下一个请求,创建一个新的从线程来处理响应 从1 、 从来自主进程的特定请求以及到该套接字的访问开始 从2 、 根据应用协议构造应答,并用sendto将该应答发回给客户 从3 、 退出(即:从线程处理完一个请求后就终止) 由于创建进程或者线程是昂贵的,因此只有很少的无连接服务器采用并发实现,并发的面向连接服务器算法,面向连接的服务器在多个连接之间实现并发(不是在各个请求之间) 主1、创建套接字并将其绑定到所提供服务的熟知地址上。让该套接字保持为面向连接 主2、将该端口设置为被动模式 主3、反复调用accept以便接收来自客户的下一个连接请求,并创建新的从线程或者进程来处理响应 从1、由主线程传递来的连接请求开始 从2、用该连接与客户进行交互;读取请求并发回响应 从3、关闭连接并退出,服务器并发性的实现,两种形式的并发性:进程和线程 服务器创建多个进程,每个进程都有一个执行线程 服务器在一个进程中创建多个执行线程 将在11章和12章说明,主进程,从进程,主线程,从线程,把单独的程序作为进程使用,并发服务器为每个连接创建一个新从线程 对于单线程的进程实现,采用fork实现 程序中包含主进程和从进程的全部代码 从进程执行一个单独编写和编译的程序也许更加方便 linux系统支持 调用fork后再调用execve,使用单线程获得表面上的并发性,使用单个线程来处理客户的请求的意义 操作系统创建线程或者进程的开销太昂贵 许多应用要求服务器在多个连接中共享信息 X窗口系统使用显示缓存作为共享数据结构,给各个窗口的显示提供表面并发 出现在服务器的请求没有超过服务器的处理能力 单线程的服务器使用select系统调用进行异步I/O,单线程服务器处理多连接的算法,创建套接字并将其绑定到这个服务的熟知端口上,将该套接字加到一个表中,该表中的项是可以进行I/O的描述符。 使用select在已经有的套接字上等待I/O 如果最初的套接字准备就绪,使用accept获得下一个连接,并将这个新的套接字加入到表中,该表中的项是可以进行I/O的描述符。 如果最初的套接字以外的套接字就绪,就使用recv或read获得下一个请求,构造响应,用send或者write将响应发回给客户 继续按照以上的步骤2进行处理,各个服务器使用的场合,循环的和并发的: 如果循环方案产生的响应时间对应用来说足够,就可以使用循环;否则需要并发 真正的和表面上的并发性: 线程或切换环境的开销大,服务器需要在多个连接之间共享或者交换数据,用单线程; 使用线程开销不大或者要得到最大并发性,使用多进程 面向连接的和无连接的: 应用协议处理了可靠性问题,或者应用在局域网环境内,使用无连接的传输。,服务器类型小结,循环无连接服务器 请求要求处理少,无状态的,最常见的 循环的面向连接服务器 要求可靠传输的,对请求要求处理少的服务,较常见 并发的,无连接的服务器 不常见,为每个请求创建一个新线程或进程 并发的面向连接的服务器 最一般的。可靠传输,并发处理多个请求 多进程可以是多个独立的程序 多线程(进程)或者单线程方式,服务器死锁,循环的面向连接的服务器: 某个客户和服务器建立一个连接,客户不再发送请求,服务器无法使用recv得到请求,服务器将在这里阻塞 客户不能正常工作,不处理服务器的响应,将导致服务器的外发存储数据区填满阻塞 可能阻塞的系统调用会产生死锁 recv或者read, send或者write会阻塞 单线程的服务器会被阻塞死锁,小结,服务器的简单概念:循环运行,等待请求,处理请求,发送应答 很少计算的服务,循环实现工作得好; 为了更加有效,服务器是用并发处理多个请求;为了各个请求或者连接创建新线程/进程,实现并发 使用单线程可以得到表面上的并发性 客户的问题或者使用了阻塞系统调用的情况对于循环服务器以及使用单线程实现的并发服务中死锁都可能发生,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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