1.对于前面知识的一些复习:
系统调用有哪些:系统调用有哪些函数-CSDN博客
重定向的本质:就是堆文件描述符里面下标的内容进行拷贝。
标准输入,输出,错误,典型的重定向。
标志位:O_APPEND,O_RDONLY。
一切皆文件的理解:
功能方法实现是不一样的,但是接口种类一样。
读写都是read和write
对某种设备进行读写访问的时候,看到的都是read或者write
在进程角度:操作系统看到一个file就等同于看到一个文件,操作系统骗了进程
让进程以为,所有东西都是文件缓冲区:
大部分都是语言层面的缓冲区。
显示器:行刷新
向文件:全缓冲用一次系统调用来进行多次写入。
、
2.对前面_gblic的完善usercode.c调用函数实现系统调用
2.1不带\n--->不做刷新
由于写入文件是全缓冲,当取消\n的时候,那么就不会进行刷新,只有当程序结束的时候,close(filep),就会自动进行刷新,刷新到内核,然后在刷新到文件当中去,这样就会把缓冲区内部的全部写入到一起文件当中去。
2.2写完之后,立马刷新
2.3 fsync数据立即刷新
把数据立马刷新到外设力:fsync
把该文件表舒服所对应的内容反应到外设上。
3.Ext系列文件系统
3-1磁盘
引入
文件 = 内容+属性
被打开的文件 ->基础IO->内存
没被打开的文件->在磁盘上->把文件放在磁盘上,被我们找到???
文件是一种树状的目录结构,
分有多个路径(绝对和相对)最终目的:保存到磁盘上,最基本的诉求就是被我们找到。 -->文件系统的工作。
了解磁盘
磁盘分为企业级磁盘和桌面型磁盘。现在基本上就是固态磁盘。
特点:
1.机械磁盘是计算机中唯一的一个机械设备
2.磁盘属于外设
3.慢
4.容量大,价格便宜
服务器:里面都是磁盘
机柜:放服务器的
所有的机柜链接起来也就是机房。
不同的机柜执行不同的功能。
机房:
大公司,很大,很贵,大公司才具备。
磁盘工作原理
磁盘:表面很光滑。
想像:有很多的小磁铁组成
比如说:
南极是1,北极是0
磁盘用南北极表示二进制。就像网络用波形图的高低表示01用南北极表示二进制的写入,改变南北极来改变01.
磁盘组成
磁道:磁盘由一系列的同心圆组成。
扇区:把磁道分割成一小节节。一个小扇区可以储存512字节
磁盘存储的基本单位:一扇区(512字节)。
修改:改一个比特位,加载512字节,修改,再返回给该扇区。
磁盘分有多层。
3-2如何定位⼀个扇区呢?
CHS定址法:柱面 磁头 扇区,Cylind Head Sector
• 可以先定位磁头(header)
• 确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
• 定位⼀个扇区(sector)
具体:
⽂件=内容+属性都是数据,⽆⾮就是占据那⼏个扇区的问题!能定位⼀个扇区了,能不能定位多个扇 区呢?
• 扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。
• 磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头
• 磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道...,靠近主轴的同⼼圆⽤于停靠磁 头,不存储数据
• 柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数
• 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
• 圆盘(platter)数:就是盘⽚的数量
• 磁盘容量=磁头数×磁道(柱⾯)数×每道扇区数×每扇区字节数
• 细节:传动臂上的磁头是共进退的(这点⽐较重要,后⾯会说明)
扇区长短不会影响容量(暂不做考略)
fdisk -l
3-3磁盘逻辑结构
1.理解过程
就像卷起来的山楂条,每一小条也就可以看做是储存的扇区。
而这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA。数组下标。
2.真实过程(逻辑抽象)
磁盘,也就是线性结构,定位一个扇区用1个数字,使用数组下标。
操作系统管理变成对数组的管理。
⼀个细节:传动臂上的磁头是共进退的
柱⾯是⼀个逻辑上的概念,其实就是每⼀⾯上,相同半径的磁道逻辑上构成柱⾯。 所以,磁盘物理上分了很多⾯,但是在我们看来,逻辑上,磁盘整体是由“柱⾯”卷起来的。
所以,磁盘的真实情况是: 磁道: 某⼀盘⾯的某⼀个磁道展开: 即:⼀维数组
柱⾯: 整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:
• 柱⾯上的每个磁道,扇区个数是⼀样的
• 这不就是⼆维数组吗
整盘:
所有,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder),在确定柱⾯内哪⼀个磁道(其实就是磁头位置, Head),在确定扇区(Sector),所以就有了CHS。 我们之前学过C/C++的数组,在我们看来,其实全部都是⼀维数组。
每个扇区都有一个下标,这个叫做LBA
LBA地址转成CHS地址,CHS如何转换成为LBA地址。
4.引入文件系统
4-1引入块设备
为什么要引入块?
字符设备不支持随机读取
硬盘是典型的块设备。
依次读取一个扇区效率太低了。
OS访问磁盘不易扇区为单位而是以块为单位->块是文件取的最小的单位。!
一个块对应8个扇区,一个扇区512字节,一个块就对应4096字节。
怎么计算块
• 磁盘就是⼀个三维数组,我们把它看待成为⼀个"⼀维数组",数组下标就是LBA,每个元素都是扇 区
• 每个扇区都有LBA,那么8个扇区⼀个块,每⼀个块的地址我们也能算出来。
• 知道LBA:块号=LBA/8
• 知道块号:LAB=块号*8+n.(n是块内第⼏个扇区)
块*8+【0~7】 = 任意扇区的LBA
文件系统,使用磁盘块,事宜4KB为单位,对文件的管理转化成对块的管理。
引入分区概念
柱⾯是分区的最⼩单位,我们可以利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起 始柱⾯和结束柱⾯号码。此时我们可以将硬盘上的柱⾯(分区)进⾏平铺,将其想象成⼀个⼤的平 ⾯,如下图所⽰
比如说:
把对800GB的管理,转化成对300GB管理,这就叫分区。
再把300GB分成30GB,管理后,后序直接拷贝管理
引入inode概念:属性结构体
属性结构体:
属性都是innode节后提,大小是固定的。128字节。
文件系统的载体是分区 ?什么意思
Linux下内容和属性是分开存储的。
每个文件有大小,字段,类型,
一个文件属性就是一个struct inode对象。
所有文件的属性大小都是一样的----128字节
“文件名不会保存在inode中,文件名是string对象,,大小不一,会导致inode大小发生变化”。
4-2块组的内部组成(Block group)
Data Block
数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:
• 对于普通⽂件,⽂件的数据存储在数据块中。
• 对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls-l命令 看到的其它信息保存在该⽂件的inode中。
• Block号按照分区划分,不可跨分区
inode Table
• 存放⽂件属性如⽂件⼤⼩,所有者,最近修改时间等
• 当前分组所有Inode属性的集合
• inode编号以分区为单位,整体划分,不可跨分区
inode和数据块,都是跨组编号的。
inode和数据块,不能跨分区。
结论:在同一份分区内部,inode编号,和块号都是唯一的。
数据区:Data Block
数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:
• 对于普通⽂件,⽂件的数据存储在数据块中。
• 对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls-l命令 看到的其它信息保存在该⽂件的inode中。
块位图(Block Bitmap)
*记录着Data Block中那个数据块已经被占用,那个数据没有被占用。
置为1,申请被占用,置为0,释放空间。
inode位图(inode Bitmap)
每个bit表示一个inode是否空闲可用
GDT(group descriptoe table)
块组描述符表,
Super Block:超级块

4-3格式化:把Block Group里面的信息,写入到文件系统
操作系统需要管理信息加载到内存里,在内存里面操作完,再写入内存里面。
比如说:有10个super block那就把他们都加载到内存里面,进行执行。10个super block对应10个分区,链接起来链表,转化成对链表的管理删除文件管理文件:两个bitmap,加载到内存里,进行操作
磁盘当中,管理信息加载到内存里面,在内存里面操作完,再写回内存里面。
4-4如何找文件?
拿到一个文件的inode,就可以找到该文件的所有信息
属性信息->数据块信息。
一个inode只能在对应分区有效。
访问一个文件就需要知道它的inode.
先打开当前所在的路径,
要读取文件里面相应的内容,首先就先需要在data block 里面找到inode和文件名的对应关系,然后,再根据对应关系找到我们需要的inode,再根据inode可以得到文件信息的特性,实现对文件的查找。
但是由于我们访问任何文件都必须带有路径!!!
找任何文件,从根目录开始,进行路径解析(文件名->inode->在根据inode实现对文件查找。),找到相应的文件!!
默认路径,绝对路径,相对路径。
ls 进程提供当前路径,code.c你提供的,两者一拼,绝对路径就有了。系统自动从根目录依次解析,最后找到对应的inode,实现找到文件。
4-5路径解析:
问题:
打开当前⼯作⽬录⽂件,查看当前⼯作⽬录⽂件的内容?当前⼯作⽬录不也是⽂件吗?
答案1:所以也要打开:当前⼯作⽬录的上级⽬录,额....,上级⽬录不也是⽬录吗??不还是上⾯的问 题吗?
我们访问 当前⼯作⽬录不也是只知道当前⼯作⽬录的⽂件名吗?
答案2:所以类似"递归",需要把路径中所有的⽬录全部解析,出⼝是"/"根⽬录。
要访问它,不也得知道当前⼯作⽬录的inode 吗?
最终答案3:⽽实际上,任何⽂件,都有路径,访问⽬标⽂件,⽐如:
/home/whb/code/test/test/test.c
都要从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问 到test.c。这个过程叫做Linux路径解析。
所以说向上找到根目录就可以了。
4-6路径缓存:struct dentry
磁盘上没有目录:
那tree是哪里的?为什么Linux会具有tree命令?
访问任何文件,都要从根目录下进行路径解析吗?
出现效率低下问题。从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问 到test.c。这个过程叫做Linux路径解析
100次访问,100次解析吗?
|
解决:操作系统,在进行路径解析的时候,会把历史访问的所有目录(路径)形成一颗多叉树,进行保存--->Linux系统的树状目录结构。
路径记录在内存当中,dentry!!
访问的code.c的时候,叶子结点一定是空目录或者是文件。
code.c也挂在路径缓存上了。
例子:
第一次卡了一会 ,才出来
第二次,由于第一次,则已经创建了该文件的struct dentry结构体,那么再一次查找的时候,由于已经记录,所以一下就可以跑出来。
第二次秒出
4-7 怎么确定inode是哪一个分区的?
磁盘
vda1:第一个分区
把/dev/zero output放到./disk.img里面去,bs 大小等于1M,count = 5//???什么意思
#制作一个大文件
要访问一个分区,就要把分区和一个特定的目录进行挂在一起,
通过进去不同的目录->进入不同的分区
ls /dev/zero of(output) =mkfs.ext:需要的文件系统
df -h???:查看文件系统信息,
mount on:把分区挂在到哪个目录上。sudo mount -t ext4 ./disk.img ./dir 把磁盘挂载到./dir上面
sudo unmont ./dir、解除挂载。
分区挂载后才可以使用。
该路径的前缀
不同的分区,挂载路径不一样
根据路径前缀,路径来区分不同的分区。
所有的分区和路径有关。挂载:把一个分区挂载到一个目录下,可以根据该目录区分在那个分区,反过来也就是可以根据目录->路径前缀和来判断当前文件处于在哪一个分区。
5.软硬链接
5-1硬链接
硬链接本质不是一个独立的文件,它没有独立的inode。
本质是一组新的文件民和目标inode number的映射关系功能:其实在linux中可以让多个⽂件名对应 于同⼀个inode。
[root@localhost linux]# touch abc
[root@localhost linux]# ln abc def
[root@localhost linux]# ls -li abc def
263466 abc
263466 def
用途:对文件进行备份。
• abc和def的链接状态完全相同,他们被称为指向⽂件的硬链接。内核记录了这个连接数,inode 263466的硬连接数为2。
• 我们在删除⽂件时⼲了两件事情:1.在⽬录中将对应的记录删除,2.将硬连接数-1,如果为0,则 将对应的磁盘释放。
5-2软连接
软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和 被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。
[root@localhost linux]# ln -s abc.s abc
[root@localhost linux]# ls -li
263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 abc
261678 lrwxrwxrwx. 1 root root 3 9⽉ 15 17:53 abc.s -> abc
263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 def
![]()
软连接:是一个独立的文件,应为他有独立的inode.
文件内容+文件属性 软连接能干啥?
相当于windows下的快捷方式,保存目标文件的路径。