几种io模型

一 同步/异步 io

同步io

  • 调用如 read()write() 等系统调用时,进程会阻塞,直到数据读写操作完成后才返回。
  • 期间进程无法做其他事情,等待 I/O 完成。
  • 简单易用,但在高并发或慢设备场景下可能导致性能瓶颈。

异步io

  • 进程发起 I/O 请求后,系统立即返回,I/O 操作在后台进行。
  • 进程可以继续执行其他任务,等 I/O 完成后通过回调、事件通知等方式获知结果。
  • 类型主要包括:
    • posix aio,接口如 aio_read()aio_write(),适用于文件和部分块设备,但性能有限。
    • linux native aio,通过 io_submit()io_getevents()io_setup()io_destroy() 等系统调用实现,性能优于 POSIX AIO,常用于高性能服务器和数据库。
    • io_uring,接口如 io_uring_setup()io_uring_enter()io_uring_register(),支持文件、网络、缓冲区等多种异步操作,低延迟、高吞吐,广泛用于新项目。
    • 异步事件通知机制,如 epollselectpoll,用于异步网络和文件描述符事件处理。
    • 异步信号驱动,通过 fcntl() 设置 O_ASYNC 标志,I/O完成后通过信号通知进程。

二 Buffer/mmap/Direct/Raw io

Buffer io

  • 又称 缓存 I/O 或 标准 I/O
  • 数据先读入内核页缓存(buffer cache),再由用户空间读取。
  • 写操作也先写入缓存,稍后再同步到磁盘(如 write()read())。
  • 优点:有缓存加速,减少磁盘访问次数。
  • 缺点:数据一致性依赖于缓存刷新,可能丢失未同步数据。

mmap io

  • 通过 mmap() 系统调用,将文件直接映射到进程虚拟地址空间。
  • 读写文件就像操作内存一样,内核自动处理页缓存和磁盘同步。
  • 优点:高效,适合随机访问和大文件处理。
  • 缺点:管理复杂,容易出现一致性和同步问题。

Direct io

  • 通过 O_DIRECT 标志打开文件,读写时绕过内核页缓存,直接与磁盘交互。
  • 需要对齐缓冲区和 I/O 大小。
  • 优点:减少内存拷贝,适合数据库等对一致性和性能要求高的场景。
  • 缺点:编程复杂,不能利用缓存加速。

Raw io

  • 直接对块设备(如 /dev/sda)进行读写,不经过文件系统。
  • 通常也采用 Direct I/O,适合数据库、虚拟化等场景。
  • 优点:最大化性能和控制权。
  • 缺点:无文件系统保护,易出错,管理复杂。
posted @ 2025-09-08 11:45  dogonthemoon  阅读(29)  评论(0)    收藏  举报