写点什么

io 的实质

作者:wzh
  • 2022-10-12
    北京
  • 本文字数:932 字

    阅读完需:约 3 分钟

io 本质

为避免用户直接操作内核,保证内核安全,操作系统将虚拟内存非为 内核空间 和 用户空间。内核模块运行在内核空间,对应的进程处于内核态;用户程序运行在用户空间,对应的进程处于用户态。

应用程序不允许直接在内核空间区域进行读写,也不允许直接调用内核代码定义的函数。因此,用户态进程只能 通过系统调用(System Call)向内核发出指令,完成调用系统资源之类的操作。

read、write 两大系统调用。

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

上层应用通过操作系统的 read 系统调用把数据从内核缓冲区复制到应用程序的进程缓冲区,通过操作系统的 write 系统调用把数据从应用程序的进程缓冲区复制到操作系统的内核缓冲区。

因此,在应用程序中,无论是对 socket 的 IO 操作还是对文件的 IO 操作,都属于上层应用的开发,它们在 Input 和 Output 维度上的执行流程 都是在内核缓冲区和进程缓冲区之间进行数据交换。

linux 中有一个内核缓冲区,每个用户进程有各自的进程缓冲区。

  • Java 客户端程序通过 write 系统调用将数据复制到内核缓冲区,Linux 将内核缓冲区的请求数据通过网卡发送出去。在服务端,这份请求数据会从接收网卡中读取到服务端机器的内核缓冲区。

  • Java 服务端程序通过 read 系统调用从 Linux 内核缓冲区读取数据,再送入 Java 进程缓冲区。

  • Java 服务器在自己的用户空间中完成客户端的请求所对应的业务处理。

  • Java 服务器完成处理后,构建好的响应数据将从用户缓冲区写入内核缓冲区,这里用到的是 write 系统调用,操作系统会负责将内核缓冲区的数据发送出去。

  • 服务端 Linux 系统将内核缓冲区中的数据写入网卡,网卡通过底层的通信协议将数据发送给目标客户端。

为什么要有缓冲区?

  • 缓冲区的目的是减少与设备之间的频繁物理交换。

  • 外部设备的直接读写涉及操作系统的中断。发生系统中断时,需要保存之前的进程数据和状态等信息,结束中断之后,还需要恢复之前的进程数据和状态等信息。为了减少底层系统的频繁中断所导致的时间损耗、性能损耗,出现了内核缓冲区。

  • 操作系统会对内核缓冲区进行监控,等待缓冲区达到一定数量的时候,再进行 IO 设备的中断处理,集中执行物理设备的实际 IO 操作,通过这种机制来提升系统的性能。


用户头像

wzh

关注

还未添加个人签名 2019-06-13 加入

还未添加个人简介

评论

发布
暂无评论
io的实质_Linux_wzh_InfoQ写作社区