标签:io 数据 轮询 阻塞 tcp TCP IO recv 内核
阻塞IO
recv,接收数据,若没有,将阻塞,
当对方发数据来后,linux内核缓冲区得到数据,
内核数据复制到recv()调用所在的用户空间,
阻塞解除,进行下一步处理,
非阻塞IO
轮询调用recv函数接收数据,
没有数据,立即返回,然后继续调用,
根据返回值来判定时候读到数据,
这种方式大量消耗CPU,应用范围小,一般和selectIO复用配合使用,
IO复用
select机制,可以轮询多个fd的状态变化,
进而决定recv是否要进行数据的读,而不致像上面两种极端,
但是所轮询的多个fd都没有状态变化,也将阻塞,
同时select也可以设置等待时间,避免干等,
信号驱动IO
建立一个信号,当有数据到来的时候,通知上层应用去读取数据,
这种模型用的较少,信号发送有延迟,处理数据有延迟,内核数据也可能发生变化,
为什么说信号驱动的延迟大呢?
因为有数据了,得发送一个信号去通知上层应用,
通知之后,不一定马上来读取,
有机会读取了,还得跑过来读
异步IO
异步IO,上层应用提供了一个应用层的缓冲区,
有数据了,内核会主动,,的把数据塞到应用层提供的这个缓冲区,而不用像上面那样有那么的工序去主动地读,不过这个复杂工序你暂时没办法了解很深入,但是可以肯定的是,主动读肯定涉及到很多过程处理,
标签:io,数据,轮询,阻塞,tcp,TCP,IO,recv,内核 来源: https://www.cnblogs.com/itplay/p/11375441.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。