您好,欢迎访问三七文档
《计算机通信与网络编程》第八讲并发服务器电子科技大学计算机学院并发服务器概述并发的面向连接的服务器1.采用算法8.4的最常用的服务器设计2.主服务器进程在机器启动的时候自动一直运行,对每个客户的新连接创建一个新的从线程/进程进行处理3.并发ECHO的例子4.多线程设计的并发服务器5.单线程的并发服务器并发ECHO功能:客户打开到某个服务器的连接,然后在该连接上重复发送数据,并读取从服务器返回的回显,服务器响应每个客户,接受连接,读取来自该客户的数据,并原样返回给客户。1.服务器在发送响应前并非读取全部输入,只是交替读写2.服务器在遇到文件结束的条件后,关闭连接循环与并发实现的比较1.如果使用循环服务器实现某些客户可能发送大量的数据,导致其他的客户延迟2.使用并发服务器实现①避免了长时间的延迟,不允许单个客户占用所有的资源②使服务器与许多客户同时进行通信③客户感觉服务器提供了较短的响应时间进程结构1.服务器包括一个主进程,以及零个或者多个从进程。每个进程一个线程2.主服务器使用accept阻塞调用,节约CPU资源,连接到来的时候,accept马上返回。用于单个连接的套接字用于连接请求的套接字主进程从进程1从进程2从进程3操作系统服务器应用进程(或线程)循环的面向连接服务器进程结构用于连接请求的套接字服务器操作系统服务器应用进程用于单个连接的套接字并发ECHO服务器举例1.#include语句2.变量定义,宏定义,函数声明3.主函数①参数处理②建立被动套接字③循环等待连接,如果有新连接,则fork一个新的进程,调用TCPechod进行处理4.TCPechod函数处理echo服务信号概念1.信号UNIX系统所使用的最古老的进程通信方法2.系统用信号通知一个或多个进程异步事件的发生3.内核-进程或者进程-进程4.不能直接携带信息,一般用作非正常情况处理5.信号定义:SIGHUP/SIGINT/SIGQUIT/SIGCHLD/……6.SIGCHLD:子进程结束信号7.signal()系统调用:将指定的处理函数和信号相关联清除游离进程使用fork的服务器动态生成进程,可能导致不完全的进程终止1.linux在一个子进程退出的时候,会给父进程一个信号(signal)2.正在退出的进程保持僵尸状态,直到父进程执行wait3系统调用为止3.signal(SIGCHLD,reaper)主服务器进程收到子进程退出信号的时候,执行函数reaper4.函数reaper调用函数wait3完成子进程的终止并退出。参数WNOHANG指明wait3不要为了进程退出而阻塞等待多进程并发服务器1.特点:连接请求触发创建新的进程,关闭连接触发进程的退出;2.优点:①并发服务多个客户;②结构清晰,编程容易;3.缺点:①上下文切换开销大;②并发度不高;小结1.面向连接的并发技术2.使用多进程的方式实现:fork主进程的线程永远不会和任何客户打交道,只接受连接,创建一个从进程处理各个连接3.从进程从主进程调用fork后立即执行①主进程关闭新连接所用的描述符的副本②从进程关闭主描述符的副本使用线程来实现并发1.一个进程中有一个或者多个线程linux中的线程符合POSIX线程标准,1003.1c2.linux中线程的特点①动态创建:pthread_create,具有上限②并发执行:多处理机上可以并行③抢先:系统自动在多个线程中调动CPU资源④私有局部变量:每个线程有自己的私有堆栈⑤共享全局变量:一个进程的所有线程共享全局变量⑥共享文件描述符:一个进程内的所有线程共享一组文件描述符⑦协调和同步函数:具有线程协调和同步执行的函数线程的优点1.多线程的进程和单线程的进程比较更高的效率:上下文交换的额外开销减少①上下文交换:线程切换需要执行的指令②同一进程中的两个线程比不同进程中的两个线程切换要快③进程内的线程切换不用改变虚拟存储器的地址2.共享存储器:①并发服务器中的多个副本需要相互通信或者访问共享的数据②利用线程容易构造监控系统线程的缺点由于线程间共享存储器和进程状态,一个线程的动作可能对同一个进程内的其他线程产生影响。1.两个线程如果同一时刻访问同一个变量,会产生相互干扰2.将指针返回给一个静态的数据项的库函数不是线程安全的,覆盖将会导致错误3.缺乏健壮性,一个线程出错,服务器将会终止整个进程描述符、延迟和退出1.许多动态分配的资源都是和进程相关的①一个线程打开某个文件,同一进程的其他线程也可以使用同一个描述符访问文件②有些操作系统调用只会影响调用它的线程I/O调用阻塞,只影响调用它的线程;③有些系统调用会影响整个进程exit函数会让整个进程退出2.线程的退出方法①线程的顶级过程返回时终止该线程②调用pthread_exit终止该线程使用线程服务器实例1.多线程的ECHO服务①并发的面向连接的算法②连接到达后,调用pthread_create创建一个新的线程来处理连接。③新线程执行TCPechod过程。2.TCPmtechod.cpage110①线程处理函数②统计结构的互斥使用③互斥处理函数小结1.一些可能影响整个进程的系统函数(如exit)并发服务器可以在一个进程中用若干线程实现2.线程并发服务器的优点是:①上下文切换开销少②共享存储器3.缺点是:①增加了编程的复杂性②必须使用同步机制协调线程对全局变量和一些库程序的访问③必须弄清单线程并发服务器1.大多数并发服务器使用前面提供的两种方法,使用操作系统的设施创建独立的进程或者线程,利用分时来占用处理器2.使用单线程也可以提供表面上的并发性①为什么是可行的②什么时候比较好③如何实现服务器中的数据驱动处理1.对一个请求的响应中如果I/O占了主导地位,服务器可以使用异步I/O来实现表面并发性,使用数据触发处理。2.ECHO服务器①理论上是时间分片机制让多线程共享CPU②实际上是数据的到达控制了处理的进行a)每个从线程大部分时间花在read的阻塞上b)CPU要不减慢处理速率,必须运行足够快3.若并发服务器处理每个请求仅需要很少时间,可以由数据到达驱动。在工作量太大,以致CPU不能顺序执行的时候,分时机制才取而代之用单线程进行数据驱动处理1.理解单线程如何完成并发服务器任务①打开许多客户的TCP连接②线程阻塞等待数据的到达③任何一个连接上有数据到达,线程就被唤醒④处理请求,发送响应后,再次阻塞。2.同多线程或者多进程比较,可能处理略高些的负荷3.关键是使用OS的select原语实现异步I/O算法8.5列出了实现单线程服务器的线程结构单线程、并发服务器的线程和套接字结构一个执行线程管理所有的套接字用于单个连接的套接字用于连接请求的套接字服务器操作系统服务器应用进程单线程服务器的线程结构单线程服务器必须完成主线程和从线程双方的职责1.维护一组套接字2.组中某套接字绑定到接受连接的熟知端口上3.其它套接字对应一个连接4.服务器把这组套接字描述符作为一个参数传递给select,并等待任何一个套接字的活动5.使用描述符来区别主线程和从线程的操作①主套接字描述符准备就绪,使用主线程的操作②从套接字的描述符就绪,使用从线程的操作单线程服务器的技术基础1.文件描述符集fd_set通常用整数数组中的位域表示,数组元素的每一位对应一个文件描述符。例如,一个整数占32位,那么整数数组的第一个元素代表文件描述符0到31,数组的第二个元素代表文件描述符32到632.对描述符集进行操作:4个宏voidFD_SET(intfd,fd_set*fdset);//设置文件描述符集fdset中对应于文件描述符fd的位为1voidFD_CLR(intfd,fd_set*fdset);//清除文件描述符集fdset中对应于文件描述符fd的位为0voidFD_ISSET(intfd,fd_set*fdset);//检测文件描述符集fdset中对应于文件描述符fd的位是否被设置voidFD_ZERO(fd_set*fdset);//清除文件描述符集fdset中的所有位单线程服务器的技术基础举例:fd_setreadset;FD_ZERO(&readset);FD_SET(5,&readset);FD_SET(33,&readset);则文件描述符集readset中对应于文件描述符值5和33的相应位被置为1FD_CLR(5,&readset);则文件描述符集readset对应于文件描述符值5的相应位被置为0单线程服务器的技术基础3.select()系统调用:可以使进程检测同时等待的多个I/O设备,当没有设备准备好时,select()阻塞,其中任一设备准备好时,select()就返回组中某套接字绑定到接受连接的熟知端口上4.select()的调用形式:intselect(intmaxfd,fd_set*readfds,fd_set*writefds,fe_set*exceptfds,conststructtimeval*timeout);maxfd:文件描述符集中要被检测的比特数readfds:被读监控的文件描述符集writefds:被写监控的文件描述符集exceptfds:被例外条件监控的文件描述符集timeout:定时器。时间到,无论是否有设备准备好,都返回调用。单线程的ECHO服务器TCPmechod.cpage1181.在熟知端口上打开一个被动套接字2.使用系统函数getdtablesize来决定描述符最大个数3.使用FD_ZERO和FD_SET创建一个比特向量,对应于希望测试的套接字描述符4.select等待一个或者多个描述符就绪5.FD_ISSET测试哪个描述符就绪6.FD_CLR关闭连接后,从描述符组中删除小结1.并发服务器通常是数据驱动的,不是下层操作系统中的时间分片机制驱动的2.服务处理很少的情况下,单线程应用异步I/O管理多个连接,和多线程实现一样高校3.单线程实现中,一个执行线程完成了主线程和从线程的职责①一组描述符表②使用select函数4.ECHO服务器的例子
本文标题:第八讲并发服务器
链接地址:https://www.777doc.com/doc-1600353 .html