第6章网络服务器的设计模式

第6章网络服务器的设计模式

ID:32641705

大小:94.35 KB

页数:22页

时间:2019-02-14

第6章网络服务器的设计模式_第1页
第6章网络服务器的设计模式_第2页
第6章网络服务器的设计模式_第3页
第6章网络服务器的设计模式_第4页
第6章网络服务器的设计模式_第5页
资源描述:

《第6章网络服务器的设计模式》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、第6章网络服务器的设计模式6.1概述第3章和第4章中讨论的是最基本的TCP服务器和UDP服务器:串行单用户服务器,木章将讨论服务多客户的服务器的设计模式。因为大多数网络服务器都是多进程或多线程应用,因此在讨论服务器的设汁模式之前先介绍进程和线程的基本概念、编稈接口以及稈序设计方法。6.2多进程环境下的网络编程6.2.1进程的基本概念在传统的多任务系统中,“进程”是一个很重要的概念,在系统中进程是程序执行的实体,它由一组机器指令(也称为“正文”)、数据以及堆栈组成。当一个进程需要由另一个实体执行某项任务时,该进

2、程就派生(fork)—个子进程,让子进程去进行处理。当一个程序按多任务组织时,在多任务操作系统核心的调度下,系统中许多进程在并发执行,这些进程是同一程序的不同体现。每个进程按自己的一系列指令严格执行,各进程Z间的指令空间是独立的,不用跳转到另外的进程去,它只会读写自己的数据与堆栈,不能去读写另外进程的数据和堆栈。进程通过系统调用与其它进程和外界通信。采用多进程的方式來实现处理多任务的程序主要有以下不足之处:(1)用fork()创建子进程代价比较高。操作系统需要将父进程的内存映象拷贝到子进程,同时还要复制所有打

3、开的描述符等数据。(2)父进程与子进程之间的信息交换需要用到进程间通信(IPC),如共享内存(SharedMemory),报文队列(MessageQueue),管道(Pipe),甚至网络通信等。这种通信的代价要比同一地址空间内的变量共享要高得多。采用线程可以解决上面的问题。6.2.2多进程下的网络编程Unix系统屮派生新进程的唯一的方法是调用fo「k()函数。该函数的原型如下所示:#includepid_tfork(void);fork函数的一个最重要的特性是:调用一次,如果调用成功则返回

4、两次:在调用进程(父进程)中,它返回一次,返回值为新派生的子进程的进程ID号,父进程需要通过它來区别不同的子进程;在新派生的子进程中还返回一次,返回值为0,子进程可以通过getpid获取父进程的进程ID。如果函数调用失败,则只在调用进程中返回・1。fork函数的两个典型应用是:(1)一个进程在处理一个操作吋,同吋还需要处理另一个操作,这吋,进程就派生一个子进程來执行该任务。大多数网络服务器就是这种应用的典型代表。(2)一个进程在执行过程中,想执行另一个程序,它就通过fork产生一个自己的副本(子进程)。再由子

5、进程调用exec序列函数来代替自己去执行新程序。shell程序屮常采用这种方式。在网络服务器中,最常见的使用fork函数的工作方式是:父进程调用accept,当客户连接到达‘accept成功返回时,调用fork派生一个子进程。然后,父进程关闭accept返回的已连接描述符,继续在监听描述符上调用accept等待下一个连接请求。而子进程则关闭父进程使用的监听描述符,使用accept返回的已连接描述符进行读写操作。上述过程可以用下面的程序來表示:/*其它变量定义*/intsockfd,connfd;pid_tpi

6、d;sockfd=socket(...);/*创建一个新的插口*//*设置服务器地址结构变量代码*/bind(sockfd,...);/*将服务器插口绑定到本地地址和端口*/listen(sockfd,n);for(;;){connfd=accept(sockfd,...);/*阻塞等待*/if((pid=fork())==0)/*if屮的代码只在子进程屮的执行*/{close(sockfd);/*子进程关闭父进程使用的监听插口描述符*//*通过connfd读写操作,任务处理*/close(connfd);e

7、xit(0);}if(pid==-1)prinf(4<调用fork()派生子进程失败!”);close(connfd);/*在父进程中关闭子进程使用的已连接描述符*/}程序6-1典型的调用fork的网络服务器程序结构下面我们来讨论为什么要在父进程屮关闭已连接描述符,而在子进程屮要关闭监听描述符,以及这样的做法不会造成不良后果的原因。当一个描述符正被某一进程使用,又被另一进程打开时,并不是真的创建新的内存I结点,而只是将该描述符的引用数加1。调用fork()派生的子进程将继承父进程的所有打开的描述符(相当于

8、子进程中又打开了一次),所以成功调用fo「k()后,父进程打开的所有描述符的引用数都将加k在程序6-1中,父进程调用close关闭子进程使用的已连接插口时,它只是将描述符connfd的访问计数值减1。由于connfd的访问计数值仍然大于0,所以父进程中的这个close调用并没有使得内核启动TCP的四分组连接终止序列。因而不会影响子进程屮对connfd的读写操作。同样子进程中的close调用也没有关闭

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。