文件系统概论
1:一个磁头可以定位一个磁道 ,一个磁道包含多个扇区,一批磁头可以确定多个扇区
2:定址顺序:先确定你在哪一个柱面上,然后在确定是在哪一个刺头上,(哪一个扇区)
3:如何定位磁盘中的任何一个扇区
sector array[][][] 三维数组
在c语言/c++中,所有的数组在我们的心目中,只有一维数组 把磁盘想象成一个一位数组
CHS地址就是一个扇区的详细地址
LBA地址:(操作系统逻辑抽象的地址)抽象地址,整个数组,需要物理定义吗? answer:不需要
获取几个参数即可:总容量 扇区大小 柱面 盘面 磁道上有多少个扇区
把操作系统理解成:01二进制数字发送给硬件的包工头
编译器 = 翻译官:把人类代码翻译成 01 机器码(生成二进制);
操作系统 = 工地总管:手里已经有现成 01 指令,合理分配 CPU、内存、硬盘给各个程序,指挥硬件干活;
CPU = 工人:只识别 01 高低电平,执行运算。
硬件工作原理:得到01这些二进制机器码(高电平和低电平)
高级代码 → 编译器生成二进制 01 机器码
→ 操作系统加载程序到内存、分配硬件资源
→ CPU 读取内存中的 01 指令,译码生成内部控制电平
→ CPU 通过总线向外设发送 01 控制信号
→ CPU、外设芯片根据 01 电平组合,驱动电路完成运算、读写、输出等硬件动作
操作系统真正的核心作用(核心 4 点)
- 硬件资源统一管理(最核心)
计算机硬件只有一套 CPU、内存、硬盘、网卡,多个程序同时运行会争抢硬件。
OS 隔离硬件,统一分配资源:
内存管理:给每个程序划分独立内存空间,防止程序互相篡改数据;
进程调度:分时复用 CPU,让多个程序 “同时运行”;
设备管理:封装磁盘、网卡、显卡驱动,应用不用直接操作硬件寄存器。 - 向上提供统一接口,屏蔽底层 01 硬件细节
应用程序不用写底层二进制指令操控硬件,只需要调用 OS 提供的 API(读写文件、网络发送、打印输出)。
OS 内部再把 API 请求翻译成底层二进制指令交给 CPU 执行,是中转者,不是 01 生成者。 - 程序调度与执行控制
负责程序加载、创建进程、分配 CPU 时间、回收结束程序资源;
没有 OS,只能裸机单次运行一段二进制程序,无法多程序并发。 - 提供上层基础服务
文件系统、网络协议栈、权限管理、中断处理、图形界面等,这些功能都需要 OS 统筹实现。
程序到最后就是二进制指令 操作系统也可以看成是二进制指令 这些程序在运行的时候,二进制代码会被加载到内存
唯一直接和内存双向打交道的硬件就是 CPU
有的硬件不在操作系统的调控之下,也可以实现一定的功能
硬件使用:得到二进制指令
小细节变动,大范围改变
你动他了 ,不动他不会变的
高低电平完成指令
二进制码可以控制硬件 可以把二进制代码看成是流(血液),调控全身(要有流思想)想底层问题就会容易一些
一个块由四个扇区构成。一个分区由多少个块构成
Disk MBR(定位操作系统分区表) partion1 partion2 partion3 partion4文件系统是以分区为单位的! 不可以跨一些分区做一些事情
partion (boot sector) (ext2 file system). 文件=文件属性(原数据)+文件内容
EXT* 系列的文件系统,属性和内容是分开存的
block group :
每个文件对一个inode 结构体 这个结构体里面的参数可以指明文件占据哪些块
一个文件可以占据两个block分组(块组)
inode是有位图来表明inode使用情况的
block也是有位图来表明块组(分组)使用情况的
当我们删除一个位的时候,只需要改变两个位图就可以
block bitmap 和 inode bitmap
eg:我们下载一个2g的电影的时候很慢,但是我们删除这个电影的时候很快
磁盘:
1.分区
2.格式化 写入文件系统信息
1.文件系统访问文件,只能通过inode number
2.目录是文件吗?是文件=属性+内容
目录内容保存什么呢?文件名:inode number的映射关系
目录文件:读权限 写权限 创建文件 删除文件
普通文件和目录在磁盘是以同样方式保存的
你想访问一个文件,操作系统,先把你的目录文件打开 查找文件名,找到inode
计算机想要对数据进行操作,这些数据必须到内存
目录是文件 目录=文件属性(拥有者,所属组,权限)+文件内容
内容应该保存什么呢?? inode number->partion->指定文件
我们平常查找文件使用的是文件名称,但是文件名称并没有被写进inode结构体的属性当中
所以目录文件里面保存的是文件名称和inode的映射关系
新建一个文件,就会在这个对应的目录文件中写入inode和文件名的对应关系
这个时候要是你没有这个目录的写权限,这个时候就不可以进行文件的创建
要是没有目录文件的读权限,这个时候你就找不到对应的文件
站在磁盘的角度上,在存储方式上,普通文件和目录的存储方式是一模一样的
二进制里只有普通运算指令 + 触发系统调用的陷阱指令;
程序不能直接调用操作系统底层函数,只能通过系统调用号向内核发起请求,由内核代为执行底层逻辑。
纸上演算(算法逻辑)= 编译器语法分析、代码优化;
拿笔、翻本子、开灯、拿草稿纸(资源 / 硬件操作)= 系统调用,必须依赖外界(操作系统)帮忙。
程序编译好的二进制指令中没有调用底层硬件的方法
我们可以编写一段程序来查看目录文件中的文件内容
在目录文件的文件内容中不允许出现同名文件,该目录下的目录文件和其他文件不可以重名
/home/whb/code/118/linux/code/lesson/dir
我们打开dir的时候,就需要把lesson code linux 118 code whb home
从左向右依次打开 这个就叫做路径解析 每一次都是从根目录开始解析
/文件名inode文件内容是已知的。操作系统开机的时候就需要被确定!否则就会报错
任何一个linux文件,都直接或者间接包含一个路径
ls -li hello.txt 这个操作没有包含路径啊,这个咋知道我打开的是哪个路径下的hello.txt文件的
因为环境已经记录了此时的路径 echo $PWD
所有文件,都必须有路径(只关注绝对路径),包括普通文件和目录
shell进程cwd 由不同的角色提供 linux任何一个文件都要从根目录开始解析
要是打开每一个文件都要从根目录开始解析 这个时候就会出现路径缓存
os要对缓存的目录内容进行管理 先描述,在组织
struct denty 只在内存中存在 普通目录或者文件中来的 组织方式:核心数据结构:多叉树多数据结构,把目录结构组织在内存中
我们可以根据文件名,在一个分区中,获取任意一个文件所在的位置和属性内容
你怎么确定,你的文件在哪一个分区中呢
一块磁盘,要被用户使用,应该经过哪些步骤
1.分区
2.格式化 (想每一个分区写入文件系统(各种位图信息,标志位等等))
3.格式化完成的这些信息在linux中是无法被使用的。 linux系统中,分区需要进行挂载
挂载(把指定的分区,和linux系统中指定的目录关联起来)
因为和目录关联起来,就可以通过进入目录,表示进入特定分区
解析目录的时候看最近的挂载点。从而确定分区。 第一个inode 展开这个inode之后就可以看到目录里面的内容 解析目录就是看目录对应的inode的文件属性和问价内容
struct dentry 核心存三样东西:
当前这一层的文件名;
父目录 dentry、子目录链表,构成目录树;
指向对应 inode 的指针;
外加引用计数用于缓存管理。
硬链接的时候 ,两个文件名,两个独立的struct dentry,指向同一个inode
创建一个目录的时候,inode计数是2 因为.这个文件与目录文件进行了硬链接 要是还有下级目录的话,这个时候inode链接计数就会是3 文件本身 (.) (…)
要是一个文件目录的inode计数是18 这个时候就是16个路径下目录文件
