




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录 I O模型I O复用概述Select函数套接字选项和fcntl非阻塞I O信号驱动I O模型 I O模型 linux下可用的i o模型阻塞i o非阻塞i oi o复用 select和poll 信号驱动i o SIGIO 异步i o posix 1的aio 系列函数 举例 输入操作的不同i o模型一个输入操作一般有两个阶段等待数据准备好从内核到进程拷贝数据 阻塞I O模型 最流行的i o模型 缺省时 所有套接字都是阻塞的 非阻塞I O模型 当把一个套接字设置成非阻塞方式时 即通知内核 当请求的i o操作不能马上完成时 不要阻塞进程 而应返回一个错误 上述方式循环调用recvfrom 称为轮询 极为浪费cpu资源 I O复用模型 i o复用模型调用select或poll 进程阻塞于这两个系统调用上 而不是阻塞于真正的i o系统调用上 注意 与阻塞i o模型相比 由于使用了系统调用select 似乎比阻塞i o还差 但select的好处在于可以等待多个描述字准备好 信号驱动I O模型 让内核在描述字准备好时用信号SIGIO通知进程 这种模型的好处是当等待数据报到达时 可以不阻塞 前提是允许套接口进行信号驱动i o 可以由信号处理程序来读取数据 或通知主循环来读取数据 在信号处理程序中调用recvfrom函数 异步I O模型 异步i o让内核启动操作 并在整个操作完成后 包括将数据从内核拷贝到应用进程的缓冲 通知我们 五个I O模型的比较 fcntl函数 fcntl 是标准系统调用 原意是用于对文件描述字进行各种控制操作 但后来可利用它对任何描述字进行控制操作 包括对套接字描述字 includeintfcntl intfd intcmd intarg 每个描述字都有一组由命令F GETFL取得和由命令F SETFL设置的文件标志 fcntl函数 续 函数fcntl提供了以下关于网络编程的特性 非阻塞i o 我们可以通过F SETFL命令设置O NONBLOCK来设置套接字为非阻塞型 fcntl函数 续 用fcntl来使能非阻塞i o的典型代码 intflags if flags fcntl fd F GETFL 0 0 err sys flags O NONBLOCK 保留原始状态if flags fcntl fd F SETFL flags 0 err sys 关闭非阻塞标志方法 flags 非阻塞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复用的应用场合 多个相同描述字或者多个不同的描述字等待I O操作 当客户处理多个描述字 一般是交互式输入和网络套接字 使用i o复用 如果一个tcp服务器程序既要处理监听套接字 又要处理连接套接字 一般也可以用i o复用 当然可以使用并发技术 如果一个服务器程序既要处理tcp 又要处理udp 一般也要使用i o复用 如果一个服务器程序要处理多个服务或者多个协议 一般要使用i o复用 I O复用 原理分析图 I O复用的基本思想 先构造一张或多张包含所有需要等待的描述符的表 区分不同的连接操作 或者文件操作 然后调用一个阻塞函数 它要到这些描述符中的一个或多个已准备好进行I O时才返回准备好 网络数据已经到了缓冲区文件数据已经读到缓冲区在返回时 它告诉进程哪一个描述符已准备好可以进行I O select函数 include includeintselect intmaxfd fd set readset fd set writeset fd set exceptset conststructtimeval timeout 返回 准备好描述字的数目 0 超时 1 出错 参数timeout指定内核等待的时间 其结构如下 structtimeval longtv sec seconds longtv usec microseconds typedefstruct fd maskfds bits FD SETSIZE NFDBITS 整型 fd set select函数 续 原理分析图 select函数 续 该函数有三种执行结果 永远等待下去 仅在有一个或以上描述字准备好i o才返回 为此 我们将timeout设置为空指针 等待固定时间 在有一个描述字准备好时返回 但不超过由timeout参数指定的秒数和微秒数 根本不等待 检查描述字后立即返回 这称为轮询 这种情况下 timeout必须指向结构timeval 且定时器的值必须为0 在前两种情况的等待中 如果进程捕获了一个信号并从信号处理程序返回 那么等待一般被中断 select函数 续 结构timeval指定了秒数和微秒数 但内核支持的分辨率却要粗糙得多 因此 定时并不精确 另外 如果select的三个测试指针为空 将提供一个比函数sleep更为精确的定时器 sleep睡眠以秒为最小单位 select的三个描述字集合分别指示不同测试类型的描述字集合 读 写 异常描述字 其中异常描述字支持 套接字上带外数据的到达和控制状态信息的存在 select函数 续 对描述字集合 32位整数 的操作主要有以下四个宏 VoidFD ZERO fd set fdset 清除fdset各位 VoidFD SET intfd fd set fdset 把fdset中fd对应位置1 VoidFD CLR intfd fd set fdset 把fdset中fd对应位置0 VoidFD ISSET intfd fd set fdset 判断fdset中fd位 使用select函数需重点注意的几个问题 需对最大描述字加1 如 需等待的描述字为1 4 5 其maxfd就应该是6 对集合初始化是很重要的 如果集合作为一个自动变量分配而未初始化 那将导致不可预测的后果 每次调用select前都必须对等待描述字集合完成初始化和设置工作 select函数 续 套接字可读的条件主要有 套接字接收缓冲区中的数据字节数大于等于套接字接收缓冲区低潮限度的当前值 如果对方tcp发送数据 套接字就变为可读且read返回大于0的值 如果对方tcp发送一个FIN 对方进程终止 套接字就变为可读且read返回0 如果tcp发送一个RST 对方主机崩溃并重新启动 套接字就变为可读且read返回 1 select函数 续 套接字可写的条件主要有 套接字发送缓冲区的可用空间大于等于套接字发送缓冲区的低潮限度 套接字的写这一半关闭 对套接字的写将产生SIGPIPE信号 有一个套接字错误待处理 Select举例 原理 Select阻塞 读文件 读套接字 Select举例 客户程序 Intmain intargc char argv intsockfd structsockaddr inservaddr if argc 2 err quit usage tcpcli sockfd Socket AF INET SOCK STREAM 0 bzero Select举例 客户程序 续 Voidstr cli FILE fp intsockfd intmaxfdp1 stdineof fd setrset charsendline MAXLINE recvline MAXLINE stdineof 0 FD ZERO Select举例 客户程序 续 if FD ISSET sockfd Select举例 客户程序 续 if FD ISSET fileno fp Select举例 服务器程序 标准输入 输出和错误 监听 已连接的客户套接字 Select举例 服务器程序 建立了一个客户连接 Select举例 服务器程序 建立了两个客户连接 Select举例 服务器程序 第一个客户连接结束 Select举例 服务器程序 Intmain intargc char argv inti maxi maxfd listenfd connfd sockfd intnready client FD SETSIZE ssize tn fd setrset allset charline MAXLINE socklen tclilen structsockaddr incliaddr servaddr listenfd Socket AF INET SOCK STREAM 0 bzero Select举例 服务器程序 续 Bind listenfd SA 最开始 只判断监听套接字描述符 Select举例 服务器程序 续 for rset allset structureassignment nready记录可读描述符个数nready Select
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 作业布置创建鼠标点击交互脚本16课件
- 二零二五年度国际贸易风险管理合同范本
- 二零二五年度商业地产锅炉供暖设施租赁经营协议
- 水电厂电工基础知识培训课件
- 二零二五年瓷砖材料品质保障采购协议
- 二零二五年度民宿改造与运营管理合同
- 2025版房地产项目营销手续代办服务合同范本
- 二零二五年度房地产项目绿色生态社区建设委托管理合同
- 二零二五版房地产项目投资咨询服务合同
- 2025版木门品牌授权与区域代理销售合同
- (新)部编人教版高中历史中外历史纲要上册《第13课-从明朝建立到清军入关课件》讲解教学课件
- 医药行业专题报告:VCTE技术(福瑞股份子公司)专利概览
- GB/T 42430-2023血液、尿液中乙醇、甲醇、正丙醇、丙酮、异丙醇和正丁醇检验
- 关于规范学校中层及以上领导干部岗位设置及任免办法
- 《现代汉语》课件修辞
- 某园区综合运营平台项目建议书
- 创造适合教育(2017年0613)
- 微创外科课件
- 易驱ED3000系列变频器说明书
- 农机行政处罚流程图
- GB∕T 6818-2019 工业用辛醇(2-乙基己醇)
评论
0/150
提交评论