操作系统

来源:互联网 发布:美人一笑也倾城网络剧 编辑:程序博客网 时间:2024/06/05 12:43

微内核

1.微内核:将所有的非基本部分从内核中移走,并将它们实现为系统程序或用户程序。微内核通常包括最小的进程和内存管理和通信功能。好处是便于扩充操作系统。由于绝大多数服务都是被当作用户而不是内核进程运行的,因此微内核更加的安全可靠。
2.在微内核系统中: 进程——只是资源分配的单位,而不再是调度运行的单位 线程——是进程执行运算的最小单位 。一个进程可有多个线程,它们共享进程的资源

进程

1.比较进程,程序,线程(简答题)
进程:执行中的程序,但并不完全。进程不只是程序代码,程序代码有时称为代码段,进程还包括当前活动通过程序计数器的值和处理器寄存器的内容来表示。另外,进程通常还包括堆栈段(包括临时数据,如函数参数,变量和返回地址等)和数据段(有全局变量)。
程序:程序本身不是进程,只是被动的实体,如储存在磁盘上包含一系列指令的文件内容。而进程是活体,他有一个计数器用来表示下一个要执行的命令和相关资源集合。当一个文件被装入内存时,一个程序才能成为进程。
线程:是CPU使用的基本单元,它是由线程ID,程序计数器,寄存器集合和栈组成。一个进程可以有多个线程。
2.进程状态:三种状态 (每种的含义,结合图理解,怎么转换)
就cpu调度,从进程状态而言属于哪个过程(选择题),答案:就绪到执行。
进程状态:
新的:进程正在被创建
运行:指令正在被执行
等待:进程等待某个事件的发生
就绪:进程等待分配处理器
终止:进程完成执行

就cpu调度,从进程状态而言属于哪个过程?
就绪过程
3.PCB (进程的唯一表示,要知道他存储了哪些东西)。
PCB称为进程控制块,组成由:进程状态,程序计数器,cpu存储器,CPU调度信息,内存管理信息,记账信息,I/O状态信息。
4.进程调度:①长程调度,作业调度。②短程调度,cpu调度,进程调度
③中程调度(结合交换理解) ④多道程序度 ⑤I/O型进程 ⑥ CPU型进程
⑦上下文切换
长期调度:从缓冲池中选择进程,并装入内存准备执行。长期调度程序控制多道程序设计的程度。
短期调度或CPU调度程序从准备执行的执行程序中选择进程,并为之分配CPU。
中期调度程序:将进程从内存中移出(CPU竞争),从而降低多道程序设计的程度,之后,程序能被重新调入内存,并从中断处继续执行。这种方案称为交换。
上下文切换:将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务称为上下文切换。当发生中断时,系统需要保存当前运行进程的上下文,而在其处理完成后能恢复上下文,即先中断,后继续。(保存状态和恢复状态)
5.进程操作:
①进程创建和终止:申请PCB表→分配资源→填PCB表(进程名,ID,Parent、Resource )→插到Ready 队列 (重点,考的几率大)LINUX和WINDOWS创建进程的区别 书上 3.3.1好好看 例子也要看
进程创建:
进程终止:当进程完成执行最后的语句并使用系统调用exit()请求系统删除自身时,进程终止。
②进程间通信:IPC,共享内存,消息队列
独立进程与协作进程,协作进程需要一种通信机制(就叫做IPC)允许进程相互交换数据与信息。通信基本有两种模式:共享内存与消息传递。
共享内存的进程间通信需要进程建立共享内存区域
③c-s模式:Socket,RPC,IPC

线程

1.内核线程和用户线程
用户层的用户线程和内核层的内核线程。用户线程受内核支持,而无需内核管理;内核线程由操作系统直接支持和管理
2.怎么把用户线程映射到内核线程
多线程模型:一对一,多对一,多对多
多对一模型;将许多用户线程映射到一个内核线程。线程管理是由线程库在用户空间进行的。如果一个线程执行了阻塞系统调用,那么整个进程会阻塞。

一对一模型:将每个用户线程映射到一个内核线程。,该模型在一个线程执行阻塞系统并发时,能允许另一个线程继续执行,所以比多对一有更好的并发性。但会造成资源的浪费。

多对多模型:解决了以上两者的问题,多路复用了许多用户线程到同样数量或者更小数量的内核线程上。

CPU调度

一、CPU调度决策可在如下4种情况下发生:
1、当一个进程从运行状态切换到等待状态(例如,I/O请求或调用wait等待一个子进程的终止)
2、当一个进程从运行状态切换到就绪状态(例如,当出现中断时)
3、当一个进程从等待状态切换到就绪状态(例如,I/O完成)
4、当一个进程终止时

二、调度准则
1、CPU使用率:需要使CPU尽可能忙
2、吞吐量:一个时间单元内所完成的进程的数量
3、周转时间:从进程提交到进程完成的时间段
4、等待时间:在就绪队列中等待所花费的时间总和
5、响应时间:从提交请求到产生第一响应的时间
需要使前两者最大化,而后三者最小化

三、调度算法
1、先到先服务调度(FCFS)
代码编写简单且容易理解,平均等待时间较长。非抢占
2、最短作业优先调度(SJF)
平均等待时间最少,是最优的。经常用于长期调度。可能是抢占或非抢占
3、优先级调度
主要问题是饥饿,解决方法是老化。可能是抢占或非抢占
4、轮转法调度(RR):是可抢占的
5、多级队列调度

进程同步

1、竞争条件:多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关。
2、临界区:每个进程有一个代码段称为临界区,在该区中进程可能改变共同变量、更新一个表、写一个文件等。
临界资源:只允许同一个进程在同一时间访问的资源。多个进程竞争使用共享数据。
3、临界区问题的解答必须满足如下三项要求:
(1)互斥:如果进程Pi在其临界区内执行,那么其他进程都不能在其临界区内执行。
(2)前进:如果没有进程在其临界区内执行且有进程需进入临界区,那么只有那些不在剩余区内执行的进程可参加选择,以确定谁能下一个进入临界区,且这种选择不能无限推迟。
(3)有限等待:从一个进程做成进入临界区的请求,直到该请求允许为止,其他进程允许进入临界区的次数有上限。
4、共享变量,队列,缓冲区都是临界资源,打印机,磁带机也是临界资源。
信号量
可用资源量=value值。信号量对应某一类资源。

生产者-消费者问题。
Int n;
Semaphores mutex=1;//提供对缓冲池访问的互斥需求
Semaphores empty=n;//空缓冲区的个数
Semaphores full=0; //满缓冲区的个数

读者-写者问题
对数据库进行读或者写操作。要求写者对数据库有排他的访问。
第一读者、写者问题:要求没有读者需要持续等待,除非已有一个写者或获得允许以使用共享数据库。(只有当写者使用数据库时,读者才等待,否则多个读者可并发访问)
可能导致写者饥饿。没有一个读者会因为有一个写者在等待而等待,其他读者完成。
第二读者-写有问题:要求:一旦写者就绪,尽快被执行。(如果一个写者等待访问,那么不会有新读者开始读)。导致读者饥饿。

哲学家就餐问题

死锁

(1) 概念 多个进程在运行过程中因争夺资源(硬件|软件|临界资源)而造成的一种僵局
产生原因:1 资源竞争 2进程间推进顺序非法
资源分类:1可剥夺性资源 2不可剥夺性资源
(2) 产生死锁的必要条件: 1互斥条件(不能被破坏 需要保护)2请求和保持条件3不剥夺条件 4环路等待条件
(3) 处理死锁的方法:1 预防死锁(设置某些限制条件,破坏产生死锁的四个必要条件 较为严格)2避免死锁(在资源的动态分配过程中,用某种方法,防止系统进入不安全状态)(4)检测死锁(及时检测出死锁的发生,精确地确定与死锁有关的进程和资源,采用适当的措施清掉)4解除死锁(撤销|挂起进程,回收资源,分给阻塞进程)
(5)预防死锁 1 摒弃 请求和等待条件 进程开始前,一次性的申请在整个运行过程中所需的全部资源,有足够都给 只要有一种资源不满足,其他都不给 让其等待 优点 简单易实现安全 缺点 资源浪费严重 进程延迟 2摒弃 不剥夺条件 当一个保持了某些资源的进程 再提出新的资源请求时不立刻被满足,必须释放它已保持的所有资源 以后需要时再重新申请 缺点 降低吞吐量 增加开销 延长周转时间 3摒弃 环路等待 为所有资源类型按类型线性排队,赋予不同序号 进程对资源的请求严格按资源序号递增提出 总有一个进程占据较高序号资源 继续申请的资源必然是空闲的 优点:利用率吞吐量提高
(6)系统的安全状态:系统能按照某种进程顺序(p1 p2 pn)为每个进程分派所需资源 直至满足每个进程对资源的最大需求 处于安全状态 可避免进入死锁 如果不按照安全序列 就可能会由安全状态进入不安全状态
银行家算法:
(1)数据结构:1可利用资源量Available[j]=k 有Rj类资源k个;2最大需求矩阵Aax 系统中n个进程每一个对m类资源的最大需求;3分配矩阵Allocation 当前已分配给每个进程的资源数 4需求矩阵Need 尚需要的 Need[ij]=Max-Allocation
(2)银行家算法{1}如果Requet<=Need 转向2 否则错误 {2}Request<=Available转3否则错误{3}系统试探把资源分给Pi 修改Available=Available-request allocation=allocation+request Need=need-request {4}执行安全性算法 检查是否处于安全状态 安全则分配 不安全 作废
安全性算法:
(1)设置两个工作向量1 work表示系统可提供给进程的资源数目 开始时work=Available 2
2Finish 表示系统是否有足够的资源的分配给进程 开始时 Finish=fale 有足够的资源分配时Finish=true
(2)从进程集合中找到一个满足下列条件的进程1 finish=false 2 need<=work 找到转3 否则4
(3)顺利执行 完成释放资源 work=work+allocation finish=true do to stept
(4)所有进程finish=true 都满足 安全
死锁定理:
S为死锁的充要条件:当且仅当S状态的资源分配图不可完全简化
死锁的解除:剥离资源 撤销进程

主存 (重点理解内存分配的方法:分页)

理解:①逻辑地址:cpu所生成的地址 (逻辑地址) 物理地址:内存单元所看到的地址(即加载到内存地址寄存器中的地址)
② MMU :memory-management unit :运行时,完成从虚拟地址到物理地址的映射的硬件设备。

③ 动态加载:(将加载延迟到运行时)1.一个子进程只有在调用时才被加载。2.所有子程序都以可重定向的形式保存在磁盘上。3.对于这种情况:虽然总体上程序比较大,但是所用的部分(即加载的部分)可能很小时,动态加载方法特别有用。

动态链接:将链接延迟到运行时。
④Swapping 交换 :进程可以暂时从内存中交换到备用存储空间,等到该进程需要再次执行时,再调回内存。

分配算法(内存必须容纳操作系统和用户进程,因此应该尽可能有效的分配内存的各个部分): 连续分配 分页 分段
单分区分配方案和多分区分配方案
①连续分配(每个进程位于一个连续的内存区域):
1.固定分区 (浪费内存,时间快) :将内存分配为多个固定大小的分区。每个分区只容纳一个进程。 多道程序度受分区数限制。

2.可变分区方案(重点):分区的大小各不相同。

hole洞:一大块空闲的内存区域。
动态存储分配算法(选洞过程) (
FF:首次适应:分配第一个足够大的洞。
BF :最佳适应:分配最小的足够大的洞。必须遍历洞列表。
WF:最差适应 :分配最大的洞,必须遍历洞列表)
比较:FF和BF在执行速度和内存利用率方面优于WF。首次适应算法更快。
碎片问题:内碎片:分配了用不到 (赠送的)
外碎片:所有的洞加起来还可以分配,但是他们不连续。FF和BF会产生。
用Compaction解决(紧缩,洗牌):移动空闲内存,是他们聚集到一起,形成一个洞。
Paging分页: 主要作用:解决外部碎片问题。用户视角的内存和实际物理的内存分离。引入了帧,从而允许内存的物理地址空间是非连续的,避免了将不同大小的内存块匹配到交换空间上这样的麻烦。当需要执行时,其页从备份存储中调入到可用的内存帧。但是还有内部碎片。

理解:Frame帧:将物理内存分成固定大小的块。
Page 页:将逻辑内存分为同样大小的块 。页大小和帧大小一样。
Cpu生成的地址:页号p,页内偏移量d。页号作为页表中的索引。帧号
Page table :页表 :用于将逻辑地址映射到物理地址。存放了页号和对应的帧号(都是从零开始的)。

分页不会产生外碎片,每个帧大小相同,都可以分配给需要他的进程。但是会产生内部碎片,因为帧大小固定,如果进程的一部分占用的空间比帧空间小,那么就会产生。
新的进程是这样被加载的。

页表实现的硬件支持:1.PTBR:页表基寄存器(PTBR)指向页表.2. 页表长度寄存器(PTLR)指示页表的大小
大多数操作系统为每一个进程分配一个页表,同页表指针和其他寄存器的值一起存入PCB(进程控制块)。
TLB(Translation lookaside buffer,转换表缓冲区)
由上一节可知,页表是被存储在内存中的。我们知道CPU通过总线访问内存,肯定慢于直接访问寄存器的。
为了进一步优化性能,现代CPU架构引入了TLB,用来缓存一部分经常访问的页表内容。

是重点!! 页号→查TLB,如果存在则命中,如果不存在→查页表 →访问数据,同时将这条记录存放到TLB中。 用到了Cache
命中率:页号在TLB中被查找到的百分比成为命中率。
计算有效访问时间:Suppose that, it takes 20 nanoseconds to search the TLB, and 100 nanoseconds to access memory. An 80-percent hit ratio means:effective access time= 0.80 X 120 + 0.20 X 220= 140 nanoseconds.

分级分页:将页表再分页。为啥呢?现在以32位操作系统为例,32位逻辑地址空间,如果页的大小为4KB(2^12),对应页内偏移量,那么一个页表可以放1百多万个条目(2^32/2^12),对应页号。假设每个条目有4B,那么每个进程需要4MB物理地址空间来存储页表本身。我们不可能在内存中连续地分配这个页表。解决方法是,将页表在分页。

分段(重要!!)分段有个缺点:内存的用户视角和实际物理视角分离,需要映射。比较蛋疼。所以设计操作系统的人应该多站在用户的角度想一想。分段算法就是,按照用户的思维将一个进程分成不同的段

这些段之间没有一定的顺序,因为这不是用户关心的。分段就是支持用户视角的内存管理方案。地址空间由段名和段内偏移量组成。这个地址通过段表来实现。段表的每个条目都有基地址的界限。

虚拟内存

为啥用虚拟内存?之前第八章讨论的我们要运行一个程序,必须把整个进程拷贝到内存中。但是大多数情况下这是没有必要的,因为有的代码很少被执行。允许程序部分加载即可运行会有许多好处:首先,程序不再受现有物理内存空间的限制。其次,因为每个用户程序占用最少的内存,所以更多的程序可以被执行,CPU使用率增加,提高吞吐量。最后,由于载入或交换每个用户程序到内存所需要的IO会更少,用户程序会运行的更快。
虚拟内存核心思想:部分加载(程序部分加载即可运行)+交换(这是虚拟内存的实现)
请求式分页方式实现虚拟内存:当需要执行程序时,把必须的页交换到物理内存。

如上图:使用有效valid——无效invalid位来表示页是否在内存中。V表示有效,合法。I表示无效(非法,不在进程的逻辑地址空间)或者在磁盘上。
理解 :page falut :缺页:就是要访问的页还没有被调到内存中。

pure demand page 纯请求式分页:开始的时候不将任何的页面调入内存,只有在需要的时候才调入内存。这就是说,第一次请求每个页都会产生页错误。

page Fault Rate缺页率:缺页的概率
Effective Access Time(EAT):有效访问时间:EAT = (1 – p) x ma (内存访问时间) + p(命中率) x Page-fault service time

基本页替换

三大问题:1.页替换算法:如果没有空闲帧可以分配给新的页,那么需要把暂时不用的页踢出去。该踢谁呢?(计算缺页率,综合题

FIFO :谁先来的就踢谁。缺页率高。增加异常(有时候给他的帧多了反而会使缺页率增大)

异常的例子:

2.最优置换算法: OPT算法。算法思想:替换最长时间不使用的页。
他是产生页错误最低的算法,不会出现异常。但是类似于CPU调度中的SJF无法准确预测

3.LRU(Least Recently Used)最近最少使用页置换算法:
上述三种算法的区别:FIFO算法使用的是进入内存的时间,OPT使用的是页将来使用内存的时间。而LAU是将不久的过去近似看作未来。

三个近似算法

) ②帧分配算法(了解概念就行):如果内存中有多个进程,那么需要决定为每个进程分配多少帧。

②Thrashing(抖动)!!重点!什么是抖动?
a process is busy swapping pages in and out.一个进程忙与交换页。
怎么产生的?
因为为进程分配的帧太少,缺页率太高。

大容量存储结构

一:磁盘
1. 磁盘的组成:多个磁盘片、磁头、磁臂。
磁盘片:每个磁盘片两面都涂有磁性材料。
磁臂:磁头与磁臂相连,将所有磁头作为一个整体一起移动。
磁头:读写磁盘片。

2.磁道、扇区、柱面。
磁道、扇区、柱面都不是物理存在的,而是被逻辑划分的。
磁道:磁盘片的表面被逻辑的划分为一个个的圆形磁道。
柱面:位于同一磁臂位置的磁道集合形成了柱面。
扇区:磁道进一步划分为扇区。

3.磁盘速度的影响。
传输速率:是磁头从磁盘片读取的比特速率。(驱动器马达高速旋转,带动磁头转,读取数据)
定位时间:分为寻道时间和旋转等待时间。
寻道时间:即寻找磁道的时间。移动磁臂到所要的柱面的时间。
旋转等待时间:等待所需扇区旋转到磁臂下所需时间。

4:磁头碰撞。
磁头在运行过程中,极有可能与磁盘表面接触,就可能损坏磁盘表面。称为磁头碰撞。

5:磁盘控制器。
位于磁盘驱动器内,磁盘驱动器连于I/O总线上。
主机控制器,通过I/O总线,发送一个命令给磁盘控制器,磁盘控制器操作磁盘驱动器里的硬件(比如马达),来完成操作。
磁盘驱动器=磁盘控制器+硬件(马达)

6:磁带
最早的二级存储介质。特点:容量大、速度慢、保存数据时间长。主要用于备份。

二:磁盘结构

1:磁盘驱动器被编址为逻辑块的一维排列,逻辑块是最小的传输单元。
逻辑块序列被顺序的映射到磁盘扇区。这样可以基本的解决磁盘的存储问题。但有两个缺点。
1:大多数磁盘都有一些缺陷扇区,因此必须用空闲扇区替代。
2:大多数磁盘,每个磁道的扇区数量不是常量。(外面磁道的面积大,扇区多。)
外面磁道的面积大,扇区多解决办法。
恒线速度:外面磁道的角速度小,里面磁道的角速度大。
恒角速度:外面磁道密度低,里面磁道密度大。
三:磁盘连接
计算机访问磁盘存储的两种方式。
1:通过I/O端口—主机附属 存储。
2:通过分布式文件系统的 远程主机-网络附属 存储。

四:磁盘调度

1:对于磁盘驱动器,要具有快速的访问时间和磁盘宽度。
调度:对寻道时间(找到磁道)和旋转延迟时间(找到扇区)进行改善。

2:方法:1>FCFS(先来先服务)。公平、简单,但是速度慢。
举例:假设当前柱面是53.一组柱面请求是98,183,37,122,14,124,65,67
那么按顺序处理请求。
总的磁头移动为 640柱面(45 +85+146+85+108+110+59+2)
2>SSTF(Shortest Seek Time First) 最短寻道时间优先。
举例:假设当前柱面是53.一组柱面请求是98,183,37,122,14,124,65,67
离53最近的是65,离65最近的是67,离67最近的是37,以此类推,得出访问序列:
53,65,67,37,14,98,122,124,183 总的磁头移动为236柱面。
缺点:SSTF会产生饥饿。比如当前柱面是53,来了两个柱面请求分别是65,67,先处理65请求,再处理67请求。但是在处理65时,64又来了,这时候处理完65再处理64,67等待。很可能处理完64又会处理63。。。这样67一直等待,产生饥饿 。

             3>:SCAN算法。来回扫描磁盘,就像电梯一样,来回上下。                        优点:在磁盘某个方向扫描时,新加入的请求可能马上得到服务。                        缺点:与磁盘移动方向相反的一端要等待很长时间。              4>:C-SCAN算法。扫描完一端后,马上返回扫描前起始位置,处理另一端请求。                                                 (被扫描的一端,请求比较少,而未被扫描的一端,请求多。)              5>:LOOK与C-LOOK算法。(SACN和C-SCAN算法的实现)                    扫描时,不在整个磁盘宽度内扫描,而只扫描到一个方向上最远的请求为止。

五:磁盘管理
1:磁盘初始化(低级格式化)
低级格式化,即物理格式化,如果不格式化,就只是一些有磁性的盘子而已。
低级格式化将磁盘划分为磁盘控制器可以读写的扇区,并为每个扇区填入数据结构。
数据结构:头+数据区域+尾
头和尾包含了磁盘控制器所使用的信息。如扇区号和纠错码。
2:分区和逻辑格式化
这是OS所做的事情。为了使磁盘可以存储文件,OS必须在磁盘上记录OS的数据结构。
分区:将磁盘分为由1个或多个柱面组成的分区,可将每个分区作为一个独立磁盘。
逻辑格式化:即创建文件系统。将初始的文件系统数据结构存到磁盘上。
3:生磁盘及生I/O。
将磁盘分区后,将某个分区作为一个逻辑块的大顺序数组。没有任何文件系统结构。
对生磁盘的I/O称为生I/O。
特点:对于某些应用程序,效率可能更高。(比如数据库更喜欢生磁盘)
4:引导块。
在按通电源按钮时,自举程序初始化系统的各个方面(CPU、设备控制器、主存),并启动OS。(注意:ROM中保存的是自举程序的加载程序)
引导块:存储完整自举程序的磁盘分区。
引导盘:含引导分区的磁盘,比如装系统的优盘。
5:坏块。
1>有些简单的磁盘,可以手工处理坏块。
如果使用format命令格式化时,发现坏块,则写一个特定值到相应的FAT项,告知不再使用该坏块。(搜索坏块,并标记)

      2>更为复杂的磁盘。如SCSI磁盘,更加智能,控制器维护一个磁盘坏块列表,并在低级格式化时被初始化,在使用时实时更新。低级格式化时,预留了一些备用扇区,对OS不可见,但控制器可以使用这些逻辑地替换坏扇区。

六:交换空间

    虚拟内存使用磁盘空间作为内存的扩充。    交换空间的位置:在普通文件系统上创建,或在一个独立的磁盘分区进行(生磁盘)。

七:RAID的磁盘冗余阵列

     装大量磁盘,磁盘的I/O可并行进行。通常用于提高性能和可靠性。

文件系统接口

前言:文件系统提供对数据及程序的联机存储,访问机制。
文件系统由一组文件和目录结构两部分组成
为什么分区?物理的或逻辑的分开目录集合。
一:文件概念
1:文件是记录在外存上的相关信息的集合,具有具体的名称。
2:文件为了便于人们的访问和使用,具有很多属性。比如:文件名称、大小、权限等。
(使用文件,必须要知道文件名称才可以使用)
3:文件的结构:无结构、简单的记录结构、重复结构。
4:打包:物理记录大小不太可能刚好与所需的逻辑记录大小一样,故先将若干个逻辑记录打包再放入物理记录。(比如一个坑50cm^2,一个萝卜15cm^2,没必要一个坑放一个萝卜,否则就会浪费35cm^2的空间,可以将3个萝卜打包放入坑内,那么就只浪费5cm^2空间)
文件记录是一系列块的集合。
二:访问方法
当使用文件时,必须访问并且将这些文件读入到计算机内存。
访问方式:
1:顺序访问:简单,一个记录接着一个记录地加以处理。这种方式最为常用,如编辑器。利用文件指针实现。读写时,文件指针移动,并可重新设定文件指针的位置。
2:直接访问:文件是由固定长度的逻辑记录组成,而逻辑记录由对应相应的一些物理块,可对这些块任意的随机访问,没有顺序限制。
特点:可以立即访问大量信息,数据库通常使用这种文件类型。
3:其他访问方式:可建立在直接访问的基础上。涉及创建文件索引(对存储块的索引)
搜索索引-根据索引指针访问任意块。
三:目录结构
管理文件需要用到目录结构。整个磁盘可以用一个文件系统。但有时候需要在一个磁盘上装多个文件系统,这就需要分区,每一个区用一个文件系统。
1:目录结构:
单层目录结构:所有文件都在同一目录结构中,便于理解,较简单。
二级目录结构:为每一个用户创建一个目录

树形目录结构:对二级目录的扩展,树有根目录,系统内的每个文件都有唯一的路径。
路径名有两种形式:绝对路径名和相对路径名。
绝对路径名:从根开始并给出路径上的目录名,直到所指定的文件。
相对路径名:从当前目录开始定义路径。

无环图目录结构:是树形目录的扩展,为了实现文件共享。

注意:无环图目录不可以有环产生。有环产生,那么很可能计算机会在环中无限循环的搜索文件。对治方法:
1:限制搜索时所访问目录的次数。
2:垃圾回收。
3:检测是否有环产生,有的话破坏环。
无环图:是为了多个用户共享同一目录或文件,但是当一个用户将共享目录或文件删除了,那么其他用户就找不到这个目录或文件而访问出错。所以为每一个共享目录或文件设置一个计数器,当增加一个共享用户时,计数器加1;当某一个用户删除时,计数器减1.仅当共享计数器为0时,才删除该文件或目录。

四:文件系统的安装
操作系统需要知道设备名称和文件系统的安装位置。
如用户的目录可以安装在/home下。

五:文件共享
为了实现共享和保护,多用户系统必须比单用户系统维护更多的(文件和目录)属性。大多数系统采用 文件(目录)拥有者和组的概念。拥有者是目录最高控制权的用户,可改变属性和授权访问。组是对文件拥有相同权限的用户集合。
一个文件的拥有者ID和组ID与其他文件属性一起保存。当用户请求文件操作时,用户ID可以与拥有者属性相比较。以确定权限。
六:保护
1:访问类型:读写、执行、添加、删除等。
2:访问控制:为每个文件和目录添加一个访问控制列表,为精简访问列表,为每个文件采用三种用户类型。拥有者、组、其他。

文件系统的实现

一:文件系统结构
内存与磁盘之间的I/O传输是以块为单位的。每个块由多个扇区构成。
文件系统具有不同的层。如图所示。每层利用上一层的功能来为本层服务!

逻辑文件系统使用FCB(文件控制块)来实现对元数据的管理。FCB包括如文件拥有者,文件名称,文件位置等。称其为索引节点。

二:文件系统的实现
1:引导控制块:包括从该分区引导操作系统所需要的信息。如果磁盘没有操作系统,那么这一块内容为空。通常为分区的第一块。
2:分区控制块:包括分区的详细信息。如分区的块数,块的大小等。

3:内存内存储着一些文件系统的信息:
安装表:所有安装卷的信息
目录结构缓存:用来保存近期访问过的目录信息
系统范围内的打开文件表:包括每个打开文件的FCB信息副本和其他信息
单个进程的打开文件表:包括指向系统范围内已打开文件表中某个条目的指针。
创建一个文件的过程:应用程序调用逻辑文件系统,并且为文件分配一个FCB。然后系统将相应的目录信息读入内存,并且用新的文件名更新该目录和FCB,并将结果写回到磁盘。

4:打开以及关闭文件
打开文件
1>调用open()函数搜索系统范围内的打开文件表,用来确定该文件是否已经被其他进程使用。如果没被使用,就根据文件名来搜索目录结构,一旦找到该文件,则该文件的FCB就被复制到系统范围内的打开文件表。
2>在单个进程的打开文件表会增加一个条目,指向系统范围内打开文件表的某个条目和其他信息。
3>调用open()函数,会返回一个指向单个进程的文件条目的指针。称为文件描述符。
关闭文件
当一个进程关闭文件,就相应的删除一个“单个进程打开文件表的条目”,“系统范围内打开文件表的条目”也会递减。

三:分区以及安装
1:生分区:分区可以使“生”的,即没有文件系统。“生”磁盘用于没有合适文件系统的地方,如UNIX的交换分区,数据库使用等。
引导信息可以保存在各个分区中,他有自己的格式,不使用任何文件系统。为一组有序模块,并作为镜像读入内存。
2:根分区:包括操作系统内核或其他系统文件。
四:虚拟文件系统
为了实现一个操作系统内可以含有多种文件系统。
VFS层定义一个清晰的VFS接口,将文件系统的通用操作和具体实现分开。五

五:目录的实现
1:线性表:使用存储文件名和数据块指针的线性列表。,实现简单。
真正的缺点:查找文件需要线性搜索。
2:哈希表:

六:分配方法
一个磁盘可以存储多个文件,但是对于文件的存储要有分配一定的空间,如何分配空间使文件的查找更加快捷,空间使用更加合理?三种方法:
1:连续分配:
每个文件在磁盘上占用一系列连续的块;
每个目录项告知了文件的起始块地址和所要使用的块的数量。
优点:支持直接访问和顺序访问。
直接访问:直接访问文件的某一块
顺序访问:可从当前块顺序访问下一块。
总之:访问比较快和容易。
缺点:1:为新文件找到一个合适的空间很困难(东拼西凑)
2:外部碎片问题

2:链接分配。每块都有指向下一块的指针。解决了连续分配的所有问题。

比如一个文件使用5个块。从块9开始,块9指向块16,16指向1,1指向10,10指向25。
优点:1:简单,只需包含下一块的地址就可以;
2:没有空间浪费。
缺点:1:不支持直接访问,只能顺序访问文件的某一块;
2:指针占用,浪费了一部分空间;
3:不可靠,假如一个指针错误或损坏,整个文件崩溃。

文件分配表(FAT)
是链接分配方法的变种。每个分区的开始部分存储该FAT。每块都在该表中有一个对应的项。每个目录条目含有文件首块的块号码,FAT包含文件下一块的块号,直至文件的结束。

3:索引分配:将所有的指针放在一起,组成一个索引块。每个文件都有一个索引块,索引块的第i个条目指向第i块。目录条目包括索引块的地址。

优点:1:无外部碎片;
2:支持随机访问
缺点:1:浪费空间
2:指针开销比链接分配的指针开销大。(比如一个文件就有2块大小,那么链接分配只需要2个指针大小的空间就可以了。但是索引块就算只有2个指针,也分配较大的空间)

问题?索引块的大小该多大?
索引块的大小不能太大,也不能太小,为此就需要一个合适的机制。
1:链接方案:可以将多个索引块链接起来,用来处理大文件。
2:多层索引:链接表示的是第一层索引指向第二层索引,第二层索引块指向数据块(或第三层索引块),以此类推。
3:组合方案:将索引块的头15个指针存在inode中,其中的12个指针指向直接块。剩下的3个指针指向间接块。间接块包含的是块的地址。

七:空闲空间管理
磁盘空间有限,删除文件后,大部分磁盘可以再使用闲置的空间。
为了记录空闲磁盘空间,系统需要维护一个空闲空间链表。
1:空闲空间链表。
空闲空间表的实现为位图。占用用0标记,空闲用1标记。

假设一块磁盘,块1,3,5为占用。可以表示为01010.
位的映像需要一定的空间。

2:空闲链表
将所有的空闲盘块链接到一起,并将首个空闲块的指针保存在磁盘特定的位置,且缓存到内存。

这种方案的效率不高。要读入每一块时,需要遍历每一块,花费大量的I/O时间。

3:分组—对空闲链表的改进。
将n个空闲块的存放在第一个空闲块中,其中前n-1个块是空闲的,最后一块包含本组n个空闲块的地址。
优点:可以迅速找到大量的空闲盘块,不象标准链接列表方法。

4:计数

通常,有多个空闲块需要同时分配或释放。所以,可以记录第1块的地址和紧跟第一块连续的空闲块的数量n。
记录项的每个条目由一个磁盘地址和一个计数组成

I/O系统

Application I/O interface 三种方式:1.轮询2.终端3.DMA
内核i/o 子系统 :cache, buffer, Spooling 中断
整理的知识点
1.控制器用于操作端口、总线或设备的一组电子器件。控制器有一个或多个用于处理数据和控制信号的寄存器。处理器通过读写这些寄存器的位模式来与控制器通信。也就是说,处理器执行io请求是通过标准数据传输指令来完成对设备控制器的读写。(了解)
2.一、轮询方式
    对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。
    优点:尽管轮询需要时间,但轮询不比I/O设备的速度要快得多,所以一般不会发生不能及时处理的问题。
    缺点:当然,再快的处理机,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询毕竟占据了CPU相当一部分处理时间,因此程序轮询是一种效率较低的方式,在现代计算机系统中已很少应用。
  
  二、中断方式
    处理器的高速和输入输出设备的低速是一对矛盾,是设备管理要解决的一个重要问题。为了提高整体效率,减少在程序直接控制方式中CPU之间的数据传送,是很必要的。
    在I/O设备中断方式下,中央处理器与I/O设备之间数据的传输步骤如下:
    ⑴在某个进程需要数据时,发出指令启动输入输出设备准备数据
    ⑵在进程发出指令启动设备之后,该进程放弃处理器,等待相关I/O操作完成。此时,进程调度程序会调度其他就绪进程使用处理器。
    ⑶当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转向预先设计好的中断处理程序,对数据传送工作进行相应的处理。
    ⑷得到了数据的进程,转入就绪状态。在随后的某个时刻,进程调度程序会选中该进程继续工作。
    中断方式的优缺点
    优:I/O设备中断方式使处理器的利用率提高,且能支持多道程序和I/O设备的并行操作。
    缺:中断方式仍然存在一些问题。首先,现代计算机系统通常配置有各种各样的输入输出设备。如果这些I/O设备都同过中断处理方式进行并行操作,那么中断次数的急剧增加会造成CPU无法响应中断和出现数据丢失现象。
    其次,如果I/O控制器的数据缓冲区比较小,在缓冲区装满数据之后将会发生中断。那么,在数据传送过程中,发生中断的机会较多,这将耗去大量的CPU处理时间。
  
  三、直接内存存取(DMA)方式
    直接内存存取技术是指,数据在内存与I/O设备间直接进行成块传输。
  a.DMA技术特征
    DMA有两个技术特征,首先是直接传送,其次是块传送。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
    DMA工作过程
    ⑴当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器。
    ⑵发出数据传输要求的进行进入等待状态。此时正在执行的CPU指令被暂时挂起。进程调度程序调度其他进程占据CPU。
    ⑶输入设备不断地窃取CPU工作周期,将数据缓冲寄存器中的数据源源不断地写入内存,直到所要求的字节全部传送完毕。
    ⑷DMA控制器在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。
    ⑸中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。
    DMA与中断的区别
    ⑴中断方式是在数据缓冲寄存器满之后发出中断,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU 进行中断处理。这就大大减少了CPU进行中断处理的次数。
    ⑵中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制完成的。这就排除了CPU因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。
    DMA方式的优缺点
    优点:在DMA方式中,由于I/O设备直接同内存发生成块的数据交换,因此I/O效率比较高。由于DMA技术可以提高I/O效率,因此在现代计算机系统中,得到了广泛的应用。许多输入输出设备的控制器,特别是块设备的控制器,都支持DMA方式。
    缺点:通过上述分析可以看出,DMA控制器功能的强弱,是决定DMA效率的关键因素。DMA控制器需要为每次数据传送做大量的工作,数据传送单位的增大意味着传送次数的减少。另外,DMA方式窃取了始终周期,CPU处理效率降低了,要想尽量少地窃取始终周期,就要设法提高DMA控制器的性能,这样可以较少地影响CPU出理效率。
3.Io内核子系统包括:io调度、缓冲、高速缓存(cache)、假脱机(spooling)、设备预留及错误处理。Io子系统改善计算机效率的方法有两种:一是通过io调度,二是使用主存或者磁盘上的存储空间技术如缓冲、高速缓存、假脱机。
4.io调度:调度一组io请求就是确定一个合适的顺序来执行这些请求。
缓冲:缓冲区(buffer)使用的三大理由:一个是处理数据流的生产者和消费者之间的速度差异;二是协调传输数据大小不一致的设备;支持应用程序io的复制语义。
高速缓存cache和缓冲的区别

0 0
原创粉丝点击