企业做网站优劣,登陆网站怎么做,如何与对方网站做相互链接,前端角度实现网站首页加载慢优化早期#xff0c;存储文件的设备是磁盘#xff08;当下的市场几乎都是SSD#xff09;#xff0c;但大家习惯的把它们都称为磁盘#xff0c;磁盘是用来表示区分内存的存储设备。而在操作系统看来#xff0c;这个存储设备的结构就是一个线性结构#xff0c;这一点很重要。 … 早期存储文件的设备是磁盘当下的市场几乎都是SSD但大家习惯的把它们都称为磁盘磁盘是用来表示区分内存的存储设备。而在操作系统看来这个存储设备的结构就是一个线性结构这一点很重要。 磁盘有一个概念叫扇区一般是521字节大小磁盘视其为一个管理单位。 而操作系统做I/O的这个单位大小一般是4KB换句话说现在要向磁盘写1个字节大小的数据其实是一次性写入了4KB只是有效数据为1个字节从磁盘读数据也是如此一次读入是读入了4KB。 操作系统管理这个线性结构采用分治思想。 通过分治思想我们要理解文件系统只需要理解其中一个分组即可。 文件属性内容。Linux中文件的内容和属性是分开存储的。于是不难知道这样一点文件的内容有大有小而文件的属性却是能确定大小的比如包括int类型的文件大小等一些其他属性都是可以确定大小的于是可以定义一个结构体专门用来描述文件的属性这个结构体就叫做inode。提醒一下因为文件名有长有短不太好确定大小所以在Linux中并没有把它定义到文件属性里。 Linux下一个inode结构体的大小是128Byte。
Boot Block 启动块存在每个分区的开头和备份文件、启动相关。
inode Table 在inode结构体中有一个变量叫做inode编号系统通过inode_id标识唯一的文件而不是文件名。 因此每一个文件都对应一个inode_id。一个分组能容纳的文件数量是有限的因此inode的数量也是有限的inode的唯一性只在一个分组中才有意义而inode Table就用来保存所有的inode。
inode Bitmap inode Table对应的位图结构用来统计inode的使用情况位图中比特位的位置和某一个文件对应的inode的位置是一一对应的位图中比特位为1代表inode被占用否则表示可用。
Block Bitmap 数据块对应的位图结构位图中的比特位位置和当前data block对应的数据块位置是一一对应位置一个数据块一般是4KB如果一个数据块被使用了则这个块对应的位图结构中的位置就为1。
GDTGroup Descriptor Table 磁盘最终被分出了很多很多个组每一个组的状态是怎么样的则用GDT来描述。GDT内容对应分组的宏观的属性信息比如data blocks已经使用多少inode有多少个已经被占用了多少个还剩下多少个。
Super Block: 保存的是整个文件系统的信息为什么Super Block不像Boot Block一样存在每个分区的开头而要存在每个分组的开头Super Block保存在不同的分组里意味着备份如果某个Super Block损坏便可以通过拷贝其他分组的Super Block来恢复。 一个分组是有n个data blocks的一个文件的内容使用了几个data block是哪几个data block这个信息是保存在inode Table中的inode里面的Linux下是把它定义为blocks数组。
于是我们宏观上的操作在操作系统看来其实是下面这样的。
创建一个文件在inode Bitmap的比特位由0置为1找到其inode table把该文件对应属性填进去文件的数据写到block里在inode中用数组blocks建立映射关系最后返回inode编号创建成功。
查找一个文件拿到inode_id在inode table中找到对应的inode再根据inode中的blocks数组找到对应的data blocks内容加属性就全找到了。
删除一个文件删除文件也需要用到inode实际上删除一个文件时我们只需要找到inode在inode bitmap当中的比特位把比特位由1置为0就删除了。 所以删除一个文件根本不需要把数据属性和内容清空只要把inode bitmap的1置为0属性就删除了这个文件也占着数据块也把block的比特位也置为0。所以把文件删除是能够恢复的一旦删除只是把bit位清掉了想要恢复只要得到inode的编号然后把inode bitmap里的比特位由0置为1再根据inode中blocks数组对应的映射表把block bitmap的0置为1。 如果在Linux中误删除一个文件还是能恢复的但是前提必须是inode和data block没有被占用所以当误删除一个文件时最好的办法就是什么都不做。而我们在Windows中删除文件到回收站只是转移了目录在回收站中删除才是真正的删除。 可是我们在查找一个文件的时候用的不是inode_id而是文件名 回答 任何一个文件都在一个目录下由于操作系统不允许同一目录下有同名文件所有这些文件并没有重复文件名。 目录是一个文件也有自己的inode有对应自己的data block目录的数据块存放的是当前目录下的文件名和inode的映射关系所以inode并不需要保存文件名这就是为什么文件名不是inode的变量之一。 我们在一个目录下新增一个文件要向当前目录的内容里去写文件名和inode的映射关系所以必须得有写入权限。 罗列当前的文件要有读权限。想读的时候要根据文件名找到inode再读取下面的所有文件的属性拿到文件名映射inode必须得去访问数据块所以要有读权限。