文件io和标准io区别(文件IO文件系统)
文件IO的分类有哪几种?
- 缓冲与非缓冲IO
- 直接与非直接IO
- 阻塞与非阻塞
- 同步与异步IO
缓冲与非缓冲IO的区别?
根据是否利用标准库缓冲,可以把文件IO分为缓冲IO和非缓冲IO:
- 缓冲IO,利用标准库的缓存实现文件的加速访问,标准库再通过系统调用访问文件
- 非缓冲IO,直接通过系统调用访问文件,不经过标准库缓存
缓冲IO可以减少系统调用的次数,避免CPU上下文切换产生的开销。
直接和非直接IO的区别?
根据是否利用操作系统的缓存,把文件IO分为直接IO和非直接IO:
- 直接IO:不会发生内核缓存和用户程序之间的数据复制,而是直接通过文件系统访问磁盘
- 非直接IO:读操作时,数据从内核缓存中拷贝给用户程序,写操作时,数据从用户程序给内核缓存,再由内核决定什么时候写入数据到磁盘。
为什么需要非直接IO?
磁盘IO是非常缓慢的,Linux内核为了减少磁盘的IO次数,在系统调用后,会把用户数据拷贝到内核缓存起来,这个内核缓存空间称之为页缓存。
内核中的数据什么时候写入磁盘?
- 在调用write的最后,如果发现内核缓存的数据过多,内核就会把数据写到磁盘
- 用户主动调用sync,内核缓存的数据会被写到磁盘
- 当内存十分紧张,无法再分配页面时,也会把内核缓存的数据写到磁盘
- 内核缓存的数据的缓存时间超过某个时间时,也会把数据刷到磁盘上
阻塞IO的阻塞体现在哪里?
用户程序执行read时,线程会被阻塞,一直等到内核把数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区,当拷贝完成时,read才返回。
阻塞等待主要指下面两个过程的等待:
- 内核数据准备
- 数据从内核态拷贝到用户态
非阻塞IO的非阻塞体现在哪里?
非阻塞的read请求可以在数据未准备好的情况下立即返回,程序可以继续往下执行,此时应用程序应该不断轮询内核,直到数据准备好,内核将数据拷贝到应用程序缓冲区,read调用即可获得到结果。
最后一次的read调用获取数据的过程是个同步的过程,这里的同步是指内核态的数据拷贝到用户程序的缓冲区的过程。
轮询虽然能解决何时知道数据准备好,但是过于笨拙,于是为了避免轮询,IO多路复用技术应时而生。
IO多路复用是通过IO事件分发,当内核数据准备好时,再以事件通知应用程序进行操作,比如select、poll技术,该方法提高了CPU的利用率,在没有被通知的情况下,应用程序可以使用CPU做其他的事情。
非阻塞IO本质上还是同步IO,因为在执行read调用时,内核将数据拷贝到应用程序空间还是需要等待的,如果内核实现的拷贝效率不高,read调用会等待很长时间。
阻塞IO和非阻塞IO是同步IO么?
是。
什么是真正的异步IO?
真正的异步IO是指内核数据准备好和数据从内核态拷贝到用户态这两个过程都不需要等待。
通过上图我们可以看出,当我们执行aio_read以后就立即返回,内核自动将数据从内核空间拷贝到用户空间,内核自动完成,不需要应用程序主动发起。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com