Linux系统中的I/O

I/O操作分为:缓冲与非缓冲I/O、直接与非直接I/O、阻塞与非阻塞I/O、同步与异步I/O。

否使用标准库缓存:缓冲与非缓冲I/O

标准库对外提供I/O操作接口,自身则是通过系统调用访问文件。标准库的实现中会使用一些缓存机制,使用了标准库缓存的I/O操作是 缓冲I/O,直接通过系统调用进行的I/O操作是 非缓冲I/O

是否使用系统的页缓存:直接与非直接I/O

操作系统也会有缓存,跳过操作系统页缓存的I/O操作是 直接I/O,在系统调用时要指定O_DIRECT标志。

文件读写时,先经过系统页缓存、然后在通过系统调用落实到磁盘,这样的I/O操作是 非直接I/O

在一些特殊场景中,譬如数据库,会连操作系统的文件系统一起跳过,直接读写磁盘, 这种操作通常称为 裸I/O

程序是否阻塞自身运行:阻塞和非阻塞I/O

如果程序要等收到I/O操作结果后,才继续执行,这是 阻塞I/O

如果程序发起I/O操作后,不等结果返回继续执行其它操作,以轮询或者事件的方式获得I/O操作结果, 这是 非阻塞I/O

程序是否等待响应结果:同步和异步I/O

发起I/O操作,需要等整个I/O完成后才返回响应,这是 同步I/O

发起I/O操作,不需要等整个I/O完成,I/O操作结束后,响应以事件的形式通知调用者,这是 异步I/O

操作文件时,如果设置了O_DSYNC或者O_SYNC标志,表示同步I/O,前者要等文件写入磁盘以后才返回,后者要在前者的基础,继续等待文件的元数据写入磁盘后再返回。

操作管道或者Socket时,如果设置了O_ASYNC,表示异步I/O,当文件可读写时,内核发送SIGIO或者SIGPOLL

参考