版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、7.1 I/O复用概述7.2 五种I/O模型7.3 select系统调用7.4 poll系统调用7.5 epoll系统调用7.6 三种系统调用对比例子: read标准输入和套接字只能阻塞在一处,不能及时获得I/O就绪条件进程需要一种同时能监测多个描述符状态的服务。即进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪,它就通知进程,这种能力称为I/O复用(I/O multiplexing)I/O复用使得系统在单线程的情况下同时支持处理多个请求。和多线程/进程比较,I/O复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。IO复用常
2、见的应用场景: 客户程序需要同时处理交互式的输入和服务器之间的网络连接; 客户端需要对多个网络连接作出反应; 服务器需要同时处理多个处于监听状态和多个连接状态的套接字; 服务器既要处理TCP,又要处理UDP; 服务器需要处理多种网络协议的套接字。IO复用的基本思想: 先构造一张或多张包含所有需要等待的描述符的表,然后调用一个函数,它要到这些描述符中的一个或多个已准备好进行I/O时才返回。在返回时,它告诉进程哪一个描述符已准备好可以进行I/O。7.2.1 阻塞IO模型7.2.2 非阻塞IO模型7.2.3 IO复用7.2.4 信号驱动IO模型7.2.5 异步IO模型阻塞IO是最通用的IO类型,使用
3、这种模型进行数据接收的时候,在数据没有到之前程序会一直等待。例如对于函数recvfrom(),内核会一直阻塞该请求直到有数据到来才返回。accept、send、recv、connect可能被阻塞进程阻塞于recvfrom的调用recvfrom应用进程应用进程内核内核无数据报准备好系统调用处理数据报拷贝完成系统调用数据报准备好拷贝数据报等待数据将数据从内核拷贝到用户空间当把套接字设置成非阻塞的IO,则对每次请求,内核都不会阻塞,会立即返回;当没有数据的时候,会返回一个错误。例如对recvfrom()函数,前几次都没有数据返回,直到最后内核才向用户层的空间复制数据。非阻塞IO通常和其它的IO通知机
4、制一起使用。进程阻塞于recvfrom的调用recvfrom应用进程应用进程内核内核无数据报准备好系统调用处理数据报拷贝完成系统调用数据报准备好拷贝数据报等待数据将数据从内核拷贝到用户空间EWOULDBLOCKrecvfrom无数据报准备好系统调用EWOULDBLOCKrecvfrom系统调用fcntl(s, F_SETFL, O_NONBLOCK);linux提供select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select或poll而不是真正的IO调用上;这样select/poll可以帮我们侦测许多fd是否就绪。数据拷贝到应用缓冲区期间,进程阻塞s
5、elect应用进程应用进程内核内核无数据报准备好系统调用处理数据报拷贝完成系统调用数据报准备好拷贝数据报等待数据进程阻塞于select系统调用,等待可能多个套接字中的任一个变为可读或可写返回可读条件recvfrom系统调用将数据从内核拷贝到用户空间首先开启套接口信号驱动I/O功能, 并通过系统调用sigaction安装一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据报准备好被读时,就为该进程生成一个 SIGIO信号。随即可以在信号处理程序中调用recvfrom来读数据报。应用进程应用进程内核内核将数据从内核拷贝到用户空间告知内核启动某个操作,并让内核在整个操作完成后(
6、包括将数据从内核拷贝到用户自己的缓冲区)通知应用。与信号驱动模型的主要区别是:信号驱动I/O:由内核通知应用何时可以启动一个I/O操作;异步I/O模型:由内核通知应用I/O操作何时完成。进程继续执行aio_read应用进程应用进程内核内核无数据报准备好系统调用信号处理程序处理数据报拷贝完成递交在aio_read中指定的信号数据报准备好拷贝数据报等待数据将数据从内核拷贝到用户空间返回阻塞式I/O、非阻塞式I/O、 I/O复用、信号驱动式I/O在数据从内核复制到调用者的缓冲区期间,进程阻塞于recvfrom调用,这四种都是同步I/O模型阻塞i/o非阻塞i/oi/o复用信号驱动i/o异步i/o发起
7、阻 塞完成检查检查检查检查检查检查 阻 塞完成检查 阻 塞就绪发起 阻 塞完成通知发起 阻 塞完成发起完成等待数据将数据从内核拷贝到用户空间函数select()的原型如下:#include #include #include #include int select(int nfds, fd_set*readfds, fd_set*writefds, fd_set*exceptfds, struct timeval*timeout);返回:准备好描述字的总数量,0:超时,-1:出错,大于0:总的位数int select(int nfds, fd_set*readfds, fd_set*write
8、fds, fd_set*exceptfds, struct timeval*timeout);参数timeout指定内核等待的时间,其结构如下:struct timeval long tv_sec;/* seconds */longtv_usec; /* microseconds */ 结构timeval指定了秒数和微秒数。但内核支持的分辨率却要粗糙得多,因此,定时并不精确。另外,如果select的三个测试指针为空,将提供一个比函数sleep更为精确的定时器(sleep睡眠以秒为最小单位)。根据timeout的设置select函数有三种执行结果: 永远等待下去:仅在有一个或以上描述字准备好i/
9、o才返回,为此,我们将timeout设置为空指针。 等待固定时间:在有一个描述字准备好时返回,但不超过由timeout参数指定的秒数和微秒数。 根本不等待,检查描述字后立即返回,这称为轮询。这种情况下,timeout必须指向结构timeval,且定时器的值必须为0。在前两种情况的等待中,如果进程捕获了一个信号并从信号处理程序返回,那么等待一般被中断。int select(int nfds, fd_set*readfds, fd_set*writefds, fd_set*exceptfds, struct timeval*timeout);select的三个描述字集合分别指示不同测试类型的描述字
10、集合(读、写、异常描述字),如当select函数返回时,readfds将清除其中不可读的文件描述符,只留下可读的文件描述符。对描述字集合的操作主要有以下四个宏:void FD_ZERO(fd_set *fdset);/* clear all bits in fdset ,清除*/void FD_SET(int fd, fd_set *fdset); /* turn on the bit for fd in fdset ,加入*/void FD_CLR(int fd, fd_set *fdset); /* turn off the bit for fd in fdset ,取出*/int FD_
11、ISSET(int fd, fd_set *fdset); /* is the bit for fd on in fdset ,测试*/,int select(int nfds, fd_set*readfds, fd_set*writefds, fd_set*exceptfds, struct timeval*timeout);使用select函数需重点注意的几个问题: nfds比所有文件描述符集合中的最大描述字大1,如:需等待的描述字为1,4,5,其nfds就应该是6。 对集合初始化是很重要的,如果集合作为一个自动变量分配而未初始化,那将导致不可预测的后果。每次每次调用select前都必须对
12、等待描述字集合完成初始化和设置工作。套接字可读的条件主要有: 套接字接收缓冲区中的数据字节数大于等于套接字接收缓冲区低水平标记的当前值(有数据可读); 套接字是一个监听套接字且已完成的连接数为非0。 如果对方tcp发送一个FIN(对方进程终止),套接字就变为可读且read返回0; 有一个套接字错误待处理,读操作返回-1,同时设置errno。接收和发送低水平标记的目的是:在select返回可读或可写条件之前,应用进程可以对有多少数据可读或有多大空间可写进行控制。套接字可写的条件主要有: 套接字发送缓冲区的可用空间大于等于套接字发送缓冲区的低水平标记(有可用于写的空间); 套接字的写这一半关闭,对
13、套接字的写将产生SIGPIPE信号; 有一个套接字错误待处理套接字的异常条件: 套接字带外数据的到达;Select()函数实现I/O多路复用的步骤: 清空描述符集合; 建立需要监视的描述符与描述符集合的联系; 调用select()函数; 检查所有需要监视的描述符,利用FD_ISSET宏判断是否已准备好; 对已准备好的描述符进行I/O操作。函数select()监视标准输入是否有数据输入,所设置的超时时间为5s。如果select()函数出错,则打印出错信息;如果标准输入有数据输入,则打印输入信息;如果等待超时,则打印超时信息。基于select的单进程多并发服务器程序服务器allset,关注的描述符
14、集合rset,提交给select的描述符集合select更新allset客户端客户端Client数组select监听套接字可读否?Accept将连接套接字置入allset和client中还有套接字可读否检查其它的连接套接字客户终止处理客户还有套接字可读否清理客户是是是否否否是否阻塞Poll系统调用和select类似,也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪者。其原型如下:#include int poll(struct pollfd*fds, nfds_t nfds, int timeout);1)fds参数是一个pollfd结构类型的数组,它指定所有我们感兴趣的文件描述
15、符上发生的可读、可写和异常等事件。Pollfd结构体定义如下: struct pollfd int fd; /文件描述符 short events; /注册的事件 short reevents;/实际发生的事件,由内核填充 事件说明POLLIN普通或优先级带数据可读POLLRDNORM普通数据可读POLLRDBAND优先级带数据可读POLLPRI高优先级数据可读POLLOUT普通数据可写POLLWRNORM普通数据可写POLLWRBAND优先级带数据可写POLLERR发生错误POLLHUP发生挂起POLLNVAL描述字不是一个打开的文件Poll事件类型:#include int poll(st
16、ruct pollfd*fds, nfds_t nfds, int timeout);2)nfds参数指定被监听fds集合的大小3)timeout参数指定poll的超时值,单位是毫秒,当timeout为-1时,poll调用将永远阻塞,直到某个事件发生,当timeout为0时,poll调用将立即返回。Poll系统调用的返回值的含义与select相同。例程:阻塞例程:判断第i个描述符是否就绪epoll是Linux特有的I/O复用函数,它在实现和使用上与select、poll有很大差异:准备FDSelect/poll 模式epoll是Linux特有的I/O复用函数,它在实现和使用上与select、p
17、oll有很大差异:epoll 模式epoll_createEpoll_waitprocess差异: epoll使用一组函数来完成任务,而不是单个函数; epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无须像select和poll那样每次调用都要重复传入文件描述符集或事件集。但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。这个文件描述符使用epoll_create函数来创建: 函数声明:intint epoll_createepoll_create( (intint size) ) 该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符
18、的最大范围 差异: epoll使用一组函数来完成任务,而不是单个函数; epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无须像select和poll那样每次调用都要重复传入文件描述符集或事件集。但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。这个文件描述符使用epoll_create函数来创建: 函数声明:intint epoll_createepoll_create( (intint size) ) 该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符的最大范围 ,返回的文件描述符将用作其它所有epoll系统调用的第一个参数,以指
19、定要访问的内核事件表。函数声明:intint epoll_ctlepoll_ctl( (intint epfd, , intint op, , intint fd, , structstruct epoll_eventepoll_event * *event) )该函数用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。参数:epfd:由 epoll_createepoll_create 生成的epoll专用的文件描述符;op:要进行的操作例如注册事件,可能的取值:EPOLL_CTL_ADDEPOLL_CTL_ADD 注册、EPOLL_CTL_MODEPOLL_CTL_MOD 修
20、改、EPOLL_CTL_DELEPOLL_CTL_DEL 删除fd:关联的文件描述符;event:指向epoll_event结构体的指针: struct epoll_event _uint32_t events;/epoll事件epoll_data_t data;/用户数据如果调用成功返回0,不成功返回-1typedef union epoll_datavoid * ptr;int fd;uint32_ t u32;uint64_t u64;epoll_data_teventsevents字段字段 EPOLLINEPOLLIN :表示对应的文件描述符可以读 EPOLLOUT EPOLLOUT:
21、表示对应的文件描述符可以写 EPOLLPRI EPOLLPRI:表示对应的文件描述符有紧急的数据可读 EPOLLERR EPOLLERR:表示对应的文件描述符发生错误 EPOLLHUP EPOLLHUP:表示对应的文件描述符被挂断 EPOLLET EPOLLET:表示对应的文件描述符有事件发生epoll_dataepoll_data 字段字段 epoll_data是个联合体,其4个成员中使用最多的是fd,它指定事件所从属的目标文件描述符。函数声明:intint epoll_waitepoll_wait( (intint epfd,structstruct epoll_eventepoll_ev
22、ent * * events,intint maxevents, intint timeout)该函数如果检测到事件,就将所有就绪的事件从内核事件表复制到它的第二个参数events指向的数组中;参数:epfd:由epoll_createepoll_create 生成的epoll专用的文件描述符;epoll_event:用于回传待处理事件的数组;maxevents:每次能处理的事件数;timeout:等待I/O事件发生的超时值;返回发生事件数。 epollepoll的一般框架的一般框架局部的调整内核事件表FD_SET(socketfd,&rfds);FD_SET(socketfd,&am
23、p;wfds);epoll_ctl(epollfd,EPOLL_CTL_ADD,newSocket,&ev)select(maxfd+1,&rfds,NULL,NULL,&timeout)epoll_wait(epollfd,events,MaxfdNum,timeout)FD_ISSET(socket,rfds)FD_ISSET(socket,wfds)if(eventsi-events&EPOLLOUT)遍历所有描述符只输出就绪事件epoll最擅长的事情是监视大量闲散连接,批量返回可用描述符LT和ET模式 EPOLL事件触发有两种模型:EdgeTriggered(ET,边缘触发)和LevelTriggered(LT,电平触发)。 LT是默认的工作模式,当epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件,这样,当应用程序下一次调用epoll_wait时,epoll_wai
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司供应链协同平台建设方案
- 2026江西理工大学高层次人才招聘备考题库含答案详解【b卷】
- 2025-2026学年古筝孟姜女教案
- 2026西南石油大学南充校区安全与后勤保障部招聘2名临时聘用员工备考题库(四川)附参考答案详解【突破训练】
- 2026山东省新动能基金管理有限公司校园招聘8人备考题库必考题附答案详解
- 2026江苏南京大学SZXZ2026-009生物医学工程学院科研人员招聘备考题库及一套完整答案详解
- 2025-2026学年帮妈妈做事教案
- 公司仓库安全管理方案
- 2026福建莆田城厢法院招聘3人备考题库【夺冠系列】附答案详解
- 国金证券2026届春季校园招聘备考题库附答案详解(夺分金卷)
- 2026年陕西航空职业技术学院单招职业适应性测试题库带答案详解(能力提升)
- 2026年自贡市市本级招用高校毕业生从事公共服务(58人)笔试参考题库及答案解析
- 【2026年中考复习】全国中考物理真卷综合能力题100道(上)
- 2026年雨季安全驾驶试题及答案
- 高中历史必背阶段特征-2026届高三统编版历史一轮复习(选必融合)
- 2026年安徽工商职业学院单招职业技能测试题库带答案详解ab卷
- 2026年安徽工贸职业技术学院单招职业技能测试题库带答案详解(基础题)
- 纳税人员财会制度
- 2026年西安科技大学辅导员招聘(15人)考试参考试题及答案解析
- 医保局联席会议制度
- 2026年南京铁道职业技术学院单招职业适应性测试题库及答案详解(名校卷)
评论
0/150
提交评论