8SOCKET-IO复用技术

8SOCKET-IO复用技术

ID:1072660

大小:471.00 KB

页数:30页

时间:2017-11-07

8SOCKET-IO复用技术_第1页
8SOCKET-IO复用技术_第2页
8SOCKET-IO复用技术_第3页
8SOCKET-IO复用技术_第4页
8SOCKET-IO复用技术_第5页
资源描述:

《8SOCKET-IO复用技术》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第八章IO复用技术本章目标IO复用基本概念select函数I/O复用如果一个或多个I/O条件满足(例如:输入已准备好被读,或者描述字可以承接更多输出的时候)我们就能够被通知到,这样的能力被称为I/O复用,是由函数select和poll支持的I/O复用网络应用场合当客户处理多个描述字一个客户同时处理多个套接口如果一个tcp服务器既要处理监听套接口,又要处理连接套接口如果一个服务器既要处理TCP,又要处理UDP五个I/O模型阻塞I/O非阻塞I/OI/O复用(select和poll)信号驱动I/O异步I/O阻塞I/O模型最流行的I/O模

2、型是阻塞I/O模型,缺省时,所有的套接口都是阻塞的进程阻塞于recvfrom的调用应用进程recvfrom系统调用内核无数据准备好数据报准备好拷贝数据拷贝完成处理数据报返回成功指示等待数据将数据从内核拷贝到用户空间非阻塞I/O模型(2-1)当我们把一个套接口设置为非阻塞方式时,即通知内核:当请求的I/O操作非得让进程睡眠不能完成时,不要让进程睡眠,而应返回一个错误非阻塞I/O模型(2-2)应用程序连续不断地查询内核,看看某操作是否准备好,这对cpu时间是极大的浪费,一般只在专门提供某种功能的系统中才会用到系统调用系统调用recvf

3、rom等待返回成功指示(轮询)应用进程recvfrom内核无数据报准备好EWOULDBLOCKrecvfrom系统调用无数据准备好EWOULDBLOCKrecvfrom系统调用数据报准备好拷贝数据报等待数据将数据从内核拷贝到用户空间拷贝完成处理数据报返回成功提示I/O复用模型有了I/O复用,我们就可以调用select或poll,在这两个系统调用的某一个上阻塞,而不是真正阻塞于真正的I/O系统调用进程受阻于select调用,等待可能多个套接口中的任一个变为可读数据拷贝到应用缓冲区期间进程阻塞应用进程select系统调用内核无数据准备

4、好返回可读条件数据报准备好recvfrom系统调用拷贝数据报拷贝完成返回成功提示处理数据报等待数据将数据从内核拷贝到用户空间信号驱动I/O模型我们也可以用信号,让内核在描述字准备好时用信号SIGIO通知我们,我们将此方法称为信号驱动I/O进程继续执行数据拷贝到应用缓冲区期间进程阻塞应用进程建立SIGIO的信号处理程序系统调用sigaction内核信号处理程序递交SIGIO数据报准备好recvfrom系统调用拷贝数据报拷贝完成返回成功指示处理数据报等待数据将数据从内核拷贝到用户空间返回异步I/O模型异步I/O是Posix.1的199

5、3版本中的新内容,我们让内核启动操作,并在整个操作完成后通知我们进程继续执行应用进程aio_read系统调用内核无数据准备好数据准备好拷贝数据报拷贝完成将数据从内核拷贝到用户空间等待数据信号处理程序处理数据报递交在aio_read中指定的信号select函数作用这个函数允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定的时间后才唤醒进程select函数什么情况下返回作为一个例子,我们可以调用函数select并通知内核仅在下列情况发生时才返回:集合{1,4,5}中的任何描述子准备好读或集合{2,7}中的

6、任何描述字准备好写或集合{1,4}中的任何描述字有异常条件待处理或已经过了10.2秒也就是说,通知内核我们对哪些描述字感兴趣(读、写或异常条件)以及等待多长时间。select函数包含头文件功能:提供了即时响应多个套接的读写事件原型:intselect(intmaxfdp1,fd_set*readset,fd_set*writeset,fd_set*except,conststructtimeval*timeout);参数maxfdp1:等待最大套接字值加1readset:要检

7、查读事件的容器writeset:要检查写事件的容器timeout:超时时间返回值:返回触发套件接字的个数timeval结构虽然结构timeval为我们指定了一个微秒级的分辨率,但内核支持的分辨率却要粗糙得多。例如,很多UNIX内核将超时值向上舍入成10ms的倍数。另外还有调度延迟现象,即定时器时间到后内核还需花一点时间调度相应进程的运行structtimeval(longtv_sec;//秒longtv_usec;//微秒);timeout参数timeout参数有三种可能永远等待下去:仅在有一个描述字准备好I/O时才返回,为此,我

8、们将timeout设置为空指针等待固定时间:在有一个描述字准备好I/O是返回,但不超过由timeout参数所指timeval结构中指定的秒数和微秒数根本不等待:检查描述字后立即返回,这称为轮询。定时器的值必须为0fd_set参数select使用描述

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。