当前位置: 首页 > news >正文

网站如何提高转化率网站模板开发

网站如何提高转化率,网站模板开发,张店免费做网站,wordpress 人体时钟inode 和 block 的映射 该博文中有详细解释#xff1a;【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题#xff1a; 问题一#xff1a; 我们访问文件#xff0c;都是用的文件名#xff0c;没用过 inode 号啊#xff1f; 之前总是说可以通过一个… inode 和 block 的映射 该博文中有详细解释【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题 问题一 我们访问文件都是用的文件名没用过 inode 号啊 之前总是说可以通过一个文件的 inode 号就可以获取该磁盘文件的相关信息 但是我们凭什么可以获得 inode 我们用户操作好像不是通过 inode 操作的而是通过文件名操作的 问题二文件名存储在哪里呢 之前说过在 Linux下 文件名不在 inode 结构中保存为什么 那 文件名存储在哪里呢存储在目录文件 问题三目录是文件吗如何理解 目录文件 目录其实也是文件目录文件 命令 ls -lid 目录文件名 查看该目录文件属性信息如该文件的 inode 号 不卖关子目录文件的内容存储的是文件名和 inode 的映射关系 目录既然是文件当然也就可以打开 举例在终端上打开一个目录文件 1命令 for i in {1..5}; do touch test$i.c; done 在当前目录创建 5 个 test1.c 、test2.c 这样命名的文件 2命令 vim . 查看当前目录文件 既然 目录也是文件目录文件也要有对应的数据块的 目录 inode data block 属性 内容 文件名和 inode 是互为映射的 因为在 Linux 或 Windows 等操作系统中的文件目录下都不能存在同名文件 如何保证文件的命名唯一性呢可以依靠 文件名 和 inode 的映射关系inode 绝对是唯一的相应的文件名也为唯一的。 用户输入文件名同时一般需要带上路径系统就会在该路径下寻找对应文件名通过 文件名和 inode 的映射找到该文件的唯一inode值进行文件磁盘访问的相关操作文件名单向映射唯一一个 inode 值而 inode 值可以被多个文件名映射这种机制是通过硬链接实现的 为什么一个目录能有 读/写/执行 rwx 权限 到这里你应该可以明白为什么一个目录还能有 读、写、执行 权限 若一个目录没有读权限你就不能访问该目录下的文件就是因为目录文件本身内部存储着文件名和inode的映射关系必须要读目录才能拿到该映射关系才能拿到 inode 才能访问该文件 若一个目录没有写权限就无法在该目录下创建文件、删除文件、修改文件名…就是因为目录文件本身用于存储文件名和inode的映射关系必须要有写权限才能将文件名和inode的映射关系写入该目录文件中而 创建文件本质就是将新文件和inode的映射关系写入、删除文件本质就是删除文件和inode的映射关系、修改文件名本质就是修改了新文件名和inode的映射关系 若一个目录没有执行权限就无法进入该目录进不去该目录的本质是打不开该目录文件 问题普通文件和目录文件在底层有区别吗 在我们前面讲解的 磁盘文件系统中是否会区分该文件是普通文件、还是目录文件吗 不会在底层一视同仁 在底层的 磁盘文件系统中文件的属性存储在 inode 中文件的内容存储在 Block 中普通文件和目录文件本质都是 属性 内容因此不会区分文件类型而是按部就班的直接存储属性和内容这样的数据 问题为什么要进行文件名和 inode 的映射 那为什么要设计 inode 和文件名进行映射呢为什么要套这一层呢 效率问题若我们使用文件名表示一个文件系统寻找文件时则需要比对众多的文件名字符串时间复杂度是 O(n) 而文件名映射的 inode 则只需比较 数值类型的 inode 数字串时间复杂度是 O(1) 其实系统管理用户也是通过用户名和 User 编号的映射关系 命令 ls -l 可以看到文件的创建者 命令 ls -ln 带上一个 n 表示能显示数字就显示数字 此时就能看到用户名在系统看来就是一串数字 不只是这几个例子还是什么 GID 组别ID… 系统会主动规避字符串而是使用映射的数字字符串是给人看的数字对系统来说才是高效的 重新理解 ls -l 命令 该命令本质上是打开当前目录的目录文件遍历所有文件和 inode 的映射关系通过 inode 值找到磁盘中该文件的 inode 结构体返回该结构体中存储的文件属性信息将这些文件信息和文件名拼接处理成字符串展示到屏幕上下图中文件名前面的都是该文件存储在 struct inode 中的文件信息 可是问题又来了 找到文件名 - 首先要打开当前目录 - 当前目录也是文件也有文件名的呀 那目录的文件名如何被找到呢 目录的目录的文件名又如何被找到呢套娃呢 此时就需要 逆向的路径解析 逆向路径解析 我如果需要访问 /lesson21 目录文件内容如访问 test.txt 文件就需要拿到目录文件 lesson21 的 inode 找到磁盘中的相关的数据块此时就要目录文件 /code 提供/lesson21 目录文件的 inode值 我如果需要访问目录文件 /code 就需要拿到目录文件 /code 的 inode 找到磁盘中的相关的数据块此时就要目录文件 /112 提供/code 目录文件的 inode值 一环一环本级目录文件的内容访问需要拿到 inode值只能通过上级目录文件拿到该inode值 最终逆向回到根目录而根目录是写死的根目录文件的 inode值可以直接被获取然后访问对应数据块相当于递归到出口了 正解其实路径是被正向解析的逆向只是为了方便理解路径需要被解析的 系统其实是获取一个全路径从根目录开始一次从左向右依次解析路径的 问题为什么任何一个文件都要有路径 就是要一环套一环的嵌套存储数据 没有路径就根本不能直接找到该文件只有通过一个全路径对全路径进行一次解析解环最终才能找到目标 问题为什么每个进程都要有一个 CWD 每个进程都有一个当前工作目录CWD, Current Working Directory主要是为了方便文件路径的引用。当你在命令行中运行程序或脚本时很多时候需要访问或操作文件系统中的文件。这些文件可能位于不同的目录中而使用相对路径来引用它们可以极大地简化这一过程。 当你启动一个新的进程时它会继承其父进程的当前工作目录除非特别指定了另一个工作目录。例如当你从Bash启动一个程序时这个程序默认的当前工作目录就是启动它的那个Bash进程的当前工作目录。这就是为什么即使是像Bash这样的祖先进程也需要维护一个CWD——它不仅用于自身的操作也为所有由它启动的子进程提供了一个起点。 当前工作目录 CWD 最主要作用是用于形成相对路径 如下图一个点 的意思是当前目录两个点 的意思是上级目录 若你在当前目录下打开当前目录的一个 log.txt 文件只需要用当前目录的一个点 文件名的形式组成的路径这就是相对路径 open(./log.txt);在该程序底层表示当前目录的这个点就会用 CWD 替换掉如下 // 假如 cwd 为 /root/code/./log.txt等于 /root/code/log.txt 问题路径需要被重复解析吗 前面我们讲解了一个文件需要被系统做层层的路径解析这个过程其实是不断的在访问磁盘和磁盘进行IO交互的 /home/whb/code/code/112/code/1esson21我们通过路径解析找到文件 lesson21那如果我们还要查找访问当前路径下的 test1.c难道我们还需要将该路径再次重复的解析一遍吗 /home/whb/code/code/112/code/test1.c并不需要Linux系统会对路径进行缓存解释如下 路径缓存和缓存树 struct dentry 结构 路径缓存 在磁盘文件系统中是没有文件路径的概念的如果有也是逻辑上的存在路径本就是从物理层面抽象出来的一种逻辑化的概念 磁盘中仅仅存在纯粹的 inode 和数据块就是纯粹的存储文件及其数据内容 而我们操作系统中又是如何通过例如一个 tree 命令将整个系统的路径关系展示出来的呢 是不是系统遍历了所有文件路径然后不断和磁盘交互得来的肯定不是这样太慢了 其实Linux系统会对路径进行缓存而且就是通过 多叉树这样的结构进行缓存的 缓存路径的多叉树并不会一次性将磁盘中的所有文件路径缓存下来这个树展示的只是磁盘文件系统中的一小部分文件路径 除了一些基本文件和访问几率较大的文件会先被缓存下来还有就是会缓存我们历史访问过的文件路径 如果下次还需使用到该路径就直接查找文件路径缓存树即可 我们使用 find 命令查询文件时 比如在根目录下按照名字查询目标文件find / -name test.txt find 命令查询文件也是要不断访问磁盘对应文件数据块内容 而我们说过首次进行 find 命令查询时可能会比较慢第二次之后就相对比较快了 这就是因为首次查询时系统已经将访问过的文件路径缓存下来了第二次之后的查询就不用过多的访问磁盘只需查询路径树即可 缓存树的 struct dentry 结构 Linux中在内核中维护树状路径结构的内核结构体叫做 struct dentry 树的组成一个 struct dentry 结构实际上算作一种树节点结构多个 struct dentry 结构链接就形成所谓的 文件路径缓存树 struct dentry 结构含有三个主要的字段 父节点指针 指向父亲 struct dentry 节点结构子节点指针 指向孩子 struct dentry 节点结构inode 值本文件对应的 inode 值 每个文件都有dentry每个文件其实都要有对应的 dentry 结构包括普通文件。这样所有被打开的文件就可以在内存中形成整个树形结构。 LRU 淘汰机制整个树形节点也同时会隶属于 LRU(Least Recently Used)最近最少使用)结构中进行节点淘汰。 整个树形节点也同时会隶属于Hash方便快速查找。 更重要的是这个树形结构整体构成了Linux的路径缓存结构打开访问任何文件都在先在这棵树下根据路径进行查找找到就返回属性inode和内容没找到就从磁盘加载路径添加dentry结构缓存新路径。 例如我们需要通过该路径访问该 test 文件/home/test 系统会在系统内存中的文件路径缓存 dentry 树中根据给出的路径正向解析解析过程如下 从根目录开始 从根目录 / 的 dentry 开始根目录的 dentry 通常是内核中固定的。通过根目录的 dentry 获取根目录的 inode。 查找 home 目录 在根目录的 inode 中查找文件名 home 的目录项。如果找到 home 的目录项获取 home 的 inode 号。系统为文件 home 创建一个 struct dentry 结构并链接到文件缓存多叉树中。 查找 test 文件 在 home 目录的 inode 中查找文件名 test 的目录项。如果找到 test 的目录项获取 test 的 inode 号。系统为文件 test 创建一个 struct dentry 结构并链接到文件缓存多叉树中。 这个过程少不了访问磁盘因此路径解析一次通常会将文件路径缓存到文件缓存多叉树上便于下次路径查询利用。 进程层面 这块内容记住就好 通过查询源码进程 task_struct 、文件 struct file 和 文件dentry 之间的关系如下 进程 struct task_struct 中存在文件描述符表 struct files_struct *file该表中存储着文件描述符和文件 struct file 的映射关系而每个加载到内存中的文件都会有对于的 struct file 结构这个结构体中包含着很多和文件在内存中操作相关的字段属性如 const struct file_operations *f_op 操作函数表、struct address_space 内核文件缓冲区、struct path *f_path 文件路径相关属性指向一个path结构体 struct path 该path结构体中包含着 dentry 结构 dentry 结构包含着不少的字段 struct dentry *d_parent 指向父节点 struct list_head d_child指向子节点 struct inode *d_inode指向文件属性结构 inode 图示如下下面有多张图片选自己能看懂的即可 题外话其中进程 task_struct 中 struct fs_struct *fs 指向的 struct fs_struct 结构中存储着 pwd这就是为什么每个进程都有自己的 pwd 这个 pwd 是一种 struct path 路径结构内部也存储着一个 dentry当我们获取当前的 pwd 时就是通过查询 pwd 的 dentry 的所处路径 再次梳理 目录项结构就是 struct dentry 存储在上级目录文件的 inode 结构指向的数据块中 本目录文件目录项结构 struct dentry 中存储着本目录文件的 inode 结构指针通过该指针找到自己的 inode 结构进一步访问自己数据块的内容内容中存储着自己这个目录文件存储的所有下级文件的目录项下级文件名和其 inode 号的映射关系 路径解析核心是依次读取目录文件的 dentry 并通过读取该 dentry 的 inode 查找下一级目录或文件的目录项并获取下级目录或文件的 inode 号。同时每次读取过的目录文件的 dentry 就会加载到内存中并链接到文件缓存多叉树中包括最终需要打开的文件也是先要将该文件的 dentry 结构加载到内存中然后才是通过dentry 结构访问 inode 完整流程 这是一次从路径解析到文件打开再到文件读取的完整流程目的是为了从具体的例子中梳理之前的学习内容包括文件打开需要的struct file 、路径解析、inode 结构等等综合知识点 1. 路径解析 假设我们要访问路径 /home/test 并打开 test 文件路径解析过程如下 (1) 从根目录开始 从根目录 / 的 dentry 开始根目录的 dentry 通常是内核中固定的。通过根目录的 dentry 获取根目录的 inode。 (2) 查找 home 目录 在根目录的 inode 中查找文件名 home 的目录项。如果找到 home 的目录项获取 home 的 inode 号。为文件 home创建一个 struct dentry结构并链接到文件缓存多叉树中。 (3) 查找 test 文件 在 whb 目录的 inode 中查找文件名 test 的目录项。如果找到 test 的目录项获取 test 的 inode 号。为文件 test创建一个 struct dentry结构并链接到文件缓存多叉树中。 2. 文件打开 当文件 test 被打开时内核会执行以下步骤 (1) 获取 inode 结构 通过 test 文件的 inode 号从磁盘中读取 inode 结构并加载到内存中。inode 结构包含文件的元数据如权限、所有者、大小、数据块指针等。 (2) 创建 struct file 结构 内核为 test 文件创建一个 struct file 结构。struct file 结构包含文件描述符、文件操作指针、文件偏移量等信息。struct file 结构中的 inode 指针指向 test 文件的 inode 结构。struct file 结构中的 dentry 指针指向 test 文件的 dentry 结构。 到这一步可以知道其实文件的 struct dentry 结构是在 struct file 结构之前创建的当 struct file 结构创建后内部的属性 dentry 指针才会指向本文件早已创建好的 dentry 结构 (3) 返回文件描述符 内核为 test 文件分配一个文件描述符并将其返回给用户空间。用户空间通过文件描述符来操作文件。 3. 文件读取 当用户调用 read 系统调用读取文件内容时内核会执行以下步骤 (1) 查找数据块 通过 test 文件的 inode 结构中的数据块指针找到文件内容所在的数据块。数据块指针可能包括直接块指针、一级间接块指针、二级间接块指针等。 (2) 加载数据块到内存 将数据块从磁盘读取到内存中存放在内核的文件缓冲区中。 (3) 拷贝数据到用户缓冲区 内核将文件缓冲区中的数据拷贝到用户提供的缓冲区中。用户可以通过 read 系统调用获取文件内容。 分区挂载 分区挂载
http://www.sczhlp.com/news/176484/

相关文章:

  • 网站建设中需要注意的问题一个ip两个网站怎么做
  • 句容市建设局网站陕西建设厅官网首页
  • 网站建设论坛乐清网站
  • 网站建设记什么科目seo关键词排名优化方法
  • 捕鱼网站建设怎么做游戏门户网站
  • 建设银行苏州官网招聘网站现代装修风格2022年
  • 二级域名怎么指向另外一个网站wordpress上传的文件在哪个文件夹
  • 百度不收录网站内页wordpress文章折叠
  • 建筑工程网络计划图怎么做安徽百度seo公司
  • 温州手机网站制作多少钱免费公司网页制作
  • 网站建设需求书模板wordpress编辑器未知错误5.2
  • 龙岗公司网站网络规划设计师第二版pdf百度云
  • 湘潭网络公司网站建设网站开发开题报告关键问题
  • 阿里云心选建站网站首页标题设置
  • MATLAB安装 - -一叶知秋
  • 塑料回收技术创新与可持续发展
  • 共享掩码:TFHE在打包消息上的自举技术
  • 详细介绍:[论文阅读] (38)基于大模型的威胁情报分析与知识图谱构建论文总结(读书笔记)
  • 做网站充值犯法吗大连网站建设佳熙科技
  • 简述网站的建设方案建设集团有限公司
  • 素材网站 模板腾讯广告推广平台入口
  • 柚子网站建设个人 备案 多个网站吗
  • 邯郸专业做网站网站设计应该做哪些
  • 专业的营销型网站建设价格手机和pc合一的网站
  • 专业的做网站的清理大师
  • jquery网站开发实例做水果的有什么网站好
  • 建设电影网站选服务器怎么选wordpress如何发照片
  • 网站优化要多少钱wordpress 关闭
  • 虚拟网站服务器网站内页怎么做
  • 京华建设科技有限公司网站网站建设公司源码