- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9讲 并发服务器
并发服务器概述 并发的面向连接的服务器 采用算法8.4的最常用的服务器设计 主服务器进程在机器启动的时候自动一直运行,对每个客户的新连接创建一个新的从线程/进程进行处理 并发ECHO的例子 多线程设计的并发服务器 单线程的并发服务器 并发ECHO 功能:客户打开到某个服务器的连接,然后在该连接上重复发送数据,并读取从服务器返回的回显,服务器响应每个客户,接受连接,读取来自该客户的数据,并原样返回给客户。 服务器在发送响应前并非读取全部输入,只是交替读写 服务器在遇到文件结束的条件后,关闭连接 循环与并发实现的比较 如果使用循环服务器实现 某些客户可能发送大量的数据,导致其他的客户延迟 使用并发服务器实现 避免了长时间的延迟,不允许单个客户占用所有的资源 使服务器与许多客户同时进行通信 客户感觉服务器提供了较短的响应时间 进程结构 服务器包括一个主进程,以及零个或者多个从进程。每个进程一个线程 主服务器使用accept阻塞调用,节约CPU资源,连接到来的时候,accept马上返回。 并发ECHO服务器举例 #include 语句 变量定义,宏定义,函数声明 主函数 参数处理 建立被动套接字 循环等待连接,如果有新连接,则fork一个新的线程,调用TCPechod进行处理 TCPechod函数 处理echo服务 清除游离进程 使用fork的服务器动态生成进程,可能导致不完全的进程终止 linux在一个子进程退出的时候,会给父进程一个信号(signal) 正在退出的进程保持在死状态,直到父进程执行wait3系统调用为止 signal(SIGCHLD, reaper)主服务器进程收到子进程退出信号的时候,执行函数reaper 函数reaper调用函数wait3完成子进程的终止并退出。 参数WNOHANG指明wait3不要为了进程退出而阻塞等待 小结 面向连接的并发技术 使用多进程的方式实现:fork 主进程的线程永远不会和任何客户打交道,只接受连接,创建一个从进程处理各个连接 从进程从主进程调用fork后立即执行 主进程关闭新连接所用的描述符的副本 从进程关闭主描述符的副本 使用线程来实现并发 一个进程中有一个或者多个线程 linux中的线程符合POSIX线程标准,1003.1c linux中线程的特点 动态创建:pthread_create,具有上限 并发执行:多处理机上可以并行 抢先:系统自动在多个线程中调动CPU资源 私有局部变量:每个线程有自己的私有堆栈 共享全局变量:一个进程的所有线程共享全局变量 共享文件描述符:一个进程内的所有线程共享一组文件描述符 协调和同步函数:具有线程协调和同步执行的函数 线程的优点 多线程的进程和单线程的进程比较 更高的效率:上下文交换的额外开销减少 上下文交换:线程切换需要执行的指令 同一进程中的两个线程比不同进程中的两个线程切换要快 进程内的线程切换不用改变虚拟存储器的地址 共享存储器: 并发服务器中的多个副本需要相互通信或者访问共享的数据 利用线程容易构造监控系统 线程的缺点 由于线程间共享存储器和进程状态,一个线程的动作可能对同一个进程内的其他线程产生影响。 两个线程如果同一时刻访问同一个变量,会产生相互干扰 将指针返回给一个静态的数据项的库函数不是线程安全的,覆盖将会导致错误 缺乏健壮性,一个线程出错,服务器将会终止整个进程 描述符、延迟和退出 许多动态分配的资源都是和进程相关的 一个线程打开某个文件,同一进程的其他线程也可以使用同一个描述符访问文件 有些操作系统调用只会影响调用它的线程 I/O调用阻塞,只影响调用它的线程; 有些系统调用会影响整个进程 exit函数会让整个进程退出 线程的退出方法 线程的顶级过程返回时终止该线程 调用pthread_exit终止该线程 线程的协调与同步 线程协调和同步是必要的 线程可能被阻塞。 线程的同步机制:互斥,信号量,条件变量 互斥 对共享数据的排他性访问 pthread_muetx_init, pthread_mutex_lock, pthread_mutex_unlock 信号量:同步机制 用于系统中有N个资源可用的情况允许N个线程同时执行使用 sem_init,sem_wait, sem_post 条件变量 最复杂和难以理解的一种同步机制 一组线程使用互斥对同一个资源提供排它性访问。 一旦某个线程获得资源,它需要等待一个特定的条件发生 pthread_cond_wait: 同时指定了等待的条件变量和所拥有的互斥,执行后阻塞。 pthread_cond_signal只允许一个线程继续执行 pthread_cond_broadcast允许多个线程继续执行 等待条件变量的时候要暂时放弃互斥 得到条件变量的时候自动重新获得互斥 使用线程服务器实例
文档评论(0)