导图社区 IO
IO原理与主要IO模型已经底层原理等打发 的非的地方的
MySQL事务,锁,引擎,索引,SQL优化
JVM相关知识,内存模型,类加载机制,gc等
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
IO
Java IO读写原理
无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。
read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换,是由操作系统kernel内核完成的。
内核缓冲与进程缓冲区
缓冲区的目的,是为了减少频繁的系统IO调用。
操作系统使用read函数把数据从内核缓冲区复制到进程缓冲区,write把数据从进程缓冲区复制到内核缓冲区中。等待缓冲区达到一定数量的时候,再进行IO的调用,提升性能。至于什么时候读取和存储则由内核来决定
用户程序的IO读写程序,大多数情况下,并没有进行实际的IO操作,而是在读写自己的进程缓冲区。
java IO读写的底层流程
一个典型Java 服务端处理网络请求的典型过程:
(1)客户端请求 Linux通过网卡,读取客户断的请求数据,将数据读取到内核缓冲区。
(2)获取请求数据 服务器从内核缓冲区读取数据到Java进程缓冲区。
(3)服务器端业务处理 Java服务端在自己的用户空间中,处理客户端的请求。
(4)服务器端返回数据 Java服务端已构建好的响应,从用户缓冲区写入系统缓冲区。
(5)发送给客户端 Linux内核通过网络 I/O ,将内核缓冲区中的数据,写入网卡,网卡通过底层的通讯协议,会将数据发送给目标客户端。
IO模型
同步阻塞IO(Blocking IO)
在阻塞式 I/O 模型中,应用程序在从IO系统调用开始,一直到到系统调用返回,这段时间是阻塞的。
同步非阻塞IO(Non-blocking IO)
指的是用户程序不需要等待内核IO操作完成后,内核立即返回给用户一个状态值,用户空间无需等到内核的IO操作彻底完成,可以立即返回用户空间,执行用户的操作,处于非阻塞的状态。
IO多路复用(IO Multiplexing)
经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。
异步IO(Asynchronous IO)