1. 第三章操作系统基本原理(P116)
1.1. 操作系统概述
一般操作系统包括:处理器管理、存储器管理、设备管理、文件管理和用户接口等5种功能。
对处理机的分配和运行进行有效的管理。在多道程序环境下,处理机的分配和管理是以进程为单位的。因此处理机管理,可以归结为进程管理。
存储器管理,对内存的分配、保护和扩充。
设备管理,设备分配(采用缓冲和虚拟技术),设备传输控制(物理的输入输出,I/O),设备独立性(用户向操作系统申请的设备与实际的操作设备无关)。
文件管理,对文件的存储空间管理,包括存储空间的分配和回收,目录管理、文件操作管理和文件保护等。
用户接口,使用操作系统功能的手段;分为程序接口和操作接口。
操作系统的类型
可分为:单用户操作系统、批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统、并行操作系统和嵌入式操作系统。【注:分类标准很混乱】
单用户操作系统,一台处理机上只能支持一个用户程序的运行。
批处理操作系统,作业处理系统。分为单道批处理系统和多道批处理系统。
分时操作系统,为了解决批处理系统无法进行人机交互的问题,并使多个用户通过自己的终端以交互的方式使用计算机,共享主机中的资源。系统采用分时技术,将CPU的时间划分成很短的时间片,轮流分配给各个终端作业使用。
网络操作系统,具有网络功能的操作系统,主要特点是网络中各种资源的共享和各台计算机间的通讯。
分布式操作系统,各台计算机间相互合作,共同完成一个任务。网络操作系统的高级形式,与网络操作系统的区别是,在于任务的分布性,即把大任务分成多个小任务,并分派到不同的CPU上执行。
嵌入式操作系统,运行在嵌入式智能芯片环境中。
操作系统的结构
从结构看,主要有整体结构、层次结构、客户/服务器结构和面向对象结构。
整体结构,也称为模块组合结构或无序结构,是基于结构化程序设计的设计方法,开发的操作系统。模块作为操作系统的基本单位,每个模块具有一定独立的功能,若干个相关联模块协作完成某个功能。模块之间无序调用。所有的模块连接成一个完整的操作系统。
层次结构,将操作系统划分为内核和若干模块(或进程),这些模块按功能的调用次序排列成若干层次,各层之间是单向依赖或者单向调用关系,即低层为高层服务,反之不能。缺点建立模块间的通信机制,模块间通讯花费很大。
客户服务器结构,现代操作系统大多拥有两种工作状态,分别是核心态和用户态。一般应用程序工作在用户态,内核模块和最基本的操作系统核心工作在核心态。也称为微内核结构。大多操作系统功能由在用户态的服务器进程来实现。客户进程将请求发给服务器进程,服务器进程将处理结果返回服务器进程。服务器进程不能直接访问硬件。主要优点:
统一的接口。
可伸缩性好
可移植性好,所有与具体机器特征的相关代码,全部隔离在微内核中。
实时性好。
安全可靠性高
支持分布式系统
面向对象结构
进程管理
进程是进行资源分配和调度的基本单位。
进程是通过物理实体被感知的,进程的物理实体又称为进程的静态描述,通常由三部分组成,分别是程序、数据集合和进程控制块(Process Control Block,PCB)。程序描述了进程所要完成的功能,数据集合描述了程序运行所需要的数据部分和工作区;PCB包括进程的描述信息、控制信息和资源信息,是进程动态特性的集中反映。程序和集合是进程存在的物质基础,是进程的实体;PCB是进程存在的标志,进程与PCB是一对一的关系,操作系统利用PCB对并发执行的进程进行控制和管理。
进程的状态
进程与程序不同,它是活动的且有状态变化的。
三态模型
具有三种基本的状态,分别是运行、就绪和阻塞,入下图:
程序加载后处于就绪状态,分配的CPU时间片到,进入运行状态,CPU时间片到,回到就绪状态;在运行状态中,如果需要等待某事件,进入阻塞状态,事件条件满足后,进入就绪状态。
运行状态:进程占有处理机正在执行程序的状态。
阻塞状态:也称为等待状态或睡眠状态,是进程等待某个事件发生而处于暂停执行的状态。
就绪状态:进程已经分配到除处理机以外的资源,具备执行条件,等待处理机调度的状态。
五态模型
由于进程的不断创建,系统资源尤其是内存资源不能满足所有进程的要求。这时必须将某些进程挂起,放到磁盘对换区,暂时不参加调度,以负载均衡。挂起原因,可能是系统故障,或调试程序等等。
活跃就绪,指进程在内存并且可被调度状态。静止就绪,对换到外存时的就绪状态,是不能直接被调度的状态。
活跃阻塞和静止阻塞同理。
信号量与PV操作
在多道程序中,由于资源共享与进程合作,使各进程间产生两种形式的制约关系,一种是间接制约,例如都需要访问打印机,执行打印操作;另外一种是直接制约,例如进程A通过缓冲区为进程B提供数据。
进程同步主要源于进程合作,是进程之间共同完成一项任务时直接发生相互作用的关系。在多道程序中,这种在执行次序上的协调时必不可少的。
进程互斥主要源于资源共享,是进程之间的相互制约关系。在多道程序中,每次只允许一个进程访问的资源成为临界资源,进程互斥要求保证每次只有一个进程使用临界资源。
在每个进程访问临界资源的程序段,称为临界区,进程进入临界区需要满足一定的条件,以保证临界资源的安全使用了系统的正常运行。临界区是进程在时间上互斥。即同一时间只允许一个进程执行。
【注:在访问临界资源时,需要说明的是临界区的大小,因为CPU是按照分时执行进程的,当进程拥有临界区的资源后(进程在执行临界区的代码),CPU被分配到其他的进程上,此时临界资源,对于其他的进程也是无法访问的。JVM的监视器模型,实际上是一个面向对象化的临界区和临界资源,拥有监视器,即拥有对象锁,也意味着进入了临界区,此时资源,只允许临界区的代码访问;即此时其他的进程应该无法进入临界区,即执行临界区的代码,控制的机制实际上就是信号量,通过信号量来控制临界资源的当前的数量,和允许那些进程进入到临界区中。同理,在监视器模型中,线程(在这里只限于同步代码,线程和线程是存在明显区别的)请求对象锁(类似于信号量),对象锁未被拥有,线程进入监视区,拥有该监视器(整体执行监视器的代码,中途不会将将CPU的时间片,分配给其他的线程;进程则是同判断,决定其他的进程是否执行临界区的代码,在同一个信号量下,保证临界区的代码只能有一个进行执行),可以执行对象的方法,注意,仅仅该对象的方法,其他的对象不包括在内,因为没有拥有其他对象的监视器,线程执行完成后,执行notify,通知其他线程,可以申请该对象的监视器。监视器monitor,即监视对象执行的监视区域的代码,即拥有监视器,才能执行监视区域的代码,和锁的概念不同,锁没有代码区。监视器是按照对象来区分的,如果在一个对象的监视区内,调用其他对象的方法,此时线程执行其他对象的方法,如果该方法,不需要拥有监视器,则同样按照线程分时去执行。即不会整体执行。】
信号量
信号量作为进程同步和互斥的工具。进程互斥,即临界区代码的访问。资源互斥,即不能对资源同时访问。
信号量是一个二元组(S,Q),其中S是一个整型变量,初值为非负,Q为一个初始状态为空的等待队列。在多道程序系统中,信号量是一种有效的实现进程同步与互斥的工具。信号量的值通常表示某类资源的数目,当它大于0,表示系统当前可用的资源数据量;当它小于0,表示系统中等待使用该资源的进程数量,即在Q队列上排队的PCB数量。信号量的值是可变的,由PV操作来改变。
【处理过程说明】S>0表示拥有资源数量;S<0表示拥有等待的进程数量。
P(S)/wait(s):表示当前进程执行还是进入阻塞队列。
如果:s=s-1;s<0;说明目前没有资源,当前进程进入等待队列(包括忙等,即自旋,空循环,while(0<1);阻塞,切换上下文,进入阻塞状态)。s > =0,表示拥有资源,进程执行。
V(s)/single(s);表示是否唤醒一个进程进入就绪队列。
s= s+1;释放一个资源后,如果s <=0,说明,队列中还是有等待的进程,唤醒该进程,进入就绪队列(是否执行,看wait)。
互斥模型(已有资源,同时申请):
互斥:S=1。
同步模型:
同步:S=0
互斥模型,信号量一般为1;即只有一个资源不能同时访问。互斥,先P后V。
同步模型,信号量为0;即只有相互合作,才能使信号量>0,进程才能执行。同步,先V后P。
死锁问题
产生死锁的四个必要条件:
互斥条件。任意时刻只允许一个进程使用资源。
不剥夺条件。进程已经占有的资源,不会被强制剥夺。
请求与保持条件。进程在请求其他资源时,不主动释放已占有的资源。
环路条件。环路中每一条边是进程在请求另一进程已经占有的资源。
对死锁的处理,常用的方法包括:预防、避免、检测与解除等方法。
死锁预防
采用某种策略,限制并发进程对资源的请求,使系统任何时刻都不满足死锁的必要条件。针对破坏死锁的四个必要条件进行。
破坏互斥条件:固有属性,不可改变。
破坏不剥夺条件:如果进程申请新的资源不能得到满足,则暂时释放已有的资源。该策略比较复杂。需要保护进程和资源的释放现场,同时会导致进程反复申请释放资源。
破坏申请与保持条件:进程一次性申请全部资源,如果有任一资源不满足,则其他资源也不分配,进程等待。
破坏环路:对资源进行编号,按照编号有序申请。
死锁避免
将限制条件弱化,允许死锁的存在但不让它发生,设置一种安全状态,让进程按照某种顺序分配资源。在某一时刻系统能够按照某种顺序为每个进程分配其所需的资源,直到最大需求,使每个进程都能顺利完成,则称此时系统处于安全状态。例如下表,系统处于安全状态,存在一个安全序列<P2,P1,P3>
银行家算法就是判断系统状态是否安全,从而决定是否为进程分配资源的一种方法。
死锁的检测和解除
是指系统保存资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。死锁检查算法,主要检查是否有循环等待。
有向图的顶点为资源或者进程,从资源R1指向P1的边,表示R1已分配给P1,从进程P1指向资源R2,表示P1因请求R2处于等待状态,有向图中的回路表示可能存在死锁。
P1 |
R1 |
R2 |
R3 |
P3 |
P2 |
解除死锁的方法:
资源剥夺法,挂起某个死锁的进程,将资源分配其他的进程。避免进程因资源枯竭而饿死。
撤销进程法,根据进程优先级,撤销低优先级的进程。
进程回退法,让一个进程或多个进程回退到可以解锁的状态。
线程管理
在现代操作系统中,引入线程的概念,是进程的活动成分,是处理器分配资源的最小单位,它共享进程资源和与地址空间。进程创建时,会创建一个线程,称为主线程。
线程从实现方式上分为三类:
内核线程,由操作系统内核创建并调度;
用户线程,不依赖于操作系统内核,由线程库创建、调用并管理。
轻权线程,由内核线程支持的用户线程。
与进程的比较
调度。传统操作系统,进程是资源的拥有、调度和分配的基本单位;拥有线程的系统,进程为拥有资源的基本单位,调度和分配的基本单位为线程。
并发性。引入线程的操作系统,不仅进程间并发,线程间也并发。
拥有资源。进程内的线程拥有的必不可少的资源,其他的资源,进程内的所有线程共享。
系统开销。进程切换,需要保存CPU、裸机地址空间的切换;线程间切换,仅需保存少了寄存器的内容。不涉及存储器管理的操作。此外由于同一进程中的多个线程拥有相同的地址空间,同步、切换和通讯无需操作系统内核的干预。
多线程操作模型
多对一模型。多个用户现场对应一个核心线程。不能并行运行在多处理器上。
一对一。一个用户线程对应一个核心线程。提供了并发性,但是创建核心线程开销会影响性能,限制了创建用户线程的数量。
多对多。综合上述模型
内存管理
包括以下几个方面:内存空间的分配与回收;配合硬件进行地址转换工作,把用户使用的逻辑地址转换为处理器能访问的物理地址;内存空间的共享和保护,使得多个进程能够同时访问公共程序所占的内存区,同时防止多个程序在执行过程中相互干扰,并保护区域内的信息不被破坏;内存不足时,可以使用大容量外存解决内存不够用的问题。
地址变换
将程序à目标程序(编译后),逻辑地址从0开始;装载到内存后,将逻辑地址转换为物理地址。
有两种方式:静态重定位和动态重定位。
静态重定位:在作业装入时,由作业装入程序实现地址转换。优点是容易实现,不需要硬件转换机构实现。在执行期间程序在内存中不能移动,难以做到内存共享,内存利用率低。
动态重定位:CPU访问程序和数据之前实现地址转换。必须借助硬件地址转换机构来实现。优点是程序可以在内存中移动,容易实现内存共享,有可能实现虚拟存储空间。硬件添加一个寄存器(称为重定位寄存器或者基址寄存器),当程序在内存移动时,将移动后的内存区域的首地址存储在基址寄存器内【注:此时还要求程序的内存时连续的】,寻址时,读取基址寄存器的地址+逻辑地址可以定位。
内存保护:重定位寄存器和界限寄存器。重定位寄存器保存的是操作系统分配给这个程序加载的内存机制,界限寄存器,保存程序的逻辑地址访问上限,即程序逻辑地址的最大值。这样就保证了程序在访问时,不会访问内存以外的区域。
程序步骤:编译à链接(将系统库的二进制映像并入程序的二进制映像文件中)à加载(将程序加载到内存中,分配内存地址)à运行。
动态加载是指:在运行时,将子程序加载入内存,为其分配内存地址。
动态链接:在运行时,将链接的系统的库的逻辑地址,更新为内存中系统库的地址(不在内存中,加载到内存中)。即在运行时进行程序和系统库的链接。
编译时和加载时捆绑的地址,逻辑地址空间(CPU为程序生成的地址空间)和内存地址空间是一致的;动态加载,逻辑地址空间和内存地址空间不一致,因为随着子程序动态加载,逻辑地址空间是不停的上涨的。
分区内存管理
固定分区管理和分页式分区管理,来源动力为:更高的内存利用率。
分段式和虚拟内存,来源动力为用户需求。内存分区管理为了支持多道程序。
分区à分区表记录分区大小、起始地址、是否已分配。
固定分区,作业装入前已经分配固定大小,分区不可变à可变分区,作业装入时,根据作业大小分配
|
分配时间 |
大小 |
数量 |
分配算法 |
固定分区 |
作业装入前 |
固定 |
固定 |
简单,一个分区一个作业 |
可变分区 |
作业装入时 |
根据作业大小决定 |
根据作业装入数量决定 |
首次适应算法:从空闲分区第一个表目查起,将最先满足要求的分区划分出满足作用的分配给作业。优点速度快;缺点碎片多。 最佳适应算法:从全分区找出一块满足作业要求的最小分区,分配。先将空闲分区从小到大排序。 有利于大空间需求作业。 最坏适应算法:从全分区找出一个最大满足要求的分区分配给作业。先从大到小排序。适应小作业。 实践证明:首次好于最佳,两者好于最坏。 |
可重定位分区 |
|
|
|
在适当的时候将零散的空闲分区,合并为一个大的空白分区。移动已分配的分区。 只有程序的地址是可重定位,才能实现分区合并。 |
多重分区 |
|
|
|
为一个作业分配一个以上分区。便于程序共享数据和程序,复杂,需要动态重定位结构硬件支持。 |
对简单是单一连续管理,将内存空间分为两个部分,一部分存储操作系统的程序和数据,另外一部分存储用户的程序和数据。只能用于单任务单用户的操作系统中。
分区管理是支持多道程序运行的最简单的一种内存管理方式,包括固定分区、可变分区、可重定位分区和多重分区。
固定分区:也称为静态分区,作业装入之前内存被划分为多个分区,运行期间,不在重新划分,分区个数和分区大小不可变。一个分区装入一个程序。系统分区表说明分区的大小、分配的地址和十分已分配。特点,简单,缺点,内存利用率低。
可变分区:也称为动态分区,作业装入内存时,从可用的内存中划分出一块区域分配给他,形成一个新的分区。在选择空闲分区时,有几个算法可选:1)首次适应算法,从空闲区表第一个表目开始查找,把最先满足要求的分区分给它,最合适正好,如果比申请的大,剩下的空间比较小。要求空闲区表地址空间从低到高排列。容易导致内存碎片。2)最佳适应算法,找到满足程序、最小的空闲区域。有利于大进程空间的装入。3)最坏适应算法,将最大的内存区域,且大于等于作业要求大小,分配给它。
可重定位分区:解决存储器碎片问题的有效简单算法。在适当的时候,将空闲区拼成一个大的空闲区。
多重分区:将作业分配一个以上的分区。
存储区保护:常用方法,界地址保护和设置存储键保护。
段页式存储管理
分区存储管理存在产生存储碎片和空间管理比较复杂的问题,究其原因,这种管理方式,要求把作业放到连续的一块内存区域。为了避免这种连续性要求,可以将作业的逻辑地址空间分成若干长度相等的区域(页),内存空间也划分为若干长度与页长度相等的区域(称为页帧或块),程序装入时,每个页对应一个页帧,这就是分页式存储管理的思想。
【注:分区式,将内存分区,一个区装入一个应用程序;分页式,将程序分页,将内存分为页帧,每一个也对应一个页帧;管理的粒度更小了;从管理整体的应用程序地址空间,到管理以页为单位的地址空间。内存管理,即对应用程序地址空间如果装入内存地址空间的管理。关键点在内存地址空间,应用程序地址空间,也是内存的地址空间。】
页式存储管理
页帧可以是连续的,也可以使不连续的。
地址转换过程:作业逻辑地址空间à页表(保存作业页和内存页帧的对应关系)à页帧号和页帧内偏移。
段式存储管理
段式存储管理,按用户作业的自然段来划分逻辑空间,每段占用连续的地址空间。逻辑地址二维,由段号和段内地址组成。每个作业见一个段表,段的分配与回收与可变分区存储管理相同。
和页式的区别:
分页作业是单一的线性地址空间,分段作业地址空间是二维的。【注:即在分页存储管理时,作业的逻辑地址,分页作业也是一维的,但是注意映射过去的页帧地址是二维的;分段作业的逻辑地址是二维的。】
页是信息的物理单位,大小固定,分页活动用户看不见【注:系统行为,目标程序的地址空间是一维的。】。分页目的提高内存的利用率。段是信息的逻辑单位,长度不定,分段活动用户是可见的,目的更好的满足用户需求。
分页存储实现单段式虚拟存储系统,而段式存储实现多段式虚拟存储系统。
段页式存储管理
段式和页式结合,作业按照逻辑分成若干端,每段分成若干页。作业对应一张段表和若干页表。
逻辑地址转换步骤:地址转换机构取出逻辑地址,并根据页的大小将段内地址分为页号和业内地址。
需要三次访问内存:第一次:根据段号检索段表,找到该段的页表存储地址;第二次:根据页号查页表,取出相应的页帧号,将页帧号和业内地址合并得到物理地址;第三次:根据物理地址获取指令和数据。
虚拟存储管理
以上的问题:作业必须全部装入内存,装入的程序,可能一直不会用,也不同同时使用。降低的内存的利用率。
解决:运行期不全部装入,只装入当前运行的那部分程序和数据,其余部分留在外存;当执行的指令或数据不在内存时,再由操作系统请求调入内存。如果内存已满,将暂时不用的程序和数据调入外存。
将这种具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的存储器系统称为虚拟存储系统。
局部性原理
指程序执行呈现局部性规律【注:将实践提升为理论,并系统化,同时能够指导实践。很多人可以提出想法或者思路,但是不能完善】。时间局部性【注:指程序】:同一条指令,不久以后还会执行;空间局部性【注:指数据】,程序访问存储单元,不久相邻的存储单元也会被访问。
工作集。指在某段时间间隔内,进程实际要访问的页面的集合。
页面置换算法
当内存中没有空闲页面,而又有程序和数据需要从外存装入内存,需要从内存中选择一个或多个页面淘汰出去。良好的页面置换算法应该淘汰那些被访问概率最低的页面。
随机淘汰算法。无法确定那个页面被访问概率最低时,随机选择某个页面,并换出。
轮转算法。按照页面编号,循环换出内存每一个可以替换的页面。不论刚进入内存还是,以驻留很长时间。
先进先出算法(FIFO:First in First Out)。选择内存驻留时间最长的页面替换掉。该算法忽略了一个要素,驻留时间最长的页面往往是需要频繁访问的页面。
最近最少使用算法(Least Recently Used,LRU)。选择内存内最久没有访问的页面淘汰。
最近没有使用算法(No Used Recently,NUR)。
最优置换算法。
时钟页面替换算法(Clock)。将调入内存的页面链成循环队列,用一个指针指向下一个将被替换的页面。
点滴
需要把作业装入内存,最简单的方式,就是把内存划分为两个区域,一个系统区,加载操作系统,一个用户区,加载用户作业。
问题出现了,如果多道作业怎么办?
那么把用户区分为多个区固定大小的分区,一个分区装入一个作业。即:固定分区管理。
问题有来了,有的作业很大,一个固定分区装不下,有的作业又很小,一个分区内大部分内存都浪费掉了。怎么办?不同分区之间的作业可以相互访问,导致数据污染,怎么办?
分区大小不在固定,按照作业大小去确定一个分区大小。即:可变分区管理。内存中有多个不连续的空闲区域,怎么去定位这个合适大小的分区分配给作业呢?首次适应算法(第一个合适的),最佳适应算法(最合适的)和最坏适应算法(最不合适的)。
出现数据污染的,则加上一个机制,作业只能访问本区域内的内存,采用基址寄存器和界限寄存器的方式实现。界限寄存器保存逻辑地址上限,为什么不保存物理地址的上限呢?因为物理地址是需要逻辑地址二次绑定生成,需要额外的计算资源。
新的问题出现了,在一轮轮的内存分配和回收过程中,产生了大量内存碎片,怎么办?如此下去,系统就没有合适的内存块分配了。
把碎片空闲区域合并,即可重定位分区。
新的问题出现,作业间需要共享程序和数据,同时有些数据是作业私有的,不能共享,必须保护,怎么办?
让作业分配给多个分区,不同的分区,确定不同的保护机制,即多重分区管理。
又是很严重的问题,虽然系统的分区可以重定位,但是每次重定位都需要移动内存的数据和程序,在移动期间,作业不能运行,浪费了大量的资源。怎么办?
很简单,既然碎片很多,那么我们就把作业的块变小,降低碎片的标准,例如把一个作业分为64K大小的逻辑地址块,这是只要有64K的空闲区域即可用。我们称之为页,即把作业的逻辑地址空间分为一页一页的。相应的对应的内存空间称之为页帧。在作业内建立一个页表,记录逻辑地址空间的页和内存地址空间的页帧的对应关系。地址结构也变成两部分,即页号和页内位移。同时地址寄存器,也变为两个,块地址寄存器(对应页号)和块内地址寄存器(对应页内地址)。称为页式存储管理。
新的问题出现了,作业的逻辑地址空间被系统均匀的分割为多个页,但是导致一些逻辑上很紧密的命令分散在多个页上,导致寻址效率低(因为系统共有联想存储缓存,会把要读地址的关联地址也都读入内存)。
好,既然将逻辑地址空间物理分段会有问题,那么我就按照作业的逻辑关系将逻辑地址空间分成一段一段的,此时逻辑地址空间不在是一维的线性的,而是二维的,一个逻辑地址由段号和段内偏移地址组成。此时各段可以放在不同的分区中,段的分配和回收和可变分区相同。段式存储管理存在和可变分区相同的问题,管理复杂,空间利用率差。即段式存储管理。
新的想法,页式存储内存利用率高,空间管理简单,但是用户不可识别,段式空间可以识别,但是管理复杂,空间利用率低。是否可以把两者结合呢。
段页式存储管理。逻辑地址分段,段内分页,地址结构分为四个部分:段号,段内地址,段内地址又包含页号和业内地址。
地址转换步骤。(1)地址转换机构取出逻辑地址(段号+段内地址),根据页的大小,转换为页号和页内地址;(2)根据段号检索段表,取出该段页表地址;根据页号查找页表,取出页帧号,把页帧号和业内地址组合,得到物理地址;(3)读取物理地址的内存,执行相应的指令。
问题又出现了,在上面的内存管理中,要求1)作业逻辑内存空间大小不能超过可分配的物理空间大小;在作业装入内存后,有些代码只运行一次,有些代码则根本不运行(例如错误处理代码,或不常用的功能),大大浪费了内存空间。怎么办?虚拟存储管理出现了。
此时程序并不全部装入内存,只把需要执行的程序和数据装入内存运行,其他的依旧保存在外存,当执行的指令和访问的数据不在内存时,操作系统调用请求调入功能,将其加载到内存,同时将不再执行的指令和数据调至外存。这样一个较大的程序可以在较小的内存空间运行。为什么会这样呢?因为程序和数据存在以下特点:
局部性原理,即程序执行的局部性原理。即一段时间内程序的执行,只局限于某个部分。包括(指令执行的)时间的局部性和(存储单元访问的)空间的局部性。时间的局部性是指,一个指令在执行后,一段时间内还会再次被执行(程序中存在循环),空间的局部性,访问的数据所在的存储单元,其附近的单元也会被访问(数据格式是线性的)。
工作集。
页面置换算法。当内存中没有空闲空间,而又有程序和数据需要从外存调入。就需要从内存选择一个页面置换到外存去。此算法称为页面置换算法。算法标准是:将被访问概率最低的页面置换到外存。
随机淘汰算法。随机选择一个页面。
轮换算法。按照页面编号,循环置换页面。
先进先出(FIFO,First in First Out)。滞留内存时间最长的页面置换到外存。问题:滞留时间最长,可能是经常访问的。
最近最久未使用(LRU,Last Recent Used)。最近一段时间,最久没有使用的页面置换到外存。
最近未使用(NUR,No Used Recent)。最近一段时间,未被访问的页面,任选其一置换掉。设置时钟周期即可,访问为1,未访问为0;每个周期开始置0。
最优置换算法。永久未使用,后者未来时间内长时间未使用的页面置换出去。计算时间很复杂。
时钟页面替换算法。
文件系统(P138)
文件是操作系统进行信息管理的基本单位。对软件资源的管理是通过文件系统实现的【注:在这里又出现了管理的维度问题,从文件的角度,软件可以看做文件资源,注意,这是无损的,且可穷尽的。也就是说软件资源是无穷尽的,但是从文件的角度看,组成软件资源的文件是有限的,且可穷尽的,那么就是可管理的】。操作系统必须考虑:目录的建立和维护,存储空间的分配与回收,信息的编码方法和存储次序,以及如何检索用户信息。
文件的组织结构
分为逻辑结构(从用户角度)和物理结构(从物理角度)。【注:更多关注的是同一个文件的逻辑结构和相应的物理结构】
1)逻辑结构。可以分为:1)流式文件,相关信息项的集合,基本单位是字(或字节);2)记录式文件,数据记录的集合,基本单位是逻辑记录,记录有等长和变长之分。
2)物理结构。文件物理结构是指文件在存储介质上的组织方式,它依赖于物理存储设备和存储空间,可以看做相关物理块的集合。物理结构决定了信息在存储设备上的存放位置和方式。【注:描述的核心是物理块,即文件由哪些物理块组成】常用的物理结构有:顺序结构,链接结构(物理块之间建立链表)和索引结构(为逻辑结构中的信息记录和物理块之间建立索引表)。【结构间的关系,是逻辑记录和物理块之间的关系。】
3)树形文件结构
存储空间管理
解决了三个问题:登记空闲区的分布情况,按需给文件分配存储空间,回收不在保留文件的存储空间。
【注:存储空间管理系统和文件管理系统,管理的内容组成整体的磁盘空间;文件管理系统管理有内容的物理块,存储空间管理系统管理,空的物理块。】
以上问题可以总结为磁盘空闲区的管理问题,常用方法有:空间文件目录法、空闲块链法、位示图法和成组链接法。
空闲文件目录:连续的为分配的区域块为空闲文件,所有的空闲文件单独建立一个目录,表目内容为:第一个空闲块地址(物理块块号)和空闲个数,分配时,可以采用首次适应算法(从头开始,找到第一个满足的)和最佳适应算法(满足文件大小,空闲区域最小的空闲文件)。优点:分配和回收比较简单,缺点:管理空闲区和空闲表需要空间。
空闲块链:将空闲块链成链表。增加/移去空间块时,效率低。
位示图法:通过使用m*n的矩阵来管理空闲块。
成组链接法:对空闲块链法的一个改进。
分布式文件系统
DFS的特点(DistributedFile System,DFS)。具有网络透明性和位置透明性。网络透明性,访问网络上的文件如同访问LFS文件系统上一样;位置透明性,用户通过用户名访问文件,但是不需要知道文件保存的位置。
DFS组成:由运行在服务器上的DFS软件和运行在客户机上的DFS软件组成。
DFS架构。采用客户机/服务器架构。