2016 - 2024

感恩一路有你

poll函数编程教学 在非阻塞模式上怎么知道recv接收数据完成?

浏览量:4588 时间:2023-07-09 07:48:41 作者:采采

在非阻塞模式上怎么知道recv接收数据完成?

以linux下的tcp socket编程为例:阻塞是指recv/read时,如果socket接收缓冲区有数据,我会一直保持清醒,直到有数据来了,我才读完。

在发送/写的时候,如果发送缓冲区满了,没有空间继续发送,我就睡觉,磨蹭,直到发送缓冲区腾出足够的空间让我把所有的数据都塞进发送缓冲区。

(当然,如果你通过setsockopt设置了读写超时,超时到期后仍然会返回-1和EAGAIN,不会等待睡眠。)

非阻塞是指在recv/read时,如果接收缓冲区有数据并且我读完了,如果没有数据,我会直接带着返回的-1和EGAIN离开,绝不会休眠等待任何延迟。

写/发送时,如果发送缓冲区有足够的空间,立即将数据放入发送缓冲区,然后离开。如果发送缓冲区已满,空间不足,直接用返回的-1和EAGAIN离开。至于IO多路复用,首先要理解的是操作系统为你提供了一个功能。当你的一个套接字接收缓冲区有数据要读或者发送缓冲区有空间要写时,它会给你一个通知。

这样在配合非阻塞socket使用的时候,我只会在系统通知我可以读取哪个描述符的时候进行读取操作,这样可以保证我每次读取的时候都能读取到有效数据,除了return -1和EAGAIN我什么都不会做。

写操作是相似的。

操作系统的这个功能被select/poll/epoll等系统调用函数使用,可以同时监控多个描述符的读写准备情况,使得多个描述符的I/O操作可以在一个线程中完成,称为I/O复用。,其中 "再利用和指的是同一线程的重用。至于事件驱动,其实是I/O复用的另一种叫法。至于异步同步,我们在linux下常见的网络编程模型大多是同步io。以读操作为例,本质上用户需要调用re。Ad/recv在处理业务逻辑之前从内核缓冲区读取数据。

异步io意味着内核已经读取了数据,用户直接处理逻辑。

异步IO一般使用linux下的aio库。

java初学推荐书籍有哪些?

排名不分先后

Effective Java

了解过Java的人应该或多或少听过这本书,堪称经典。书中主要列举了一些知识点,然后分别对这些知识点进行阐述。内容相当深入,推荐有基础的人阅读。

Thinking with Java 4

Java思维被誉为Java圣经。不管你处于什么阶段,每次看都能有所收获。所以,对于初学者来说,这本书有褒有贬。你自己想想。

Java并发编程实践

外国人写的书,这是翻译版,原著《Java Concurrency in Practice》,堪称并发中的经典之作。翻译的也很好,书内容偏理论,基本知识点都能概括。当然这本书还是要适合有一点并发基础的人,零基础的看起来会有点吃力。这本书可以大量阅读。一遍又一遍,你不看一遍也会有新的理解。

对Java虚拟机的深刻理解

这本书也很经典,作者是国内的,在市场泛滥的今天,也算是上品了。书中对JVM进行了详细而深刻的讲解,是学习JVM原理的必备书籍。

头部优先设计模式

Head first系列教材,看起来特别轻松,图文并茂,通俗易懂,适合初学者选择。

重构——改进现有代码的设计

书中给出了70多个可行的重构,每个重构都介绍了一个经过验证的代码转换技术的动机和技术。本书中提出的重构标准将帮助您一次一小步地修改代码,从而降低开发过程中的风险。

MySQL技术内幕

本文从源代码的角度深入分析了InnoDB的体系结构、实现原理和工作机制,并给出了大量的最佳实践,可以帮助您系统深入地掌握InnoDB,更重要的是可以为您设计和管理高性能、高可用的数据库系统提供优秀的指导。

另外,我可以和大家分享一下这几年收集的关于Java三个方面的书籍。大概有几个G 你可以通过回复 "Java书籍和杂志在后台。如果对你有帮助,请点击喜欢。

Java 数据 编程 书籍

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。