前半段主要来自南京大学骆斌老师后半段主要来自浙江大学李善平老师的网课
图片内容来自教学课件,由于时间匆忙和作者水平有限,本文可能存在部分错误和描述含糊的地方,但均不影响读者理解。也希望各位可以提出批评,有空后也会加以改正。
操作系统是核心系统软件,其负责计算机计算机系统软件、硬件资源的分配、调度工作;控制并协调并发活动,实现信息的存取和保护;它提供用户接口,使用户获得良好的工作环境。操作系统使整个计算机系统实现了高效率和高度自动化、高利用率、高可靠性
最重要的特征是并发、共享,还有不确定性(指进程的执行顺序和执行时间的不确定性)
现代操作系统指的是多用户多任务的并发执行
并发:
并发性:指两个或者多个事件在同一时间间隔内发生。
并行性:指两个或者多个事件在同一时刻发生(同时发生)
处理器中有大量的寄存器,不同的寄存器有不同的作用,例如储存执行结果,储存数据地址等等。因此,寄存器多而复杂。寄存器不多作要求,可浏览知晓即可
在CPU内部有一个控制单元,里面有指令暂存器IR和指令译码器ID,分别用于存储下一条要执行的指令和对指令进行翻译。在对指令进行翻译后,就会遇到算数逻辑单元,通过计算处理后,便会将处理后的结果存入标志寄存器Flag,并且会用程序计数器PC来统计执行的程序数。
上述的全部寄存器及其他硬件都连接在内部总线上,通过内部总线和内存相连。
内存中有内存地址寄存器MAR和内存数据寄存器MDR。
在高级的操作系统中,IO寄存器等其他寄存器可以直接和内部总线相连,这样就可以提高数据的交互速率,但在简单的操作系统中,这些寄存器都是集成在系统总线上的。
用户程序可见寄存器:
这就可以让程序员直接与寄存器进行交互,减少访问主存储器的次数,以此来提高效率
控制与状态寄存器:
被操作系统程序所使用,用于控制程序执行
PSW是一种概念,用于记录当前程序运行的动态信息
在部分计算机系统中,PSW是一个寄存器,为控制与状态寄存器
机器指令是计算机系统执行的基本命令,是中央处理器执行的基本单位。由一个或多个字节组成。
指令的执行步骤如下:取指 解码 执行
取指是指PC从存储器中将指令放入IR中
解码是指解译IR中的指令来决定其执行行为
执行是指连接到CPU,执行运算,产生结果并写回
执行周期就是 取指 解码 执行 这三个过程
而指令流水线是指当指令1进行解码时,指令2可以同时进行取指,以此类推执行与解码
特权指令只可被操作系统内核所使用
非特权指令能够被所有程序使用
完整的处理器模式为
0:代表操作系统内核
1:代表系统调用
2:代表共享库程序
3:代表用户程序
通常只分为0与3两种模式,即对应内核模式和用户模式,即管理态和用户态
管态 (Supervisor mode)
在此状态下处理机可使用全部指令(包括一组特权指令);使用全部系统资源(包括整个存储区域)
用户态(User mode)
在此状态下禁止使用特权指令,不能直接取用资源与改变机器状态,并且只允许用户程序访问自己的存储区域
用户态->管理态:可通过中断、异常或系统异常等触发
管理态->用户态:调用中断返回指令
系统调用示例:
系统调用和一般调用的区别:
访管中断:(在下一节中断中会出现)
当处理机执行到访管指令时发生中断,该中断称为访管中断,它表示正在运行的程序对操作系统的某种需求。即正常运行的程序为了获取某些资源等而产生的自发性中断,其只可在用户态运行,并且不属于用户指令
中断是指某个事件 (例如电源掉电、定点加法溢出或I/O传输结束等) 发生时,系统中止现行程序的运行、引出处理事件程序对该事件进行处理,处理完毕后返回断点,继续执行,其发生时间不固定
陷阱是指在用户态下,软件需要操作硬件,其就会通过指令从用户态陷入内核态(管理态),这是可以通过软件实现的,且其发生时间固定
指当前运行指令引起的中断事件,例如地址异常,处理器硬件故障
指执行陷入指令而触发系统调用,如请求设备、请求I/O等,与异常不同的是,异常是当前运行指令出现问题,而系统异常是指当前指令请求某种资源等
总体可分为如下几种:
按中断功能分
按中断方式分
按中断来源分
1) 外中断
由处理机外部事件引起的中断。例如输入输出中断、外中断。
2) 内中断,又称为俘获
由处理机内部事件引起的中断。例如访管中断、程序性中断、机器故障中断。
包括硬件子系统和软件子系统两部分
中断响应由硬件子系统完成
中断处理由软件子系统完成
在取指 解码 执行后面有一步检测中断,若为不屏蔽中断,就需要进入中断阶段,若是屏蔽中断,那就跳过执行下一个步骤
即计算机系统中响应中断/异常的硬件装置
中断装置根据不同情况而有所区别
处理器外的中断:由中断控制器发现和响应
处理器内的异常:由指令的控制逻辑和实现线路发现,也称作陷阱
处理器内的系统异常:直接触发,成为系统陷阱
中断和异常的另一个重要差别是,CPU处理中断的过程中会屏蔽中断,不接受新的中断直到此次中断处理结束。而陷阱的发生并不屏蔽中断,可以接受新的中断
中断控制器:
包含中断控制逻辑线路和中断寄存器。当外部设备请求中断时,中断寄存器中会设置已发生的中断,中断检查时就是检查寄存器中的中断是否被屏蔽,未被屏蔽就会引发中断处理程序
中断处理程序的作用:处理中断事件和恢复正常操作
总体分为两个阶段:中断响应和中断处理
过程:
1.保护未被硬件保护的处理器状态和后续指令在内存中的地址,信息均存在主存中,即保护现场,现场也称上下文
2.识别PSW中的断码字段,识别中断源,转入中断处理程序
3.分别处理发生的中断事件
4.恢复正常操作
当计算机检测到中断时,其会根据中断是否屏蔽来决定是否响应这些中断
当计算机检测到多个中断时,中断装置会有响应中断的一个顺序,其会给不同类型的中断标上不同的优先级,按照优先级来执行中断。不同的操作系统中优先级的设置也是不同的。
当计算机响应中断后,在中断处理过程中,可以再响应其他中断
为了保证计算机性能,一般嵌套层数不会太多,如三层
中断的嵌套可以改变中断处理顺序,即不一定先中断先处理,可能后处理
通过中断屏蔽,中断优先级和中断嵌套处理,可以改变中断处理的次序
为了更系统的管理运行的程序,计算机会为正在运行的程序建立一个管理实体。这个实体就称为进程。
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,简单地说,就是某个程序的依次运行。
需特别注意的是,进程是操作系统进行资源分配和调度的独立单位。
进程包括以下五个实体:
数据结构P 内存代码C 内存数据D 通用寄存器信息R 程序状态字信息PSW
首先介绍进程与程序的区别:
1、程序是静态的概念,进程是动态的概念;
2、进程是一个独立运行的活动单位;
3、进程是系统资源分配的基本单位;
4、一个程序可以对应多个进程,一个进程至少包含一个程序。
5、程序=代码+数据,进程=程序+PCB(后面马上会讲到)
需牢记的是,进程是一个程序在一组数据上的一次执行。
因此,就算是一个程序在不同时间,同一组数据上运行,也算两个进程,其PCDR PSW都是不同的
普通进程可分成两大类:
1.在不同数据上运行的不同进程
2.在同一数据下运行的共享数据的不同进程
一般的,分为运行态,就绪态和等待态(阻塞态)。
运行态:进程获得了CPU资源与其他所需要的资源
就绪态:进程获得了其他所需要的资源但没有获得CPU资源
等待态:进程未获得CPU之外的其他所有所需要的资源(与CPU资源无关)
1.运行态->就绪态:被更高优先级的进程抢占了CPU资源,时间片用完
2.就绪态->运行态:在其他资源齐全的情况下,获得CPU资源
3.运行态->等待态:当运行进程申请I/O等其他资源时,会被阻塞然后进入等待态
4.等待态->就绪态:获取了其他所有资源,等待获取CPU资源
提出进程挂起的概念是为了解决计算机系统在运行过程中可能出现的资源不足的情况。
其表现为性能低和死锁两种情况。
进程挂起的作用:剥夺某些进程的内存与其他资源,调入OS管理的对换区,待适当时候再参与进程执行。
挂起态和等待态的区别就是:后者是已占有部分资源,而前者不占有任何资源
一般的,都选择等待态进程进入挂起等待态。
实在不得已再选择就绪态进程进入挂起就绪态。
同样的,也会先恢复挂起就绪态,再恢复挂起等待态
PCB用于记录进程状态机环境信息,便于OS对进程进行管理
PCB中的信息分为标识信息、现场信息、控制信息三块
① 进程标识符 进程符号名或内部 id号,简称PID
② 进程当前状态 本进程目前处于何种状态
③ 当前队列指针next
该项登记了处于同一状态的下一个进程的 PCB地址。
④ 进程优先级
反映了进程要求CPU的紧迫程度。
⑤ CPU现场保护区
当进程由于某种原因释放处理机时,CPU现场信息被保存在PCB的该区域中。
⑥ 通信信息
进程间进行通信时所记录的有关信息。
⑦ 家族联系
指明本进程与家族的联系
⑧ 占有资源清单
是进程在某一时刻的内容与执行状态的集合
其中包括:进程控制块、进程程序块、进程数据块与核心栈
注意,其是内存级的物理实体,也被称为进程的内存映像
先声明一点,进程的执行是需要环境支持的,包括CPU现场和Cache中的执行信息
因此,我们提出了进程上下文的概念:进程物理实体+运行环境=进程上下文
其包括用户级上下文(用户程序块、数据区、栈、共享内存)、寄存器上下文(PSW、栈指针、通用寄存器)、系统级上下文(PCB、内存区表、核心栈)
由此我们可以看到,几乎关于进程的全部信息都可在上下文中找到,因此其刻画了进程执行的具体情况
系统调用/中断/异常处理程序
队列管理模块
进程控制、调度、通信程序
总体的队列分为就绪队列和等待队列
CPU从就绪队列中取到就绪态的进程进行运行,若进程需要其他资源,则进入等待队列,待获得资源后再返回就绪队列。而如果是因为时间片轮转等导致的运行态剥夺,则直接回到就绪队列末尾
这是操作系统实现进程管理的核心模块
用于管理2.8.2中的内容
1.进程创建:进程表加一项进程,并申请PCB且初始化,建立标识,建立映像,分配资源,移入就绪队列
2.进程撤销:从队列中移除,归还资源,撤销标识,回收PCB,移除进程表项
3.进程阻塞:保存现场,修改PCB中的相关信息,并移入等待队列
4.资源唤醒:从等待队列中移出,修改PCB中的相关信息,移入就绪队列
由于进程控制过程是会涉及OS的核心数据结构的,为了防止与时间有关的错误,应当使用原语
同时,原语会被多个进程所使用的,应当是不可修改的精简代码,同时执行过程不能被外部中断
进程控制原语一般分为四种:
1)进程创建原语 2)进程撤消原语
3)进程阻塞原语 4)进程唤醒原语
进程间相互制约关系分两种:
1、间接制约关系,进程之间共享资源,用户程序使用时需要先提出申请,由操作系统统一协调分配。
2、直接制约关系,是指进程之间相互协作,执行有先后顺序。
由于不同进程之间可能会访问同一变量,该变量就为临界资源。
进程中访问临界资源的那段程序段称为临界区
由于并发执行的特点是程序执行的顺序不同,最后的执行结果也会不同。因此在访问共享变量时,应当有相应的互斥操作保证共享变量(临界资源)在某一时刻只能由一个进程访问,该手段便是进程互斥机制
遵循的三个原则:
(1)保证进入
当有进程想进入临界区时,应保证其在有限的时间内进入,不能无限等待;
(2)排它性
临界区内每次最多只有一个进程,不可能有两个及多个进程同时存在临界区;
(3)有限性
进程在临界区逗留时间有限,不能无限制逗留。
进程的互斥解决进程对临界资源的独占(互斥访问),而进程的同步解决进程间的合作,可以没有临界资源,但是在一些关键点上可以相互等待与互通消息。
进程同步定义:是指并发进程在一些关键点上可以相互等待与互通消息,这样的相互制约关系称为进程同步。
例如公交车司机和售票员之间,打印机的不同对象之间都是进程同步问题
公交车问题:
da
打印机:
锁和信号量
锁被定义为一个二进制变量w,其值当然
0:临界资源空闲,且没有进程进入临界区
1:表示有进程进入到了临界区,正在使用临界资源。
当临界区资源量大于1时,用锁实现就很不方便了,因此需要使用信号量
信号量定义:用一个二元组(s,q)表示。
其中:s是一个初始值≥0的整型变量(-∞, +∞ );q 表示一个初始状态为空的进程等待队列,初始为空。
当信号值s≥0,进程可以继续执行(类似绿灯);
当信号量值s<0,进程停止执行,进入到q队列中等待(类似红灯)。
信号量既可以实现互斥,也可以实现同步
针对信号量的两个原语操作,分别记做P(S)和V(S)
然后,我们进一步理解
可以把信号量看成资源量,当某一进程需要某一资源时,其便获取一份信号量,当资源使用结束后,再将该信号量放回。当资源量大于0时,其可以被获取,当资源量小于等于0时,说明其已被别的进程获取完,需要等待,而小于0时的绝对值表示在等待的进程数
PV操作就是原本的上锁和解锁,当信号量的资源量初始化为1时,就和锁类似
这边直接考虑多个生产者和消费者。
设置信号量:
设置两个同步信号量和两个互斥信号量
empty :表示缓冲区中空闲资源的数目,初值为X
full : 表示满缓冲区,即信息的数目,初值为0
mutex1, mutex2:表示互斥信号量,初值为1
其中,mutex1和mutex2分别是生产者消费者之间的互斥信号量。其目的是防止生产者或消费者在放入缓冲区资源或获取缓冲区资的时候访问同一块缓冲区。例如,生产者1和生产者2都可以向缓冲区内写入数据,此时缓冲区的空闲资源也足够,但是他们俩可能会向同一块缓冲区的空闲资源中写数据,这时就需要mutex1了,确保在写入时仅一个生产者访问一块缓冲区的空闲资源。
前提:父亲放苹果,母亲放桔子,儿子吃桔子,女儿吃苹果
信号量设置:
实现代码:
特别注意,父亲放入苹果后释放的信号量是女儿吃苹果的信号量,母亲也类似,而儿子女儿释放的才是盘子的信号量
进程创建和切换时间和空间开销较大,且随着并发进程数量的提升,时间和空间开销会逐渐增大,从而限制了系统的并发能力。
进程间高级通信效率较低,通常需要单独创建一片内存区域,也增加了时间和空间的开销
因此,线程的提出就是为了解决进程带来的时空开销较大的问题
线程是比进程更小的活动单位,其可描述如下:
线程是进程中的一条执行路径;
线程有自己私用的堆栈和处理机执行环境;
线程共享所在进程已分配的资源;
线程是单个进程所创建的许多个同时存在的线程中的一个
实现线程间通信十分方便,因为一个进程创建的多个线 程可以共享整个进程的所有资源
在进程内创建多线程,可以提高系统的并行处理能力, 加快进程的处理速度
总结来说,线程包含于进程,其享受进程提供的资源来执行相应的命令操作,进程是线程的母体,线程通常不能独立产生,必须在一个进程中产生
相应数据:
TCB(Thread Control Block):线程控制块,类似PCB,记录线程所有相关的属性信息,随着线程的创建而创建,但其所占内存空间远远小于PCB。
TID:线程的ID号
在没有线程的操作系统中,进程是操作系统资源分配与调度的基本单位
在存在线程的操作系统中,进程仅为操作系统资源分配的基本单位,而线程是操作系统调度的基本单位
上图很好的概括了线程和进程的区别。由图可知,一个进程中可以存在多个线程,这些线程互相调度的开销远小于进程之间的互相调度。
不是所有操作系统都存在线程
在没有线程的操作系统中,其资源分配和资源调度的基本单位都是进程
在包含线程的操作系统中,其资源分配和资源调度的基本单位分别为进程和线程
大致分为高级调度,中级调度,低级调度
与创建相关
高级调度是统筹进程的调度
主要工作如下:
1.是否接受一个终端用户的连接
2.是否被系统接纳并构成进程
3.新建进程是否加入就续进程队列
与挂起相关
可以提高内存利用率和作业吞吐量
因此,其可以决定哪些进程留在内存中,可以来竞争资源
是最重要的调度
与状态切换相关
按照某种原则进行CPU的分配,即与三态有关
同时会记录各个进程或内核级线程的状态
实现方法:进程调度程序,也被称为所有进程的父进程,因为其决定了进程的生死等
进程调度由调度(scheduler)和分派(dispacher)两个功能组成
这里我们介绍操作系统的几种不同的调度算法
总体来说,调度分为剥夺式和非剥夺式,即当某进程根据相应调度策略计算后发现,其计算优先级高于当前运行进程,剥夺式调度则会剥夺当前运行进程资源,转而运行优先级更高的进程,非剥夺式则是等当前进程运行结束后再执行优先级更高的进程
资源利用率:CPU或其他资源的使用效率
响应时间:任务开始执行时间-任务提交时间
周转时间:任务结束时间-任务提交时间
吞吐量:单位时间内吞吐的数据量
公平性:确保每个用户获得合理的CPU或其他资源份额
分为剥夺式和非剥夺式两种
优先级也分为静态和动态,静态优先级在创建后便不再发生改变,而动态优先级可以根据任务的紧迫性、等待时间长短等来调整优先数
动态优先数的改变原则:
进程使用CPU超过一定数值时,降低优先数
进程I/O操作后,提高优先数
进程等待时间超过一定数值时,提高优先数
短进程优先算法SPN
剩余计算时间短进程优先算法
高响应比优先算法(响应比 = (等待时间+要求服务时间)/要求服务时间) HRRN
先来先服务算法 FCFS
即进程进入就绪队列后,会轮流占有一定时间的CPU,在时间用完后,便排到就绪队列队尾准备下一次执行
分级调度算法就是给进程排多个就绪队列,每个就绪队列优先级不同
同时,为了保证尽量公平,优先级越高的队列执行时间越短
即为每张彩票赋予同样的时间片,不同进程的初始彩票拥有数不同,优先级越高的越多
每次由系统抽取一张彩票,抽到的进程将彩票上交,并执行一个时间片的进程
这样,随着时间的发展,初始彩票少的进程的执行概率会逐渐增加,这也增加了平衡性
资源分配方式有两种,分别为静态分配和动态分配
静态分配:在进程运行前,将其需要的资源一次性全部分配
动态分配:在进程运行中,根据进程提出的需求,进行资源的动态分配和回收
从上面可以思考以下问题:
通过分析,我们可以知晓的是,静态分配在一开始就分配了所有资源,一部分资源可能是进程后期才需要的,那么只有等进程结束后,这部分资源才会被释放并且去服务其他进程。而动态分配虽然解决了上述静态分配中资源与设备利用率低的问题,但也会产生新的问题:多个进程争夺同一个资源的时候,操作系统该如何处理?这便引出了重点,死锁
两个或两个以上并发进程,如果每个进程持有某种资源,而又在等待着别的进程释放它或它们现在保持着的资源,否则就不能向前推进,这种现象称为死锁
必须重点指出的是:在死锁状态下,所有进程都处于阻塞态,解除其阻塞态的事件永远不会发生,只能通过外力解决
由上也可知,如果资源量充足,就不存在死锁问题
那么,在没有任何调度算法加持的情况下,需要多少资源才可以保证不会发生死锁呢?
假设:系统当前所拥有的某类资源总数为M,共享该资源的当前进程数为P,每个进程所需使用该资源的最大需求为N( N ≤ M)
那么所需的不会导致死锁的最小资源数为M≥P*(N-1)+1。即每一个进程都能分配到N-1个资源,剩下一个资源给谁,那么谁就可以正常执行,执行完释放N个资源后,后续就不存在死锁现象了
死锁产生的四个必要条件为:
指资源被独占,某资源在使用时不得由多个进程共享,有且仅有一个进程在同一时刻可以占有这个资源
指其他的资源申请者不得从资源占有者手中剥夺该资源
进程已占用至少一个资源,且又提出资源请求,当不能满足而阻塞时,保持原资源不释放
必有一进程–资源的环形链
圆形代表进程,方形代表资源(数量为1)。上图代表P1进程占有R1资源的同时,需要R2资源才可以执行进程。但P2进程占有了R2资源,且需要R1资源才可以执行。这就互相矛盾,产生死锁
解决死锁分为一下四个策略
死锁预防就是之前讲的资源分配方法。若为静态分配(静态死锁预防策略),那么肯定不会发生死锁,其破坏了**请求和保持(占有并等待)**这两个死锁条件
若为动态死锁预防策略,则有序资源分配法工作思路如下,所有资源按类型进行线性排队,并赋予每一个资源类型不同的序号。进程对资源的请求必须按资源序号递增的次序提出。即将资源按照1,2,3,…,n标号,一个进程若需要1,4,5三种资源,只有当它拥有足够的1号资源时,其才可以申请4号资源,以此类推。这样不会出现拥有其他资源,而缺少某一种资源从而导致的资源环路
死锁避免与死锁预防的区别是:
死锁预防是破坏四个条件之一导致无法产生死锁
死锁避免是不破坏四条件,仅通过动态检查来决定部分资源可否分配(分配后不会产生死锁问题),重点便是银行家算法
首先解释安全状态和不安全状态
系统中的当前所有进程能按某种顺序(如
若存在进程序列
若不存在安全序列,则称系统处于不安全状态
银行家算法存在以下几种资源情况:
Max(最多要几个)、Allocation(已分配的)、Available(可分配的)、Need(仍需要的)
描述成数据结构即如下:
可用资源向量Available:是含有m个元素的数组,每一元素代表一类可用资源的数目。初值为系统中该类资源的全部数目。
如:Available[j]=k,即系统中现有Rj类资源k个
最大需求矩阵Max:是n×m矩阵,定义了系统中每一进程对每类资源的最大需求。
如Max(i,j)=k,即进程i需要Rj类资源的最大数目为k
分配矩阵Allocation:是n×m矩阵,定义了每一类资源 已分配给每一进程的资源数
如: Allocation(i,j)=k,即进程i已分得Rj类资源k个
需求矩阵Need:是n×m矩阵,表示每一进程还需要的各类资源数。
如:Need(i,j)=k,表示进程i还需要Rj类资源k个
其中Available是整个系统还可分配的资源量,并不是整个系统的总资源量,总资源量应该是所有的Allocation+Available
每个进程所需的每个资源都应有相应的标识
例:
系统存在a b c三种资源,现在可分配的数量分别为(Available) 1 2 3
进程A需要a b c三种资源,情况为:
Max:2 2 5
Allocation:1 1 1
Need:1 1 4
此时由于资源c不足,进程A没法正常执行
银行家算法的相关注意点
即允许死锁发生,在死锁发生时采取一些措施来解除死锁
主要是重新启动、撤销进程、剥夺资源、进程回退
存储结构由以下四部分构成
逻辑地址又称为相对地址,是用户在编程时所用到的地址空间。是用户的程序经过汇编或编译后的目标代码的地址
逻辑地址从0开始编号,分为以下两种形式:
1.一维逻辑地址:这是直接给地址
2.二维逻辑地址:这是给内存分段,通过段号去对应相应的内存
注意点:
首地址为0,其余指令中的地址都相对于首地址来编址
不能用逻辑地址在内存中读取信息。在实现对存储器访问之前必须转换成物理地址
用户程序处理逻辑地址,它不能看到真正的物理地址
物理地址又称为绝对地址,即程序在执行时占用的地址空间。内存通常被分成若干个大小相等的存储单元(容量为一个字节),每个单元给一个编号,这个编号称为内存地址,是计算机主存单元的真实地址
CPU在执行命令时必须要按照物理地址来执行
这里来区分一下物理地址和逻辑地址:
逻辑地址是用户程序经过编译后将存储空间从0开始编号,而绝对地址是内存中各物理存储单元统一的基地址顺序编址
物理地址的集合称为物理地址空间,它是一个一维的线性空间
物理地址的程序只有装入程序所规定的内存空间上才能正确执行,如果程序所规定内存空间不空闲或不存在,程序都无法执行。在装入内存后,便通过逻辑地址寻找程序
使用物理地址编程意味着由程序员分配内存空间,这在多道程序系统中,势必造成程序所占内存空间的相互冲突,用逻辑地址可以进行重新分配排序
在多道程序系统中,程序员门无法事先协商每个程序所应占的内存空间的位置,系统也无法保证程序执行时,它所需的内存空间都空闲
为内存的共享、保护和扩充提供方便
静态地址映射:即在程序装入的过程中进行地址变换
动态地址映射:即在程序执行的过程中进行地址变换。在程序运行时确定地址映射关系。在程序执行期间,随着每条指令和数据的访问自动地连续地进行地址映射
内存复用是指在服务器物理内存一定的情况下,通过综合运用内存复用单项技术(内存气泡、内存交换、内存共享)对内存进行分时复用,即同一段内存在不同时间段服务不同进程。 通过内存复用,使得虚拟机内存规格总和大于服务器规格内存总和,提高服务器中虚拟机密度。 智能内存复用可提升内存资源的利用率,帮助用户节省内存采购成本,延长物理服务器升级内存的周期。
有分区复用和页架复用两种:
分区复用:
分区大小可固定也可改变,一个程序/程序段占用一个分区
页架复用:
页架大小是固定的,一个程序/程序段占用多个页架
通过两种复用方式和两种多里地址方式,可构成四种存储管理的模式
单连续存储管理:通过一维逻辑地址空间和分区复用组合,即一个程序是采用一维逻辑地址空间来存储程序,并且采取分区复用的方式复用内存**(不可虚拟|共享)**
段式存储管理:通过二维逻辑地址空间和分区复用组合,即一个程序是采用段式二维逻辑地址来存储程序,并且采用分区复用来复用内存(可虚拟|共享)
页式存储管理:通过一维逻辑地址空间和页架复用组合,即通过一维逻辑地址空间来存储程序,并通过页架的形式进行内存复用(可虚拟|共享)
段页式存储管理:通过二维逻辑地址空间和页架复用那个组合,即通过段式二维逻辑地址空间来存储程序,并且通过页架的形式来实现内存复用(可虚拟|共享)
地址转换又称为地址重定位,即把逻辑地址转换为绝对地址
重定位的两种方式:
静态重定位:程序装入内存时进行地址转换,这是由装入程序执行的
动态重定位:在CPU执行程序时进行地址转换,这必须是由硬件完成的,效率较高
分配:进程装入主存时,存储管理软件来进行主存分配,并设置一个表格记录空间的分配情况
去配:某个进程撤离或归还内存资源时,存储管理软件将这些资源收回并调整记录表格
共享有以下两种意义:
1.多个进程共享同一内存的资源:即一块内存上,多个进程分别占用不同的存储空间,即不重复或共享
2.多个进程共享主存储器的某些区域:若干个协作进程拥有公共的内存程序块或数据块
由上可知,内存是有可能被干扰的,因此必须对其进行保护
对于本进程:
私有内存区:可读可写
公共内存区:根据自身权限
非本进程内存区:不可读写
存储保护极其重要,因此是由硬软件协同完成的,CPU也参与到生成地址保护中去
存储扩充的意义就是把磁盘作为内存的扩充,这样就只需要在内存中装入要执行的部分进程,不需要将整个程序全部装入内存
对换技术:将不在执行的进程调出内存
虚拟技术:值调入进程的部分内容
同样的,这个功能也需要硬软件协作完成:
1.当进程决定对换时,硬件会实行调换
2.当CPU处理到不在主存的地址时,即访问到了未装入内存的程序,CPU会发出虚拟地址异常指令,将该部分进程调入内存中执行
物理存储器容量是有限的,用户程序的大小,可能比内存容量小,也可能比内存容量大,有时候要大得多
主存的容量大小严重影响到了用户编写程序的大小和多道程序设计的道数
同时,程序执行时具有互斥性,时间局部性,顺序性和循环性,因此可以考虑部分调入进程内容
注意,虚拟存储器不是其物理不存在的意思,而是指对于内存来说,其实虚拟存在的,即与内存无关,其大小等均只与外存大小有关
总体来说为这三步:
程序的全部代码和数据存放在辅存中
将程序当前执行所涉及的那部分程序代码放入主存中
程序执行时,当所需信息不在主存,由操作系统和硬件相配合来完成主存从辅存中调入信息,程序继续执行
虚拟地址空间:容纳进程装入
实际地址空间:承载进程执行
因此,对于用户来说,计算机系统具有一个容量极大的主存空间,即虚拟存储器
虚拟存储器作为一种地址空间扩展技术,通常对用户是透明的,除非用户需要进行高性能的程序设计
缓存是比内存更快的存储器,其直接位于CPU内部,且分为L1,L2,L3三级,性能依次降低
三级结构:
L1:是最快的Cache,因此最小,速度最快,其与CPU频率一致
L2:其次快的Cache,因此稍大,较好的L2缓存频率与CPU一致,也有可能稍低于CPU频率
L3:是最慢的Cache,但也最大,因此,改善总线比设置L3可能更有利于提高系统性能
通常由高速存储器,联想存储器,地址转换部件,替换逻辑等组成
联想存储器:根据内容进行寻址的存储器
地址转换部件:通过联想存储器建立的目录表来进行快速的地址转换。若命中就直接访问Chace,未命中就去内存中找相应的地址
替换逻辑:根据相应逻辑,在缓存已满的情况下进行数据块的替换,并修改地址转换部件
存储管理是OS来管理内存的软件部分
有两点比较重要:
1.为了获取更好的处理性能,内存中的关键数据与程序往往被存入其中,这样就需要存储管理来对Cache进行调整,甚至包括对联想存储器的管理
2.为了获得更大的虚拟地址空间,存储管理也会对各种外放硬盘,SSD等进行管理
概念:每个进程占用一个物理上完全连续的存储空间
有三种:
单用户连续存储管理
固定分区存储管理
可变分区存储管理
如何区分系统区和用户区:通过一个栅栏寄存器分两个区域,并且通过栅栏寄存器来进行存储保护。栅栏寄存器相当于一堵墙,一旦越界,就会警报
一般采用静态重定位进行地址转换,即在将进程传入内存时,就将虚拟地址改为绝对地址
支持多个分区
分区数量、大小固定
可使用静态重定位
硬件实现代价低
但由于每个分区大小固定,一定会造成部分内存的浪费,即内存的内零头,即已经分配出去,但是得不到利用的存储空间
内部有一张内存分配表:包括了起始地址,长度,标志
内存分配与去配:有一个占用标志,当被占用时,就将相关进程的标志放入其中,未被占用时,就清除标志
浪费内存空间较小,仍会有小的不可用的内存分区,这些内存分区还没有被分配出去,但由于太小了无法分配给申请内存空间的新进程的内存空闲区域,称为内存外零头,外零头是不可避免的
且分区的大小、个数都是可变的
分配内存:会将内存中所有的空闲区域加起来,检查是否够进程使用,若不够,就让进程等待,若够,则会将小片的空闲区域拼成大块的内存区域,来存放新进程
数据结构描述如下:
主存中的每一个分区都有相应的分区描述器(pd)说明分区的特征信息。
flag: 为 0—空闲区; 为 1—已分配区
size: 分区大小
next:指向下一个空闲分区(只对空闲分区有用)
主存分配表分为已分配区表和未分配区表
每张表都包含起址、长度、标志三部分
有最先适应分配算法,最优适应分配算法和最坏适应分配算法
最先适应分配算法(首次适应算法):从未分配区表的首地址开始查询符合的内存块,将作业放到最先找到的足够大空闲分区
最优适应分配算法:首先把空闲区队列按分区大小由小到大的顺序排列,把满足要求的最小空闲分区分配给作业(最易产生外零头)
最坏适应分配算法:首先把空闲区按分区大小由大到小的顺序排列,将最大的满足要求的空闲分区分配给作业
下限寄存器中包含了分配内存的首地址和结束地址
当CPU在动态重定位时,若分配的内存绝对地址低于下限,就会报错中断
其中包含了限长寄存器和基址寄存器
首先,限长寄存器会判断逻辑地址是否限长,若限长且超过长度限制,便中断
再利用基址寄存器,来判断进程的内存占用长度是否在小于分区最大长度,若超过,则中断
由于固定分区有内碎片、内存利用率不高,且需要大片连续内存空间;可变分区有外碎片,且需要大片连续内存空间,这些碎片会导致内存利用率很低,页式存储管理就是为了解决这个问题才出现的
程序(逻辑)地址空间分成大小相等的页面,编号从0开始;同时把内存也分成与页面大小相等的块,编号从0开始;当一个用户程序装入内存时,以页面为单位进行分配。页面的大小是为2n ,通常为1KB,2KB,4KB等等
相应程序或数据的逻辑地址存在页表中,页表就是一个页号及其对应的物理块号(页面号),这样就可以用于转换页架号
对页面和页的申疑:页面从基本上来说,就是内存中的一个物理块,其大小是确定的。而页则是每个作业的地址空间占用的基本单位,每个作业占用一系列页。在这里我们可以对3.6.2进行一定理解,即真正的物理地址是页面,而页号则是每个作业的逻辑地址,在访问页面前要对其页的内容进行转换
还有两点注意点:
1、页面大小等于块大小,一个块存放一个页;
2、进程有多少页就分配多少块,但不必一定是连续的块
逻辑地址由页号和单元号两部分组成
物理地址由页面号和单元号两部分组成
逻辑地址和物理地址的变换:就是将逻辑地址的页号替换为页面号即可
通过一个位来记录主存的分配情况,所有的存储情况都保存在一张位示图中
共享分为数据共享和程序共享
数据共享:不同进程可以使用不同页号共享数据页 因为不同的数据可以存在不同的页中
程序共享:不同进程必须使用相同页号共享代码页 因为代码应当是相同的段
页表是用于地址转换的,即进行页号和块号的转换。每一个进程都有一张页表
页表存放在内存中,每次进行地址转换时有如下步骤:
1.按照页号读出页表中的页面号
2.计算出相应的物理地址来进行读写
由于两次读取内存,就导致速度很慢。相应的解决方法就是将页表放入缓存Cache中
快表是储存在高速存储器中的部分页表,是专门用来提高地址转换速度的
这里的高速存储器是联想存储器,是按照内容寻址的,并非按照地址访问
1.记录到需要转换的页号
2.在快表中查询,若已存在于快表中,则由页面号和单元号可以直接形成绝对地址
3.若不在快表中,就需要在页表中查询并形成绝对地址,并将该页登记到快表中去
4.当快表快要填满时,就会按照一定策略淘汰一个旧的登记表
进程表用于记录每个进程的名称,页表起始地址和页表长度
这里的虚拟也是指外存,并非不存在
总体概括为:将进程的页面装入虚拟存储器,只调用部分到内存中,随后根据执行行为,动态的调入所需要的页和进行必要的页面调出
首次只把进程第一页信息存入主存,称为请求式页式存储管理
由于存在虚拟存储器,因此需要扩充页表项来存储虚拟地址,实际地址和一系列标志(主存驻留标志,写回标志,保护标志,引用标志和可移动标志)
处理地址是交给CPU处理的。如果查询的相关页表在内存中,那么就可以直接计算出绝对地址
若查询的相关页不在内存中,则会发出CPU缺页中断,特别注意的是,这里的中断是即时中断,即一有中断发生,立刻切断程序执行中断,不会等待程序执行完
缺页中断的处理:若有空闲的页架,就可以从辅存中调入页,来进行更新等。若没有空闲的页架,就需要决定淘汰页,以此来更新页表和快表
首先,逻辑地址由页号和页内偏移两部分构成(因为部分页面内有多个程序,每个程序不一定占用整个页面便会共享)
p(页号) = 逻辑地址 / 页面大小
w (页内偏移)= 逻辑地址 % 页面大小
逻辑地址=p(页号)×页大小+w(页内偏移)
然后根据页表找到对应的物理块,进行物理地址的计算
上图就是一个十进制的举例,我们来看看
首先计算页号:3000 / 1024 = 2
再计算偏移量:3000 % 1024 = 952
对应块号为7,那么物理地址就是7KB+952
下面介绍十六进制的举例
具体方法如下:
反置页表及相关硬件机制在地址转换、存储保护、虚拟地址访问中发挥了关键作用。
内存管理单元MMU是为页式存储管理设置的专门硬件机构。MMU是CPU管理虚拟/物理存储器的控制线路,把虚拟地址映射为物理地址,并提供存储保护,必要时确定淘汰页面。
反置页表是MMU用的数据结构,用来完成内存页架到访问进程页号的对应,即物理地址到逻辑地址的转换。
针对内存中的每个页架建立一个页表
反置页表中,包含:进程号、进程标志位、页号、链指针
1.MMU读取逻辑地址中的进程号和页号
2.通过哈希函数,转换成一个哈希值,通过哈希表指向反置页表的一个表目
3.若在反置页表中存在该表目,就可通过索引(页架号)直接找到物理地址的页架号
4.若无该表目,就发生中断,等待系统处理
由上可知,当CPU进行内存访问时,有以下三种情况
1.页面已装入内存,有对应的页帧
2.非法的页面引用
3.合法引用,但是引用对象不在内存中,即在虚拟内存中
在页表中有一中断位,来反应是否缺页中断,取1时表示该页不在内存,取0表示该页在内存中。
这个时候就需要扩充页表了,之前页表中仅有页号与块号,而为了方便页面调度,通常将页表扩展成如下形式
是否引起缺页中断的判断步骤如下:
1.判断是非法引用导致的缺页中断还是合法引用导致的缺页中断
2.找到一个空闲页帧,这个页帧用于将所需的页面信息存入
3.从外存中调入所需的部分页表
4.更新页表内容,更新中断位
5.缺页中断返回并重新调用引起中断的那条程序
但是万一页面数不够了呢?这又如何进行页面置换呢?此时就需要用到页面调度算法了
页面调度是指当需要淘汰页时,该以何种方式进行淘汰,即选择淘汰页
页面调度算法就是具体决定哪些淘汰页的算法
不理想的页面调度算法会导致刚调入的页面又立即被调出等等,这种现象被称为抖动或颠簸
这里要提一下缺页中断率
首先定义一下缺页:是指需要访问的页不在内存中
缺页中断率=缺页次数/总访问次数
页面数、页面大小、用户程序的编制方法会影响缺页中断率
理想的调度算法是:在调入新页面时,会首先淘汰不会访问的页,然后选择距今最长时间再访问的页
但由于CPU必定无法预知后续会发生的事情,因此OPT只可模拟,不可实现、
衡量页面淘汰算法的优劣:缺页中断率=f/a (a是总的页面访问次数,f是缺页中断次数)
同时为了淘汰不用的页,就需要进一步扩充页表
页号 | 主存块号 | 中断位 | 辅存地址 | 改变位 | 引用位 |
---|---|---|---|---|---|
/ | / | / | / | 0表示最近没被访问/1表示最近被访问 | 0 该页调入内存后没有修改/1 该页调入内存后修改过 |
总是淘汰先调入主存的页,这是模拟程序的顺序执行,是有一定道理的,但并非最好
淘汰最近一段时间中最久没用的页,这是比较好的页面调度算法,但是实现的代价太大了,需要维护特定的特殊序列才可以实现,可以用堆栈来进行更新
实现方法:采用压栈,但与FIFO不同的是,当某个页面被访问到的时候,该页面号被置为顶部)
利用指针来指向要被淘汰的页
这里也是用了引用标志位:
调入内存 标志置为1
访问内存页面时 标志置为1
每次用指针扫描时,都将标志为1的置为0,标志为0的淘汰
制定一个计数器,一旦被访问,就将计数器加1
在计数最小的页面中淘汰即可
由于部分页面刚调入内存,还未被引用,先删除计数器最大的页面
一个进程在执行前,就必须拥有部分页帧,即这部分页帧可以使得该进程可以运行或初始化
这就会涉及到页帧分配 常用的页帧分配有fixed allocation和priority allocation
第一个方式是相等分配,即所有进程平分页帧
第二个方式是按照进程映像占用的逻辑空间大小,按相应比例分配页帧,类似按需分配
即按照进程的优先级高低进行分配
若进程出现了缺页,会从自身进程占用的页帧中选取页面调出或者从较低优先级的进程中选取页帧来换出部分页面
全局置换:即进程可从所有页帧中选取一个进行置换操作,其可以选取其他进程的页帧
局部置换:进程只能从其自己占用的一个页帧中选取页面进行置换
抖动就等于进程一直忙于换入换出页面
有多种情况会导致抖动:
1.本身内存中的进程数就过多
2.原先进程不多,CPU利用率低,OS便将大量进程放入内存中,导致内存中进程过多,产生抖动,CPU利用率又一次降低,OS以为进程不够多,便再加入进程量,进而造成恶性循环
按需调页的基础是,当CPU在执行一个进程的时候不需要用到该进程的所有代码,只需要将要执行的那部分内容调入内存中即可
同时,调入是懒惰交换,即只有CPU要求调度某一部分程序且该部分程序不在内存中时,才会进行调入
用户的逻辑地址空间划分为若干段,每个段定义了一组逻辑信息,每个段都有自己的名字——段名(通常用一个段号代替),段的长度由相应的逻辑信息组的长度决定
每个段都从0开始编址,并采用一段连续的地址空间
段式逻辑地址要用两部分组成:段号s和段内偏移地址d。在分段存储情况下,进程的逻辑地址空间是二维的
段式存储管理的内容都存在于段表中,段表包含了段号,段长,本段内存起始地址
页是信息的单位,逻辑空间连续。段是信息的单位,逻辑地址空间不连续
页的大小固定且由系统确定。段的长度却不固定,取决于用户所编写的程序
分页的作业地址空间是一维的。分段的作业地址空间是二维的
大致分为数据文件和程序
其中数据文件分为数字文件、文本文件与二进制文件
文件类型的区分方式有很多,其中最常用的是以文件扩展名区分
分为无结构文件、简单的记录型结构、复杂结构
无结构文件:一串字节流 可以插入控制字符来模仿相关结构文件
简单的记录型结构:如行文件、固定长度文件、变长度文件
复杂结构:格式化文档、重定位可执行文件
文件名:唯一一项可行性指导文件信息
文件标识:在文件系统中,该标识才是唯一的身份标识
文件类型
位置:文件内容在存储设备中的首地址
长度
保护:即读、写、执行权限
时间,日期,用户标识
创建文件 读 写 文件内定位 删除 截取
这里举例打开文件与退出文件
打开文件:将文件从外存中复制一份到内存中
关闭文件:将文件从内存中保存到外存中去
直接访问:定位要访问的数据块号直接访问
串行访问:只能从标记的开始位置开始访问
目录结构与文件一样,驻留在磁盘
目录相当于一堆节点的集合,该节点包含了文件的基本信息
1.单层目录结构
即所有用户的所有文件都放置在同一层
2.二层目录结构
即为每一个用户建立一个独立目录
3.树型目录结构
即数据结构中树的类似结构
这里有绝对路径和相对路径的概念,与基本理解一致,创建新文件就是在当前目录创建一个新文件
4.有向无环图目录结构
可以实现文件的共享,即不同绝对路径下指向同一文件
操作系统用一个计数器来确定文件的共享量
当且仅当共享量-1=0时才可删除共享文件,即要删除共享文件的话,就要同时删去所有共享了该文件的目录下的该文件
5.图目录结构
即有环目录,这是必须要被避免的,方法如下:
1.保证指针不得指向子目录
2.利用算法清理孤立环
文件系统大多是放在磁盘中的
通过RAID技术,可以将一个分区跨越多块磁盘,同时一个磁盘当然也可以分成多个分区
根分区:放置操作系统内核及其他的文件系统
在内存中有一张安装信息表:用于即时查询各种文件系统信息
文件系统必须安装好、建立好目录才可被访问
每一个文件系统被安装在一个安装点上
如何进行共享?那肯定是将一个文件放入一个用户组中,该用户组的用户对这个文件有一定访问权限
由上可知,我们需要两个ID来区分,User ID和Group ID分别来唯一的标识用户和用户组
保护即对不同的用户开放不同的权限
基本权限如下:读 写 执行 附加 删除 列表
物理块与逻辑块
物理块
文件的存储设备被格式化后常常划分为若干大小相等的物理块(通常为512B、1KB、4KB等等),并给每个存储块有个编号,称为物理块号。从而,以块作为分配和传送信息的基本单位。所有块统一编号以块为单位进行信息的存储、传输、分配
逻辑块
为了有效地利用存储设备和便于系统管理,一般把文件信息也划分为与物理存储设备的物理块大小相等的逻辑块
文件的基本逻辑单元为数据块
文件的管理信息被存在文件控制块FCB中
文件控制块的结构:
1.权限
2.执行的操作记录(新建,执行,读写等)
3.文件的用户,用户组
4.文件的大小
5.文件数据块或文件数据块的指针
文件系统是层次化的管理系统
文件系统多主存缓存,要求高效管理文件
磁盘的设备驱动程序仅操控物理设备,对其余如内存等硬件无关
device(基础设备)-> I/O control(是最低层次的控制,直接与设备交互)-> basic file system(基础的文件系统,用于控制文件的读写命令)-> file-organization module(即管理逻辑块与物理块)-> logical file system(管理信息,数据结构,文件保护等)
1.每个文件都有引导块,用于将OS从磁盘引导至内存中
2.分区控制块保存分区的详细信息
3.目录结构用于组织、管理文件
这里主要分析内存中的文件系统结构(打开与读取步骤)
1.用户申请打开一个文件
2.文件系统在内存的目录结构中查找相应的文件(目录结构原先在磁盘中,在第一次访问时会被部分或全部读入到内存中)
3.可以从目录结构中查到文件在磁盘中的存储位置,及相应文件控制块的位置
4.在打开文件时,每个文件在内存中都存在一张文件打开表(保存了打开指定文件的所有信息),在该表中查到需要访问的文件索引值
5.内存中还有一张打开文件的系统总表(在该文件系统下打开的文件都会在这张表内有记录),我们通过4中的文件打开表,与总表建立连接,文件系统会将上面找到的文件控制块信息放到这张表里去,以便于记录操作信息
6.进行文件数据块的查找读取等操作
虚拟文件系统是对各种不同文件系统的统一管理,使得用户可以使用VFS提供的统一系统调用界面去访问所有类型的文件系统,这大大简化了用户端的压力
目录实现总体有两种方法:线性列表和哈希表
1.线性列表
除了文件名,表项内含指针,指向文件的数据块
较为简单,但时间复杂度不好
2.哈希表
哈希表是通过哈希数据结构来实现目录
时间得到了简化,但哈希冲突等问题依旧不可避免
这里讨论三种分配方法
连续分配 链接分配 索引分配
连续分配中有一张表(FAT),记录了文件名 起始地址 长度
逻辑地址与物理地址的关系:
物理地址=文件起始物理地址+前面的总数据块数*数据块大小+数据块内部的偏移
逻辑地址的求法:指定数据块
优点:
1.与数组一样,可以随机访问
2.实现简单
缺点:
1.不可增加长度,因为后面的数据块可能被占用
解决方案:添加一个指针,当要增加文件长度时,该指针指向另一片连续空间
2.会有许多空闲块
即如链表一般,一个文件的数据块不需要连续,而是通过指针互相连接
逻辑地址与物理地址的关系:
物理地址=文件起始物理地址+前面的总数据块数*数据块大小+数据块内部的偏移
逻辑地址求法:指针指向位置
特别注意:内部偏移量=原偏移量+1,+1是因为指针,该指针指向该文件的下一个数据块
优点:
1.可以充分利用空白数据块
2.指针占据一定空间
缺点:
1.无法随机访问
优化方法:链表索引
即将所有指针的位置放入一张FAT中,这样就可以根据FAT迅速找到所需要查找的数据块的所指指针,根据该指针便可以快速得到相应数据块逻辑地址
2.太依靠指针,对磁盘设备要求高
索引分配类似如上的链表索引
其与链表分配不同的地方就在于其抛弃了链表结构,真正通过索引块中的索引表(即表内的编号)来寻找数据块
逻辑地址与物理地址的关系:
物理地址=文件起始物理地址+前面的总数据块数*数据块大小+数据块内部的偏移
逻辑地址求法:索引编号
优点:
1.支持随机访问
2.支持动态伸缩文件长度,没有外部碎片
缺点:
1.需要建立索引数据块
2.索引数据块的访问耗时较长
索引分配的扩充办法——多重索引
当一层索引不够用时(即索引表满了但还未放下所有文件数据),可以采用二层索引,即让一层索引的每个指针再去指向一张索引表,这样就是一层索引的平方倍容量
通过位图来管理各个空闲块(一个一维数组)
对应下标的值来代表对应下标数据块的状态,0为空闲,1为被占用
因此,n个数据块需要n个单位长度的位图来管理,即占用n bit
内存之外的存储器都成为大容量存储器,且一般越大读取速度越慢
由若干面组成,每一面有一个同心圆,
每一面的同心圆可分成多个小同心圆,每一个小同心圆都是一个磁道且可等分成多个扇区
扇区是I/O的基本单位,读写均以扇区为单位
0扇区是最外边柱面的第一个磁道的第一个扇区
读写装置称为磁头,每一面上下都有磁头
与磁盘有关的数据计算:
1.平均宣传延迟时间,假设为X转/min,则该时间=60*1000/X/2,因为平均访问一个扇区对称扇区相加再相除,故要除2
2.CD-ROM的读取速率为150KB/s
当前有三种存储方式:
DAS随机附赠存储
NAS:网络附加存储
SAN:存储区域网
通过LAN/WAN来进行存储
NAS - LAN/WAN - client
当用户需要访问时通过网络寻找
NAS不一定是盘阵,一台普通的主机就可以做出NAS,只要它自己有磁盘和文件系统,而且对外提供访问其文件系统的接口(如NFS,CIFS等),它就是一台NAS。就是将文件放在网络中,需要时通过相应的网络映射来找到该文件
通过WAN/LAN存储
storage array - SAN - server - LAN/WAN - client
通过服务器等,用户可以访问SAN硬件(一个光通道交换机)来获取相关存储结构
SAN\NAS的区别:
可以这样来比作:SAN是一个网络上的磁盘;NAS是一个网络上的文件系统。其实根据SAN的定义,可知SAN其实是指一个网络,但是这个网络里包含着各种各样的元素,主机、适配器、网络交换机、磁盘阵列前端、盘阵后端、磁盘等。长时间以来,人们都习惯性的用SAN来特指FC,特指远端的磁盘。那么,一旦设计出了一种基于FC网络的NAS,而此时的SAN应该怎样称呼?所以,在说两者的区别时,用了一个比方,即把FC网络上的磁盘叫做SAN,把以太网络上的文件系统称为NAS,我们可以这样简单来理解。
普通台式机也可以充当NAS。NAS必须具备的物理条件有两条,第一,不管用什么方式,NAS必须可以访问卷或者物理磁盘;第二,NAS必须具有接入以太网的能力,也就是必须具有以太网卡。
由寻道时间、旋转延迟、传输时间三部分组成
寻道时间:磁头移到所需读扇区所需要的时间
旋转延迟:将磁盘所需读扇区旋转到磁头下面的时间(固定)
传输时间:读取数据的时间(固定)
三部分时间中寻道时间占比最长,而传输时间一般较短
当多个进程要访问磁盘时,就需要遵循一定的磁盘调度算法进行计算
根据进程要求访问磁盘的顺序来进行访问
就是离当前磁头最近的柱面先被访问
会导致较远较早申请访问的进程产生饥饿问题,对实时操作的应用如股票客户非常不友好
磁头从磁盘的一端开始向另一端移动,沿途相应访问请求,直到到达了磁盘的另一端,此时磁头反向移动并继续响应服务请求,也称为电梯算法(从上到下),但横移消耗较多时间
磁头从一端向另一端移动,沿途响应请求,当其到达另一端,便立刻返回开始处,即上升,在上升过程中不响应任何请求
即在每个方向上只移动到最远的地方(有数据请求的地方),不移到另一端
低级格式化:吧磁盘划分为扇区,以便磁盘控制器可以进行读写
分区:把磁盘划分成一个或多个柱面组
逻辑格式化或创建文件系统
主引导记录:是逻辑上第一个读取的扇区,存储分区信息和小段引导代码
引导记录:在主分区或扩展分区中,会存在真正引导操作系统的程序,即主引导记录会找到引导记录,引导记录会找到需要引导的程序并解压,随后启动操作系统
即多个硬盘通过冗余实现可靠性
通过荣誉来改善可靠性,即不同的硬盘存储同样的数据拷贝,可以防止一块硬盘损坏时还有一块硬盘可以继续使用
存储一个副本,可以保证安全
数据分散:在多个磁盘盘上分散数据, 可以改善传输率
感谢你能看到这里,以上就是操作系统常考的全部内容,理论知识需要大量习题补充,所以仍需做题来获得好成绩。祝考试顺利