一、内核缓冲区和进程缓冲区
由于外部设备的直接读写涉及操作系统的中断,发送系统中断时,需要保存之前的进程数据和状态等信息,还需要恢复之前的进程数据和状态等信息,为了减少这种系统损耗,设置了内存缓冲区。
依赖于内存缓冲区,上层应用使用read系统调用时,仅仅把数据从内核缓冲区复制到上层应用的缓冲区(进程缓冲区);上层应用使用write系统调用时,仅仅把数据从进程缓冲区复制到内核缓冲区中。底层操作会对内核缓冲区进行监控,等待缓冲区达到一定数量的时候,再进行IO设备的中断处理,几种执行物理设备的实际IO操作。【该部分由操作系统内核负责完成】
用户程序的IO读写程序,在大多数情况下,并没有进行实际的IO操作,而是在进程缓冲区和内核缓冲区之间直接进行数据的交换。
二、系统调用流程
系统调用read&write:
- read把数据从内核缓冲区复制到进程缓冲区;
- write把数据从进程缓冲区复制到内核缓冲区。
二者均不涉及磁盘之间的交换

- 客户端请求:Linux通过网卡读取客户端的请求数据,将数据读取到内核缓冲区。
- 获取请求数据:Java服务器(例如Tomcat等容器)通过read系统调用,从Linux内核缓冲区读取数据,再送入Java进程缓冲区。
- 服务器端业务处理:Java服务器在自己的用户空间中处理客户端的请求。
- 服务器端返回数据:Java服务器完成处理后,构建好的相应数据,通过write系统调用将这些数据从用户缓冲区写入内核缓冲区。
- 发送给客户端:Linux内核通过网络IO,将内核缓冲区中的数据写入网卡,网卡通过底层的通信协议,会将数据发送给目标客户端。