第三章_socket多路-2.ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章_socket多路-2

网络软件设计 并发服务与重复服务 Concurrent Service Repeating Service 1、基本思想 1.1 重复服务 仅使用一个服务器进程依次为每个用户服务 基本思想 1.2并发服务 利用多个进程“同时”为各用户请求服务 基本思想 1.3两种服务方式的比较 程序结构 重复服务:轮询 并发服务:主、子进程,同时并发 系统效率 查询的效率 进程调度,上下文切换的开销 实现的难易度,特别在多个用户接入的情况 例,用户接入系统输入用户名,口令 重复服务必须统一管理每个套接字的通信状态 并发服务下,一个线程(进程)一般只对应一个套接字,不需要统一管理,但涉及线程的控制 2、实现 2 重复服务方式的实现 2.1非多路复用 重复服务实现 2 重复服务方式的实现 2.2多路复用--select() 重复服务实现 2.3 重复服务多路复用流程 并发服务实现 3 并发服务方式的实现 3.1 并发服务程序流程 并发服务实现 3.2 UNIX并发服务的实现 3.2.1fork() 并发服务实现 并发服务的实现 执行结果 并发服务的实现 3.2.2 fork() 与并发服务 并发服务的实现 并发服务的实现 3.2.3进程的分离 新进程执行与父进程不同的代码 利用fork()的返回值。 fork()后,父进程得到的返回值为子进程标识符 fork()后,子进程得到的返回值为0 为新进程更换代码 fork(); execve(); 并发服务的实现 利用fork返回值分离进程 并发服务的实现 并发服务的实现 用execve()替换子进程代码 可以使子进程具有与父进程不同的代码 并发服务的实现 并发服务的实现 3.3 Windows并发服务的实现 CreateThread--生成线程 CreatePorcess--生成进程 线程执行指定的代码段 线程之间并发执行 与UNIX下的fork()+execve方法类似 相关知识:线程与进程的区别和联系 并发服务的实现 3.3.1 CreateThread 并发服务的实现 并发服务的实现 3.3.2 主进程代码 并发服务的实现 3.3.3 线程代码 小结 并发服务机制具有多路复用功能 并发执行的进程/线程同时为多条连接服务 并发服务与上下文切换 在并发执行的进程间调度,需要消耗系统资源 多路复用的实现方法 事件驱动的重复服务--select 生成子进程的并发服务 并发服务实验 实验目的 编写并发服务机制的服务器程序,感受多线程并发服务的效果 实验原理与方法 并发服务具有多路复用特点 通过执行程序感受 通过spy查找线程存在的证据 实验过程 1、完成程序,将连接建立后的通信程序段作为一个函数调用,以方便对比实验 2、不建立线程,服务器程序是否能提供多路复用 3、建立线程,服务器程序能否提供多路复用 4、利用Spy查看线程,是否能找到多个服务器线程,当有n个客户与服务器建立了连接,服务器线程数为 性能瓶颈 每个线程或者进程只能监听一个连接 如果要处理成千上万个连接? 一个线程能够处理64个连接,多开一些线程或者进程就能够提高并行处理能力 3.4 节的基本想法 使用WSAEventSelect函数,在一个线程中最多可以同时侦听64个socket 同时开多个线程来增加处理能力。 在主线程中 监听socket,每新到一个连接请求, 分配到一个有能力的线程中,如实在找不到则新建一个线程。 在线程中实现多个socket的通信任务 数据结构 建立一个线程列表 每一个threadobj记录一个线程的工作信息 如图3.2所示 Event数组:每个线程侦听的socket都要与一个event关联。 Psocket链表:线程侦听的socket 表。 Nsocketcount:线程侦听的连接数目 见教材程序 * 段景山 * 制作 主讲 段景山 s = socket( SOCK_STREAM); bind(s,…); listen(s,5); while(1){ ns = accept(s,…); recv(ns,…); send(ns,…); closesocket(ns); } closesocket(s); 监听 套接字 连接服务 套接字 连接服务 套接字 连接服务 套接字 循环—重复 主进程 子进程 1 子进程 2 监听 套接字 创建 连接服务 套接字 连接服务 套接字 相关知识 进程 线程 并发 并行 多任务系统调度 *单CPU系统 监听到连接 s = socket( SOCK_STREAM); bind(s,…); listen(s,5); while(1){ ns = accept(s,…); recv(ns,…); send(ns,…); closesocket(ns); } closesocket(s);

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档