IO性能篇(二):文件读写的四种分类
###缓冲IO与非缓冲IO
- 缓冲IO:是指利用标准库缓存来加速文件的访问,而标准库内部再通过系统调度访问文件
- 非缓冲IO:是指直接通过系统调用来访问文件,不在经过标准库缓存
备注:这里所说的“缓冲”,是指标准库内部实现的缓存。比方说,你可能见到过,很多程序遇到换行时才真正输出,而换行前的内容,其实就是被标准库暂时缓存了起来
###直接IO与非直接IO
- 直接IO:是指跳过操作系统的页缓存,直接跟文件系统交互来访问文件
- 非直接IO:是指文件读写时,先经过系统的页缓存,然后在由内核或额外的系统调用,真正写入磁盘
默认是非直接IO,使用直接IO需要在系统调用时,指定O_DIRECT标识
备注:直接 I/O、非直接 I/O,本质上还是和文件系统交互。如果是在数据库等场景中,你还会看到,跳过文件系统读写磁盘的情况,也就是我们通常所说的裸 I/O
###阻塞IO与非阻塞IO
- 阻塞IO:是指应用程序执行IO操作后,如果没有获得响应,就会阻塞当前线程,也就是不能执行其他任务
- 非阻塞IO:是指应用程序执行IO操作后,不会阻塞当前的线程,可以继续执行其他的任务,然后在通过轮询或者事件通知形式,获取调用的结果
默认是阻塞IO,使用非阻塞IO,需要设置O_NONBLOCK标识
###同步IO与异步IO
- 同步IO:是指应用程序执行IO操作后,要一直等待IO完成后,才能获得IO响应
- 异步IO:是指应用程序执行IO操作后,不用等待完成和完成后的响应,而是继续执行就可以。等到这次IO完成后,响应会用事件通知的方式,告诉应用程序
设置O_SYNC或者O_DSYNC标识,表示同步IO。O_DSYNC要等文件数据写入磁盘后才能返回,O_SYNC在O_DSYNC基础上,要求文件元数据也要写入磁盘后,才能返回
设置O_ASYNC标识,表示异步IO。这样,内核会在通过SIGIO或者SIGPOLL,来通知进程文件是否可读写