当前位置:网站首页 > Java基础 > 正文

java上层基础



Java基础之IO读写的基础原理

  • 1.1 前言
  • 1.2 Java基础之IO读写的基础原理
  • 1.3 内核缓冲区与进程缓冲区
  • 1.4 详解典型的系统调用流程
  • 1.5 参考资料

1.1 前言

这篇博文来整理下Java I/O 读写的基础原理。

1.2 Java基础之IO读写的基础原理

大家知道,用户程序进行I/O的读写,依赖于底层I/O的读写。基本上会用到底层的read和write 两大系统调用。

在不同的操作系统中,I/O 读写系统调用的名称可能不完全一样,但是基本功能是一样的。

这里涉及一个基础的知识:

  • read 系统调用,并不是直接从物理设java上层基础备把数据读取到内存中
  • write 系统调用,也不是直接把数据写入到物理设备。

上层应用无论是调用操作系统的read,还是调用操作系统的write,都会涉及缓冲区。

具体来说:

  • 调用操作系统的read,是把数据从内核缓冲区复制到进程缓冲区;
  • 而write 系统调用,是把数据从进程缓冲区复制到内核缓冲区。
  • 程序发起Read指令-----> 操作系统将物理磁盘上的数据读取到内核缓冲区-----> 程序将内核缓冲区数据复制到进程缓冲区
  • 程序发起Write指令-----> 程序将数据从进程缓冲区复制到内核缓冲区-----> 操作系统将内核缓冲区数据写入到磁盘

也就是说,上层程序的I/O操作,实际上不是物理级别的读写,而是缓存的复制。

read&write 两大系统调用,都不负责数据在内核缓冲区和物理设备(如磁盘)之间的交换,这项底层的读写交换,是由操作系统内核完成的。

在用户程序中,无论是Socket的I/O 还是文件I/O 操作,都属于上层应用的开发,他们的输入和输出的处理,在编程的流程上,都是一致的。

1.3 内核缓冲区与进程缓冲区

为什么设置那么多的缓冲区,为什么要那么麻烦呢?

  • 缓冲区的目的,是为了减少频繁地与设备之间的物理交换。大家都指导,外部设备的直接读写,涉及操作系统的终端。发生系统中断时,需要保存之前的进程数据和状态等信息,而结束中断之后,还需要恢复之前的进程数据和状态等信息。为了减少这种底层系统的时间损耗,性能损耗,于是出现了内存缓冲区。
  • 有了内存缓冲区,上层应用使用read系统调用时,仅仅把数据从内核缓冲区复制到上层应用的进程缓冲区,上层应用使用write 系统调用时,仅仅把数据从进程缓冲区复制到内核缓冲区中。底层操作会对内核缓冲区进行监控,等待缓冲区达到一定数量的时候再进行设备的中断处理,集中执行物理设备的实际 操作,这种机制提升了系统的性能。至于什么时候中断(读中断,写中断),由操作系统的内核来决定,用户程序则不需要关心。

从数量上来说,在Linux系统中,操作系统内核只有一个内核缓冲区。而每个用户程序(进程),有自己独立的缓冲区,叫做进程缓冲区。

所以,用户程序的I/O读写程序,在大多数情况下,并没有实际的I/O操作,而是在进程缓冲区和内核缓冲区之间直接进行数据的交换。

1.4 详解典型的系统调用流程

前面讲到,用户程序所使用的系统调用read&write,他们不等价于数据在内核缓冲区和磁盘之间的交换。

read 把数据从内核缓冲区复制到进程缓冲区,write 把数据从进程缓冲区复制到内核缓冲区。

java 高性能磁盘读写 java内存读写_进程缓冲区

  • 等待数据准备好
  • 从内核向进程复制数据

如果是read 一个socket (套接字),那么以上两个阶段的具体处理流程如下:

  • 第一阶段,等待数据从网络中到达网卡。当所等待的分组到达时,它被复制到内核中的某个缓冲区。这个工作由操作系统自动完成,用户程序无感知。
  • 第二个阶段,就是把数据从内核缓冲区复制到应用进程缓冲区。

再具体一点,如果是在Java服务器端,完成一次socket请求和响应,完整的流程如下:

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

版权声明


相关文章:

  • java基础数组应用2025-04-22 20:26:00
  • 有基础学Java2025-04-22 20:26:00
  • java理论基础2025-04-22 20:26:00
  • java 搭建基础框架2025-04-22 20:26:00
  • 免费的java基础课程2025-04-22 20:26:00
  • java基础循环题库2025-04-22 20:26:00
  • java基础与应用2025-04-22 20:26:00
  • java基础入门实例2025-04-22 20:26:00
  • java开发教程基础2025-04-22 20:26:00
  • java 入门基础书籍2025-04-22 20:26:00