本文其他的内容主要是得出了下面几个结论:服务器要接收客户端的数据,要建立 socket 内核结构,主要包含两个重要的数据结构,等待队列,和接收队列,socket在进程中作为一个文件,可以用文件描述符 fd 来表示,为了方便理解,本文中, socket 内核对象 ≈ fd 文件描述符 ≈ TCP连接;
假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及硬件、操作系统、应用程序三个层面,了解这些知识是很有帮助的。
引言IO(Input/Output) 方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的 IO 教学大多数是停留在最基本的 BIO ,而并未对于 NIO、AIO 、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本
在使用传统的 I/O 操作时,比如 InputStream/OutputStream ,通常是将数据暂存到 byte 或者 char 中,亦或者从 byte 或者 char 中来获取数据,但是在 Java 语言中对 array 数组自身提供的可操作的 API 非常少,常用的操作仅仅是 length 属性和下标,如果相对数组中的数据进行更高级的操作,需要自己写代码来实现,处理方式比较原始。
Java IO 的演变之路。与 NIO 不同的是,当 AIO 进行读写操作时,只须直接调用 API 的 read 或 write 方法即可,这两种方法均为异步的,对于读操作而言,当有流可读的时候,操作系统会将可读的流传入 read 方法的缓冲区,对于写操作而言,当操作系统将 write 方法传递的流写入完毕时,操作系统主动通知应用程序。
为了解决标准Java I/O令人难以忍受的效率问题,从JDK1.4开始,NIO出现了。之所以是NIO,是因为使用它的场景众多,譬如开发中必不可少的Tomcat,以及大名鼎鼎的Netty,而Netty更是把NIO发挥到了极致,成为了RPC技术事实上的标准,所以它在JDK1.7中又升级为了AIO。
关于IO会涉及到阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO等几个知识点。IO多路复用中文比较让人头大,IO多路复用的原文叫 I/O multiplexing,这里的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock的状态来同时管理多个I/O流. 发明它的目的是尽量多的提高服务器的吞吐能力。
epoll技术属于IO复用,IO复用属于同步IO,所以epoll属于同步IO,现在我用了一个框架,比如twisted,里面的reactor模式的实现是基于epoll或者poll的,在IO的范畴应该是属于同步IO,但是网上几乎所有的文章都说twisted是异步的。