操作系统学习
三.内存管理
16.内存映射文件
传统的文件访问方式:
- open系统调用–打开文件
- seek系统调用–将读写指针移到某个位置
- read系统调用–从读写指针所指位置读入若干数据
- write系统调用–将内存中的指定数据,写回磁盘
内存映射文件的访问方式:
- open系统调用–打开文件
- mmap系统调用–将文件映射到进程的虚拟地址空间
- 以访问内存的方式访问文件数据
- 文件数据的读入、写出由操作系统自动完成
- 进程关闭文件时,操作系统自动将文件被修改的数据写回磁盘
内存映射文件的作用:方便程序员编程,优化I/O效率
多个进程可以映射同一个文件,实现共享
物理内存中,一个文件对应同一份数据,当一个进程修改文件数据时,另一个进程可以立马"看到"
四.文件管理
1.初识
文件就是一组有意义的信息/数据集合
文件有的属性:
- 文件名:同意目录下不允许有重名文件
- 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性
- 类型
- 位置
- 大小
- 创建时间、上次修改时间、文件所有者
- 保护信息:对文件进行保护的访问控制信息
文件分为无结构文件(txt)和有结构文件(Excel)
2.文件的逻辑结构
逻辑结构就是在用户看来,文件内部的数据应该是如何组织起来的
物理结构是在操作系统看来,文件的数据是如何存放在外存的
无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称"流式文件"
有结构文件:由一组相似的记录组成,又称"记录式文件"。根据记录的长度是否相等分为定长记录和可变长记录
有结构文件的按逻辑结构分为顺序文件、索引文件、索引顺序文件
graph LR
A(顺序文件)-->B1(链式存储)
A-->B2(顺序存储)
B1-->C1(无论是定长还是可变长,都无法实现随机存取<br>每次只能从第一个记录开始往后查找)
B2-->C2(可变长记录)
B2-->C3(定长记录)
C2-->D2(无法实现随机存取<br>每次只能从第一个记录开始往后查找)
C3-->E1(可实现随机存取<br>记录长度为L,则第i个记录存放的相对位置是i*L)
C3-->E2(若采用串结构<br>无法快速找到某关键字对应的记录)
C3-->E3(若采用顺序结构<br>可以快速找到某关键字对应的记录)
索引文件:索引表本身是定长记录的顺序文件。所以可以快速找到第i个记录对应的索引项
索引顺序文件:同样为文件建立一张索引表,但不同的是:不是每个记录对应一个索引表项,而是一组记录对应一个索引表项,检索记录时先顺序查找索引表,再顺序查找分组
记录过多时,也可以为顺序文件建立多级索引表
3.文件目录
目录本身就是一种有结构的文件,由一条条记录组成。每条记录对应一个在放在该目录下的文件
目录文件中的一条记录就是一个文件控制块(FCB)
FCB的有序集合称为文件目录,一个FCB就是一个文件目录项
目录结构:
早期操作系统只支持建立一张目录表,每个文件占一个目录项
因为是单级目录,所以所有文件不允许重名
后来有了两级目录结构,分为主文件目录和用户文件目录,但是不能对文件进行分类
后来有了多级目录结构(树形目录结构),这时有了绝对路径和相对路径
但是树形目录不便于用户之间的文件的共享
后来有了无环图目录结构。不同用户之间可以用不同的文件名指向同一个文件,或者一个目录
无环图目录结构有一个共享计数器,当一个用户删除一个文件时,该文件的共享计数器减1,共享计数器为0时,才会删除该节点
注意:共享文件不是复制粘贴
索引结点:检索文件时只需要文件名即可,于是我们把除文件名外的所有信息装到索引结点中,加快了文件检索速度
存放在外存中的结点叫"磁盘索引结点",放入内存的称为"内存索引结点"
4.文件的物理结构(文件分配方式)
类似于内存分页,磁盘中的存储单元也会被分为一个个块/磁盘块/物理块
很多操作系统中,磁盘块的大小与内存块、页面的大小相同
在外存管理中,文件的逻辑地址被分为一个个文件块
于是文件的逻辑地址也可以表示为(逻辑块号, 块内地址)的形式
连续分配方式要求每个文件在磁盘上占有一组连续的块
该分配方式中,物理块号=起始块号+逻辑块号
读取某个磁盘块时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头需要的时间就越长
结论:连续分配的文件在顺序读写时速度最快;文件的拓展十分不方便;会产生磁盘碎片
链式分配–隐式分配:目录记录了文件的起始块号和结束块号,只支持顺序访问,方便文件拓展,不会有碎片
链式分配–显示分配:只有起始块号,把用于链接文件各物理块的指针显式地存放在一张表中,即文件分配表(FAT)
注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存
该分配方式转换逻辑地址时不需要读磁盘操作,所以支持顺序访问,也支持随机访问
缺点:FAT占用存储空间
注意:链接分配默认隐式分配
索引分配:索引分配允许文件离散地分配在各个磁盘块中。系统为每个文件建立一个索引表,表中记录了文件的各个逻辑块对应的物理块,索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块
索引分配方式可以支持随机访问,文件拓展也容易
如果索引表太大,一个索引块放不下,有三个解决方案:
- 链接方案:将多个索引块链接起来存放
- 多层索引:第一层索引块指向第二个索引块,还可有第三层、第四层。各层索引表大小不能超过一个磁盘块。k层索引表查询数据需要看k+1次磁盘I/O
- 混合索引:多种索引分配方式的结合。文件的索引表中,既有直接地址索引,也有一级间接索引,也有两级间接索引
5,文件存储空间管理
存储空间的划分和初始化:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
文件卷C:C盘,文件卷D:D盘
每个文件卷都有目录区和文件区
超大的文件卷会有多个物理磁盘
存储空间管理:①空闲表法
空闲表法记录了空闲盘块的起始位置和长度,适用于连续分配方式
如何分配磁盘块:同样采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间
②空闲链表法:空闲盘块链和空闲盘区链
区别:空闲盘块链是空闲盘块中存储着下一个空闲盘块的指针,空闲盘区链是空闲盘区中的第一个盘块记录了盘区的长度和下一个盘区的指针
空闲盘块链中操作系统保存着链头、链尾指针
如何分配:若某文件申请k个盘块,则从链头开始依次摘下k个盘块分配,并修改空闲链的链头指针
如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针(适用于离散分配的物理结构)
空闲盘区链中操作系统保存着链头、链尾指针
如何分配:若某文件申请k个盘块,则采用首次适应、最佳适应等算法,从链头开始检索,最终找到复合要求的空闲盘区。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据
如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若不相邻,将回收区作为一个单独的一个空闲盘区挂到链尾(离散分配和连续分配都适用)
③位示图:每个二进制对应一个盘块
如何分配:若某文件申请k个盘块,①顺序扫描位示图,找到k个相邻或不相邻的"0",②根据字号、位号算出对应的盘块号,将相应盘块分配给文件,③将相应的位置设置为"1"
如何回收:①根据回收的盘块号计算出对应的字号、位号,②将相应二进制为设为"0"
④成组链接法:UNIX系统中为了应对大型文件系统而采用了该方法
文件卷的目录区中专门用一个磁盘块作为"超级块",当系统启动时需要将超级块读入内存,并且要保证内存与外存中的超级块数据一致
如何分配:检索一个块数足够的空闲块,分配
如何回收:需要将超级块中的数据复制到新回收的块中,让新回收的块成为第一个分组
6.文件的基本操作
创建文件:进行Create系统调用时,需要提供几个主要参数:所需外存空间大小,文件存放路径,文件名
操作系统做的事情:在外存中找到文件所需空间,创建该文件对应的目录项
删除文件:进行Delete系统调用时,需要提供的几个参数:文件存放路径、文件名
操作系统做的事情:找到文件名对应的目录项,回收文件占用的磁盘块
打开文件:进行Open系统调用时,需要提供的几个参数:文件存放路径、文件名、要对文件的操作类型(r:只读,rw:读写)
操作系统做的事情:找到文件名对应的目录项,将目录项复制到内存中的"打开文件表"中。之后用户使用打开文件表的编号来指明要操作的文件
打开文件表:
关闭文件:操作系统做的事情:将进程的打开文件表相应表项删除,回收分配给该文件的内存空间等资源,系统打开文件表的打开计数器count减1,若count==0,则删除对应表项
读文件:进行Read系统调用时,需要提供的几个参数:文件在打开文件表中的索引号,要读入多少数据,读入的数据要存放在内存中的声明位置
操作系统做的事情:从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中
写文件:进行Write系统调用时,需要提供的几个参数:文件在打开文件表中的索引号,要写出多少数据,写出外存的数据要存放在内存中的声明位置
操作系统做的事情:从写指针指向的内存中,将用户指定大小的数据写回写指针指定的外存区域中
7.文件共享
共享意味着系统中只有一份文件,与复制不同
基于索引结点的共享方式(硬链接):
索引结点,是一种文件目录瘦身策略,由于检索文件只需要用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中
索引结点中设置一个链接计数变量count,count的数量说明连接到本索引点上的用户目录项数
某个用户删除文件,则count-1
基于符号链的共享方式(软链接):
在一个Link型的文件中记录共享文件的存放路径(Windows快捷方式)
操作系统根据路径一层层查找目录,最终找到共享文件
若软链接指向的共享文件被删除,Link文件还会在,只是通过link文件去查找共享文件会失败
用软链接访问共享文件会有多次磁盘I/O
8.文件保护
①口令保护:为文件设置口令,用户在访问文件前须提供口令。缺点:口令保存在系统中,不安全
②加密保护:将文件加密,在访问文件时需要提供正确的密码才能正确的解密。缺点:加密/解密需要时间
③访问控制:在每个文件的FCB(或索引结点)中增加一个访问控制列表,记录了各个用户可以对该文件进行的操作。实现灵活,可以实现复杂的文件保护功能
9.文件系统的层次结构
10.文件系统的全局结构(布局)
原始磁盘没有分区
物理格式化:即低级格式化–划分扇区,检测坏扇区,并用备用扇区替换坏扇区
逻辑格式化:磁盘分区(分卷),完成各分区的文件系统初始化,此时就有了C盘、D盘
注意:逻辑格式化后,灰色部分就有实际数据了,白色部分没有
文件系统在内存中的结构:
20.虚拟文件系统
普通的文件系统:
虚拟文件系统:
VFS要求下层的文件系统必须实现某些规定的函数功能,一个新的文件系统想要在操作系统上被使用,就必须满足VFS的需求
每打开一个文件,VFS就会在主存中新建一个vnode,用统一的数据结构表示文件,无论该文集那存储在哪个文件系统,vnode的功能指针指向具体文件系统的函数功能
注意:vnode存储在主存中,而inode既会被调入主存,也会在外存中存储
inode就是i结点号,是文件的索引
文件系统挂载:即文件系统安装/装载
文件系统挂载要做的事:
- 在VFS中注册新挂载的文件系统。内存中的挂载表包含每个文件系统的相关信息
- 新挂载的文件系统,要向VFS提供一个函数地址列表
- 将新文件系统加到挂载点,也就是把新文件系统挂载某个父目录下
五.设备管理
1.I-O设备的概念和分类
I/O就是输入/输出
I/O设备就是可以将数据输入到计算机中,或者可以接受计算机输出数据的外部设备,属于硬件Unix系统将外部设备抽象为一种特殊的文件
2.I/O控制器
I/O设备的机械部分主要用来执行具体I/O操作
I/O设备的电子部分通常是一块插入主板扩充槽的印刷电路板
CPU无法直接控制I/O设备的机械部分,于是有一个电子部分作为CPU和I/O设备的中介,这个电子部分就是I/O控制器,又称设备控制器
I/O控制器的功能:
I/O控制器的组成:CPU与控制器的接口,I/O逻辑,控制器与设备的接口
注意:
- 一个I/O控制器可能对应多个设备
- 数据寄存器、控制寄存器、状态寄存器可能有多个,且这些寄存器都有相对应的地址,才能方便CPU操作。有的计算机会让这些寄存器占用内存地址的一部分,称为内存映像I/O;另一些计算机则采用I/O专用地址,即寄存器独立编址
- 内存映射I/O就是控制器中的寄存器与内存地址统一编址
- 寄存器独立编制就是控制器中的寄存器使用单独地址
3.I/O控制方式
①程序直接控制方式:
- CPU向控制器发出读指令,于是设备启动,并且状态寄存器设为1
- 轮询检查状态寄存器的状态不断地执行程序的循环,若状态位一直是1,说明设备还没准备好
- 输入设备准备好数据后将数据传给控制器,并报告自身状态
- 控制器将输入的数据放到数据寄存器中,并将状态改为0
- CPU发现设备已就绪,即可将数据寄存器中的内容读入CPU的寄存器中,再把CPU寄存器中的内容放入内存
- 若还要继续读入数据,则CPU继续发出读指令
缺点:CPU利用率低
②中断驱动方式:
中断驱动就是CPU检测到中断信号后,会保存当前的运行环境信息,转去其它进程
缺点:每个字在I/O设备与内存之间的传输,都需要经过CPU,而频繁的中断处理会消耗较多的CPU时间
③DMA方式(直接存储器存取):
传送单位是块,而不是字
数据的流向是从设备直接放入内存,或者从内存直接到设备,不需要CPU作为中介
DMA控制器:
缺点:CPU每发出一条I/O指令,只能读写一个或多个连续的数据块
④通道控制方式:
通道:一种硬件,可以理解是弱化版的CPU,通道可以识别并执行一系列通道指令
通道与CPU相比:通道可以执行的指令很单一,通道程序是放在主机内存中的,也就是说与CPU共享内存
几种方式的比较:
4.I/O软件层次结构
①用户层软件:用户层软件实现了与用户交互的借口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作
②设备独立性软件:设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现,如:数据缓冲区管理
设备独立性软件需要通过"逻辑设备表"来确定逻辑设备对应的物理设备,并找到对应的设备驱动程序
有两种方式管理逻辑设备表(LUT):
- 整个系统只设置一张LUT,这意味着用户不能使用相同的逻辑设备名
- 为每个用户设置一张LUT,系统会在用户登录时为其建立一个用户管理进程,而LUT就存放在用户管理进程的PCB中
③设备驱动程序:主要负责对硬件设备的具体控制,将上层发出的一系列指令转化为特定设备能理解的一系列操作
④中断处理程序:当I/O任务完成时,I/O控制器就会发送一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行
⑤硬件:执行I/O操作,由机械部分、电子部分组成
5.输入输出应用程序接口和程序驱动接口
字符设备接口:get/put系统调用
快设备接口:read/write系统调用;向块设备的读写指针位置读/写多个字符
网络设备接口(网络套接字(socket)接口):socket系统调用:创建一个网络套接字,需指明网络协议。bind:将套接字绑定到某个本地端口,connect:将套接字连接到远程地址,read/write:从套接字读/写数据
阻塞I/O:应用程序发出I/O系统调用,进程需转为阻塞态等待
非阻塞I/O:应用程序发出I/O系统调用,系统调用可迅速返回,进程无需阻塞等待
设备驱动程序接口需要向上一层的设备独立性软件提供统一的接口
6.I/O核心子系统
设备独立性软件、设备驱动程序、中断处理程序属于操作系统的内核部分,即I/O系统或I/O核心子系统
I/O调度、设备保护是在设备独立性软件层面实现的功能
I/O调度:用某种算法确定一个好的顺序来处理各个I/O请求
设备保护:操作系统需要实现文件保护功能,不同的用户对各个文件有不同的访问权限
7.假脱机技术
脱机技术:脱离主机的控制进行输入/输出操作,缓解快速的CPU与慢速的I/O设备的速度矛盾
假脱机技术(SPOOLing):使用软件的方式来模拟脱机技术
SPOOLing系统的构成:
8.设备的分配与回收
设备分配时需要考虑的因素:设备的固有属性、设备分配算法、设备分配中的安全性
设备的固有属性可分为三种:独占设备、共享设备、虚拟设备
从安全性考虑,设备有两种方式:安全分配方式:为进程分配一个设备后就将其阻塞,本次I/O完成后才将其唤醒。不安全分配方式:不阻塞
静态分配和动态分配:
静态分配:进程运行前为其分配所需资源,运行结束后归还资源
动态分配:进程运行过程中动态申请设备资源
设备管理中的数据结构:
设备、控制器、通道的关系:
一个通道可以控制多个设备控制器,每个设备控制器可以控制多个设备
设备控制表(DCT):系统为每个设备配置一张DCT,用于记录设备情况
控制器控制表(COCT):每个设备控制器都会对应一张COCT。操作系统根据COCT的信息对控制器进行管理和操作
通道控制表(CHCT):每个通道都会对应一张CHCT,操作系统根据CHCT的信息对通道进行操作和管理
系统设备表(SDT):记录了系统全部设备的情况,每个设备对应一个表目
设备分配的步骤:
- 根据进程请求的物理设备名查找SDT
- 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配
- 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程
- 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程
缺点:用户编程复杂
改进后的步骤:
9.缓冲区管理
缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可以利用内存作为缓冲区
硬件作为缓冲区成本较高,所以更多的是内存作为缓冲区
缓冲区的功能:缓解快速的CPU与慢速的I/O设备的速度矛盾
单缓冲:操作系统会在主存中为其分配一个缓冲区
注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把胡数据传出;当缓冲区为空时,可以往缓冲区冲入数据
单缓冲平均耗时:
双缓冲:操作系统为其分配两个缓冲区
平均耗时:Max(T, C+M)
使用单/双缓冲在通信时的区别:双缓冲可以实现双向的数据传输
循环缓冲区:将多个大小相等的缓冲区链接成一个循环队列
缓冲池:由一系列缓冲区组成,缓冲区可以按使用状况分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)
另外,根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:用于收容输入数据的工作缓冲区(hin)、用于提取输入数据的工作缓冲区(sin)、用于收容输出数据的工作缓冲区(hout)、用于提取输出数据的工作缓冲区(sout)
10.磁盘的结构
磁盘的表面由一些磁性物质组成,可以用这些物质来记录二进制数据
磁盘的盘面被划分为一个个磁道
一个磁道又被划分为一个个扇区,每个扇区是一个磁盘块。各个扇区的数据量相同
磁头从目标扇区划过,才能读/写数据
每个盘面对应一个磁头
一个盘片可能对应两个盘面
所有磁头是连在同一个磁臂上面的
所有盘面中相对位置相同的磁道组成柱面
可用(柱面号、盘面号、扇区号)
磁盘的分类:活动头磁盘:磁头可以来回移动;固定头磁盘:每个磁道有一个磁头
11.磁盘调度算法
寻找时间=启动磁头臂的时间+移动磁头的时间
延迟时间=1/(2磁盘转速)
传输时间=读写的字节数/(磁盘转速每个磁道上的字节数)
①先来先服务算法(FCFS):性能接近随机寻道算法
②最短寻找时间优先算法(SSTF):其实就是贪心算法的思想,只选择眼前最优,缺点:可能饥饿
③扫描算法(SCAN):只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动,也叫电梯算法
缺点:对各个位置磁道的响应不平均
④LOOK调度算法:如果磁头在移动方向上没有别的请求,则立即改变磁头移动方向,缺点:同SCAN算法
⑤循环扫描算法(C-SCAN):磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接移动而不处理任何请求,缺点:平均寻道时间更长
⑥C-LOOK算法:磁头返回时会回到第一个磁道访问请求的位置即可
12.减少延迟时间的方法
延迟时间:将目标扇区转到磁头下面花的时间
磁头读入一个扇区数据后需要一小段时间处理,如果逻辑上相邻的扇区在物理上也相邻,则读入几个连续的逻辑扇区,延迟时间会增加
①交替编号:让逻辑上相邻的扇区在物理上有一定间隔,可以使读取连续的逻辑扇区所需要的延迟时间更小
②错位命名:0号盘面的扇区名与1号盘面的扇区名相错开
磁盘地址结构的设计:磁盘的物理地址是(柱面号、盘面号、扇区号)的意义:读取地址连续的磁盘块时,采用上述地址结构可以减少磁头移动消耗的时间
13.磁盘的管理
磁盘初始化:
- 进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区,一个扇区通常可分为头、数据区域、尾三个部分组成
- 将磁盘分区,每个分区由若干柱面组成
- 进行逻辑格式化,创建文件系统。包括创建根目录、初始化存储空间管理所用的数据结构
引导块:
计算机开机时需要进行一系列初始化的工作,这些工作是通过直行初始化程序完成的。
ROM中只存放很小的"自举装入程序",开机时计算机先运行"自举装入程序",通过直行该程序就可找到引导块,并将完整的"自举程序"读入内存,完成初始化
完整的"自举程序"放在磁盘的启动块(即引导块/启动分区)上,启动块位于磁盘的固定位置
拥有启动分区的磁盘成为启动磁盘或系统磁盘
坏块的管理:对于简单的磁盘,会在FAT表上标明;对于复杂的磁盘,磁盘控制器会维护一个坏块链表,会保留一些备用扇区,用于替换坏块
14.固态硬盘SSD
原理:闪存技术,属于电可擦除ROM,即EEPROM
组成:闪存翻译层、存储介质:多个闪存芯片,每个芯片包含多个块,每个块包含多个页
读写性能特性:
- 以页为单位读写–相当于磁盘的扇区
- 以块为单位擦除
- 支持随机访问,系统给定一个逻辑地址,闪存翻译层可通过电路迅速定位到对于的物理地址
- 读快、写满。要写的页如果由数据,则不能写入,需要将块内其他页全部复制到一个新的块中,再写入新的页
特点:
- 读写速度快
- 擦除的次数过多块会坏掉
- 无噪音
磨损均衡技术:将擦除平均到各个块上
动态磨损均衡:写入数据时,优先选择擦除次数少的新块
静态磨损均衡:SSD监测并自动进行数据分配、迁移,让老旧的闪存块承担以读为主的存储任务,让新的块承担更多的写任务