磁盘I/O工作机制
应用程序访问文件有哪几种方式?
五种访问文件的方式
首先I/O
操作都是由操作系统来完成的,其次操作系统的内核空间地址与用户空间地址是分割的。这个设计是为了保证内核程序的安全性,防止用户程序的奔溃导致系统的崩溃。
由于以上设计,导致用户程序想要进行I/O
操作,都是需要调用内核程序,而内核程序与用户程序的空间地址是分割的,导致数据要从磁盘复制到内核空间,在从内核空间复制到用户地址空间,这是非常慢的。
所以有了缓存机制,操作系统读取磁盘的数据有预读的情况,也就是说,当读取002这个地址上的数据时,他也会将001与003地址上的数据也读入到内核空间中。
标准访问文件的方式
当发生read()
操作时,操作系统优先读取内核空间中高速缓存区的数据,如果没有,在去磁盘读取数据,存入到高速缓存区,在将数据返回给用户程序。
当发生write()
操作时,用户程序将数据写入到内核空间的高速缓存区,然后对于用户程序来说,该操作就算完成了,至于什么时候将高速缓冲区的数据写入到磁盘,由操作系统决定。
直接访问磁盘的方式
不通过操作系统访问磁盘,用户程序直接访问磁盘。一般这种用户程序都是数据库程序。
同步访问的方式
写入与读取操作都是同步操作。与标准访问文件方式不同时,write()
操作需要等待返回成功或者失败标识。
一般适用于安全性较高的场景,并且该操作方式的硬件都是定制的。
异步访问的方式
当发起read()
请求后,应用程序线程并不会阻塞(也就是傻傻的在哪里等着),它会接着执行它下面的代码逻辑,直到什么时候,他需要被请求的数据时,而该数据还没有读取到时,才会被阻塞。
异步会显著提升应用程序的效率,但是对I/O
速率无影响。
内存地址映射的方式
将操作系统的某一块内存地址空间与磁盘的文件关联起来。