Skip to content

9月1日学习笔记

lirui edited this page Sep 1, 2020 · 1 revision

17.5 文件缓存和打开文件

在磁盘上有数据,然后磁盘上通过磁盘控制器来完成对磁盘上扇区的读写,在这个磁盘控制器上,有扇区的缓存,基于这个再往上是内存,内存里面由数据块的缓存,同时还有一类虚拟磁盘,用内存虚拟盘,它用内存来虚拟一个逻辑的磁盘,然后在这之上,我们维护了每一个打开文件的打开文件表,打开文件表里面的每一项对应着一个文件,最后是到CPU

操作系统里面讨论的缓存是内存当中的数据块缓存

从磁盘上读数据块到内存,这里的read()通常是按需进行的,在执行read()操作的时候,会把相应的一整块读到内存里面来,选择需要的给进程使用

读的过程当中,也可以采取一定的预读机制

数据块在被使用之后会被缓存,这种缓存的意思在于日后我可能这一块还能再用到

写的时候,写也可能被延迟到以后,先写到内存里的缓存里头,

两种数据块缓存方式:1、数据块缓存:磁盘的东西在内存里做一个反向的缓存;2、页缓存:统一缓存数据块和内存页

数据块缓存,和虚拟存储之间是相互隔离开的,可能会有虚拟页的对换,也可能进程有文件的读写,

有一部分内容在内存里面还是由备份的,可以直接从页缓存里拿到相应的结果来使用,而对于读写文件,可能在内存里有磁盘块,已经有缓存,也可以从这里拿出来,这个数据块再往下,到磁盘上的文件系统

这是页缓存,相当于它们两合并的地方是在数据块这个地方

另一种机制是将他两统一起来

虚拟页式存储,在虚拟地址空间中虚拟页面可映射到本地外存文件中

文件数据块的页缓存:可执行文件直接映射到可执行文件中去,将页面缓存到别的文件里面,1)在虚拟内存中文件数据块被映射成页;2)文件的读/写操作被转换成对内存的访问;3)可能导致缺页和/或设置为脏页

存在问题:页面置换算法需要协调虚拟存储和页缓存间的页面数

文件系统中打开文件的数据结构:记录缓存的状态,

文件描述符:每个被打开的文件都有一个文件描述符,

文件状态信息,包含目录项、当前文件指针、文件操作设置等

每个进程有一个进程的打开文件表,整个系统有一个系统级的打开文件表,有文件被打开时,文件卷就不能被卸载

打开某一个文件,就对应着相应的目录项、文件控制块和文件的内容,需要在内存中有缓存,这一信息,在内存当中的记录就构成了我们这里的系统打开文件表

这个系统打开文件表里有一些内容是各个进程是不一样的,这些内容就构成了我们进程的打开文件表

而进程打开文件表里,共同的部分会映射到系统的打开文件表里头,两个进程共用的部分就在打开文件表里头

打开文件锁,有多个进程共享同一个文件的时候,这个时候,对于它们的访问就需要协调,操作系统能够提供的一种机制就是文件锁

这种机制分成两种实现策略:

1、强制——根据锁保持情况和访问需求确定是否拒绝访问

2、劝告——操作系统提供相应的机制,使得进程可以查询文件打开和锁定的状态,由进程来决定,我在这种状态下怎么做,一种是不管怎么样,直接访问,因为我对它的中心状态不关心,或者说这个中心状态对我没有影响,如果有影响,那你就可以决定说,我延迟一会之后,等相应操作完成了,我再来进行相应的操作

把打开文件访问协调的机制变成是应用进程自己来协调

Clone this wiki locally