网站大量收购闲置独家精品文档,联系QQ:2885784924

_IO复用与套接字选项(_)new.ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
目录 I/O模型 I/O复用概述 Select函数 套接字选项和fcntl 非阻塞I/O 信号驱动I/O模型 I/O模型 linux下可用的i/o模型 阻塞i/o 非阻塞i/o i/o复用(select和poll) 信号驱动i/o(SIGIO) 异步i/o(posix.1的aio_系列函数) 举例:输入操作的不同i/o模型 一个输入操作一般有两个阶段 等待数据准备好 从内核到进程拷贝数据 阻塞I/O模型 最流行的i/o模型。缺省时,所有套接字都是阻塞的。 非阻塞I/O模型 当把一个套接字设置成非阻塞方式时,即通知内核:当请求的i/o操作不能马上完成时,不要阻塞进程,而应返回一个错误。 I/O复用模型 i/o复用模型调用select或poll,进程阻塞于这两个系统调用上,而不是阻塞于真正的i/o系统调用上。 信号驱动I/O模型 让内核在描述字准备好时用信号SIGIO通知进程。这种模型的好处是当等待数据报到达时,可以不阻塞。前提是允许套接口进行信号驱动i/o 。 异步I/O模型 异步i/o让内核启动操作,并在整个操作完成后(包括将数据从内核拷贝到应用进程的缓冲)通知我们。 五个I/O模型的比较 fcntl函数 fcntl()是标准系统调用,原意是用于对文件描述字进行各种控制操作,但后来可利用它对任何描述字进行控制操作,包括对套接字描述字。 #include fcntl.h int fcntl(int fd, int cmd, … /* int arg */); 每个描述字都有一组由命令F_GETFL取得和由命令F_SETFL设置的文件标志。 fcntl函数(续) 函数fcntl提供了以下关于网络编程的特性: 非阻塞i/o。我们可以通过F_SETFL命令设置O_NONBLOCK来设置套接字为非阻塞型; fcntl函数(续) 用fcntl来使能非阻塞i/o的典型代码: int flags; if ((flags = fcntl(fd, F_GETFL, 0)) 0) err_sys(“…”); flags |= O_NONBLOCK; //保留原始状态 if ((flags = fcntl(fd, F_SETFL, flags)) 0) err_sys(“…”); 关闭非阻塞标志方法: flags = ~O_NONBLOCK; //恢复为原始状态 if (fcntl(fd, F_SETFL, flags) 0) err_sys(“…”); 非阻塞I/O 缺省情况下,套接字是阻塞方式的。可能阻塞的套接字调用分成以下四类: 输入操作:read, readv, recv, recvfrom和recvmsg函数。如果在一个阻塞的tcp套接字上调用这些函数,而且在套接字接收缓冲区中没有数据(或者没有满足条件的数据),进程将在数据到来前睡眠。到来的数据可以是一个字节,也可以是一个tcp分节。阻塞udp套接字将在一个udp数据报到来之前一直处于睡眠状态(在没有设置接收超时的前提下)。(但,在一个非阻塞套接字上,如果输入操作不能被满足,它们会立即返回一个EWOULDBLOCK错误)。 非阻塞I/O(续) 输出操作:write, writev, send, sendto和sendmsg函数。当tcp阻塞套接字从应用进程缓冲区向套接字发送缓冲区拷贝数据,如果发送缓冲区没有空间,进程会一直睡眠到腾出空间(没有设置超时)。对于一个非阻塞套接字而言,上述情况会立即返回一个EWOULDBLOCK错误。由于udp套接字没有发送缓冲区,内核只是拷贝应用进程数据并将其向协议栈下层传递。因此在一个阻塞udp套接字上的输出操作并不会阻塞。 接收外来的连接:accept函数。如果在一个阻塞套接字上调用accept函数,而且没有新的连接,进程会进入睡眠状态(没有设置超时)。如果在一个非阻塞套接字上调用accept,而且没有新的连接,将返回EWOULDBLOCK错误。 非阻塞I/O(续) 初始化外出的连接:用于tcp的connect函数(udp尽管也可以connect,但不是建立一个真正的连接,而仅仅是让内核保存对方的IP和端口号),tcp的连接建立总会使调用进程阻塞起码到服务器的一次往返时间RTT。如果在一个非阻塞的tcp套接字上调用connect,而且连接不能马上建立,连接的建立过程将开始,但返回一个EINPROGRESS错误。 I/O复用概述 问题:并发服务器为多个客户服务: 避免服务器的服务被阻塞,采用并发服务 并发服务器:创建多个描述字,多进程或线程提供服务,这种方法会增加开销。 为每个连接套接字提供一个单独的服务实体(进城或线程),有没有一种没有过多开销的方式呢? 一个服务实体,但能同时为多个连接提供服务? I/O复用的

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档