网络编程之异步IO - 计算机科学系Department of Computer Science.pptVIP

网络编程之异步IO - 计算机科学系Department of Computer Science.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络编程之异步IO - 计算机科学系Department of Computer Science

异步IO 计算机网络实验课 两种模式 阻塞模式 非阻塞模式 阻塞模式 套接字创建时,默认工作在阻塞模式下。例如对于recv函数的调用会使程序进入等待状态,直到接收到数据才返回 使用阻塞模式时,需要处理多个套接字连接时,就必须创建多个线程,即一个连接使用一个线程 One thread per client 阻塞模式为什么一定是One thread per client? 考虑一个线程正在等待接收数据,却有别的客户在申请连接。。。 One thread per client 优点 简单,并且在用户数量为a few tens的时候,是响应速度最快的一种模型 缺点 扩展性不好 1)每一个线程都要消耗系统资源 2)系统在线程间切换需要花费时间 当more than a few tens的线程同时运行时,因素2)首先影响系统性能,线程进一步增加时,因素1)的作用也会越来越明显 Thread的理论值 从资料来看,每一个线程默认分配的堆栈是1M 每一个用户进程最大的可用地址空间是2G 所以理论上默认的线程数量是2000 限制堆栈大小之后,例如4K,出现了另外一个地址空间分配粒度的问题,最小为64K,所以最多线程数约13000. 注意到还有一些系统DLL等需要占用内存 阻塞模式小结 One thread per client 主要问题是系统性能受影响 线程的数量限制不是主要因素 为了开发高效的服务器程序,我们需要使用非阻塞模式 非阻塞模式 非阻塞模式下,执行I/O的函数调用send和recv会马上返回 大多数情况下,调用后返回的是出错代码 WSAWOULDBLOCK,该代码意味着请求的操作在调用期间没有完成 例如,系统输入缓存中没有待处理的数据,那么执行recv会返回WSAWOULDBLOCK 非阻塞模式 关键的问题在于确定套接字什么时候可读可写,或者说确定套接口上的可读可写网络事件何时发生。。。 可以使用Winsock提供的各种不同的I/O模型 非阻塞小结 结合对One thread per client的讨论,我们看到非阻塞模式主要解决的问题在于 如何在使用尽量少的线程的条件下,接受尽可能多的并发用户连接。。。 异步I/O——Select-1 使用了一个数据结构 typedef struct fd_set { u_int fd_count; SOCKET fd_array[FD_SETSIZE]; } fd_set; 其中fd_count指名了fd_array中有多少套接字;fd_array是存放套接字的数组; 有几个相关宏 FD_ZERO( *set); FD_CLR(s, *set); FD_ISSET(s, *set); FD_SET(s, *set); 需要主动把套接字设置为非阻塞模式 Ioctlsocket(); 异步I/O——Select-2 int select ( int nfds, //忽略,为了兼容 fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout ); readfds: 指向套接字集合,检查其中套接字的可读性。相应writefds为检查可写性。最后的exceptfds用于查错。 Timeout参数设置为0表示无限等待,直到有网络事件发生 异步I/O——Select-3 用法示例 假设已经生成了socket sListen; 声明套接字集合 fd_set fdSoket; 初始化该集合 FD_ZERO(fdSoket); 放入第一个套接字 FD_SET(sListen, fdSoket) 声明用于Select函数的套接字集合 fdRead= fdSoket; 使用Select函数 select(0, fdRead, NULL, NULL, NULL); 异步I/O——Select-4 当select函数返回时,意味着发生了某些网络事件 我们传递给select函数不同的套接字集合时,select返回后意味着发生了不同的网络事件 如果我们传递了readfds指针,则有新的连接请求、数据可读、连接关闭/重启/中断等事件时返回; 如果我们传递了writefds指针,则连接成功(调用connect)、数据可写的时候返回; 如果我们传递了exceptfds指针,则当连接失败(调用connect) 、OOB数据可读时返回; 异步I/O——Select-5 操作步骤 初始化套接字集合fdSocket,向该集合添加监听套接字 将fdScoket集合的拷贝传递给select函数,当有事件发生时,select函数移除fdRead集合中

文档评论(0)

hf916589 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档