- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
超越基本的套接字编程2
第六章 超越基本的套接字编程 多任务处理(1) 前面所讲的服务器一次只能处理一个客户。当一个客户已经在接受服务时,如果其他的客户要求连接,必须等待处理完第一个客户的请求之后,才会处理第二个客户的请求。 这种类型的套接字应用称为迭代服务器,迭代服务器最适合于每个客户只需要服务器做少量、有限工作的应用。 多任务处理(2) 如果处理客户所需要的时间很长,迭代服务器的服务质量就变得很差,这时必须采用多进程或多线程方式来设计服务器。 下面将探讨并发服务器的多种模型。 每个客户一个进程 每个客户一个线程 受限的多任务处理 多任务处理(3) 进程是一个程序的一次执行过程,程序的每一次运行中得副本都有其自己的进程。 程序就是进程的一种静态描述。 在同一个进程内部又可以将进程分解为若干线程。 Linux系统中的线程所具有的最大特点是:线程的调用是由系统内核调度程序来实现的,每一个线程都具有自己的进程号。 线程消耗的系统资源较少,相互间的通信也比较容易实现。 每个客户一个进程(1) 进程是在同一台主机上独立执行的程序。 在每个客户一个进程的服务器中,对于每个客户的请求,独立地创建一个新的进程来处理通信。进程共享服务器主机的资源,每个服务器主机并发地为其客户提供服务。 在Unix中,fork用于创建新的进程,创建失败返回-1,成功则会创建一个新的进程,在父进程中fork成功返回子进程ID,在子进程中fork返回0. 每个客户一个进程(2) 要创建一个进程,使用fork函数 pid_t fork(void); 系统创建一个与当前进程相同的新的进程。它与原有的进程具有相同的数据、连接关系和在程序同一处执行的连续性。 通常将原有进程称为父进程,新进程称为子进程。 fork调用将执行两次返回,从父进程返回时返回值是父进程的PID,从子进程返回时返回值为0,并且返回都将执行fork之后的语句。 SetupTCPServerSocket() AcceptTCPConnection TCPEchoServer-Fork.c 每个客户一个线程(1) 把新进程进行分叉以处理每个客户的工作,但这样做得代价很高。每次创建一个进程时,操作系统都必须复制父进程的全部状态,包括:内存、栈、文件、套接字描述符等。 线程通过允许在同一进程内进行多任务处理而减小了这种代价:新创建的线程只是简单地共享与父线程相同的地址空间,而无需复制父线程的状态。 每个客户一个线程(2) 创建线程的函数为: #include pthread.h int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_rouline)(void *), void *arg); 此函数用于创建一个新的线程并将其标识符放入参数thread指向的新线程中。attr是线程属性, start_rouline是指向线程函数的指针,arg为传给线程的参数。 TCPEchoServer-Thread.c 受限的多任务处理(1) 创建进程和线程都会引发开销,此外在许多进程和线程当中进行调度和环境切换也会导致系统做额外的工作。随着进程和线程数量的增加,操作系统可能最终无法承受这样的开销。 通过限制服务器创建的进程数量来确保服务器的稳定性,这样的服务器称为共享型并发服务器(受限的多任务服务器)。 受限的多任务处理(2) 解决方案思路: 服务器首先创建、绑定和侦听套接字,然后服务器创建一组固定数量的处理进程(n个),其中每个进程都会持续不断地循环,接受来自相同的侦听套接字上的连接。 在建立连接之前,处理进程均阻塞,然后系统选择一个进程,并在该进程返回用于此新连接的套接字描述符。其他进程将保持阻塞,直到下一个连接建立为止。 在n个进程均处于忙时,将会怎么样?请同学们思考。 TCPEchoServer-ForkN.c 多路复用(1) 迄今为止,我们的程序是通过一条信道处理I/O;我们的应答服务器的每个版本一次都只处理一条客户连接。不过,通常的情况是:应用程序需要能够同时在多条信道上执行I/O。 可以创建多个套接字,每个套接字使用不同的端口号,但这时不能使用阻塞型的函数,为此可以使用select函数实现异步的套接字编程。 select函数(1) 对于初学Socket的人来说都不太爱用Select写程序,习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回) 使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一
文档评论(0)