精华内容
下载资源
问答
  • 操作系统总结

    万次阅读 2016-08-22 21:08:48
    from:... ... ...第一章 操作系统引论 ...系统的目标:有效性(提高资源利用率和系统吞吐量)、方便性、可扩充性、开放性。有效性和方便性是操作系统最重要两

    from:http://www.cnblogs.com/yinluhui0229/archive/2011/05/30/2063607.html

    http://my.oschina.net/pangyangyang/blog/188507


    第一章 操作系统引论

    1. 系统的目标:有效性(提高资源利用率和系统吞吐量)、方便性、可扩充性、开放性。
    2. 有效性方便性是操作系统最重要两个目标。
    3. 操作系统的作用:

    (1)     OS作为用户与计算机硬件系统之间的接口

    (2)     OS作为计算机系统资源的管理者(处理器、存储器、I/O设备、数据程序)

    (3)      OS实现了对计算机资源的抽象(在硬件上覆盖I/O设备、文件和窗口管理软件,即虚拟机)

    1. OS的发展过程:无操作系统的计算机系统→单道批处理系统→多道批处理系统→分时系统→实时系统→微机操作系统
    2. 操作系统的基本特征:

    (1)     并发性(两个或多个事件在同一时间间隔内发生;进入进程和线程)

    (2)     共享性(系统中资源可供内存中多个并发执行的进程(线程)共同使用,方式为互斥共享方式和同时访问方式

    (3)     虚拟性(通过某种技术把一个物理实体变为若干个逻辑上的对应物。方式:时分复用技术和空分复用技术

    (4)     异步性(进程以不可预知的速度向前推进,多道程序设计固有的特点)

    1. OS的主要功能:

    (1)     处理机管理(进程管理)功能;(主要包括创建和撤销进程、协调诸进程的运行、实现进程间信息交换、把处理机分配给进程。进程同步机制功能是协调多个进程的运行,分为竞争和协作两种方式,实现进程同步常用的及时是信号量机制。调度包括作业调度和进程调度两步。)

    (2)     存储器管理功能;(内存分配、内存保护、地址映射和内存扩充等功能。内存分配有动态和静态两方式。内容扩充的功能是请求调入和置换

    (3)     设备管理功能(缓冲管理、设备分配、设备处理和虚拟设备。缓冲管理包括单、双、公用缓冲机制。设备处理的人物是实现CPU和设备控制器之间的通信)

    (4)     文件管理功能;(文件存储空间管理、目录管理、文件读写管理、共享保护功能)

    (5)     操作系统与用户之间的接口;(用户接口和程序接口)

    第二章 进程管理

    1. 进程与线程的基本概念

    1)         进程是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量。

    2)         线程是为了减少程序在并发执行时所付出的空间开销,是OS具有更好的并发性。

    1. 进程和线程的区别

    1)         调度:线程作为调度和分派的基本单位;进程作为资源拥有的基本单位。

    2)         并发性:进程之间可以并发执行,进程中的诸线程之间也可并发执行。

    3)         拥有资源:进程拥有资源,线程无资源,但可以访问所属进程的资源

    4)         系统开销:创建可撤销进程的代价比创建和撤销线程的代价大的多。

    1. 前趋图是描述进程之间执行的前后关系的。
    2. 进程的特征:

    1)         结构特征;由程序段、相关的数据项和PCB三部分构成了进程实体。

    2)         动态性;指从创建、调度执行到撤销的过程是动态的。

    3)         并发性;

    4)         独立性;因为有PCB,可以独立运行、独立分配资源、独立接受调度等功能

    5)         异步性;各进程按各自独立、不可预知的速度向前推进。

    1. 进程的三种基本状态:

    1)         就绪状态;处CPU外,已占有其他必要的资源的进程

    2)         执行状态;

    3)         阻塞状态;因事故是正在执行的进程停止,并让出CPU。

    1. 信号量机制是一种卓有成效的进程同步工具。包括整形信号量、记录型信号量、AND型信号量、信号量集。

    第三章 处理机调度与死锁

    1. 批量型作业通常需要经历作业调度(高级调度或长程调度)和进程调度(低级调度和短程调度)两个过程后方能获得处理机。
    2. 处理机调度层次

    1)         高级调度:把外存上处于后备队列中的那些作业调入内存。

    2)         低级调度:它决定就绪队列中的哪个进程将获得处理机,然后由分派程序执行把处理机分配给该进程的操作。对象是进程。功能是:保存处理机现场信息(PCB);按某种算法选取进程;把处理器分配给进程。方式分为非抢占方式和抢占方式。

    3)         中级调度:内存中不能有太多的进程,把进程从内存移到外存,当内存有足够空间时,再将合适的进程换入内存,等待进程调度。目的是提高内存利用率和系统吞吐量。

    1. 死锁:多个进程在运行过程中因争夺资源而造成的一种僵局。

    活锁:多个进程在运行工程中因相互谦让而造成的一种僵局。

    1. 产生死锁的原因

    1)         竞争资源

    2)         进程间推进顺序非法

    1. 产生死锁的必要条件

    1)         互斥条件:临界资源的互斥访问

    2)         请求和保持条件:占着自己的资源不放,又去请求别人的

    3)         不剥夺条件:进程没有完成则不是放占有的资源

    4)         环路等待条件:发生死锁指必然存在一个资源环形链。

    1. 处理死锁的基本方法

    1)         预防死锁

    2)         避免死锁

    3)         检测和解除死锁

    1. 安全序列:是指系统能够找到一个进程顺序(P1、P2……Pn),来为每个进程Pi分配所需资源,知道满足每个进程的最大需求,是每个进程能够顺利完成,则P1、P2……Pn即为安全状态。
    2. 用资源分配图对死锁进行检测,消去途中的所有边,若节点为孤立节点,则为可完全简化。
    3. 死锁的解除

    1)         剥夺资源:从其他进程剥夺足够数量的资源给死锁进程,以解除死锁状态

    2)         撤销进程:一种方法是夭折全部进程;另一种方法是按某个顺序逐个撤销进程,知道死锁状态被解除。

    第四章 存储器管理

    1. 连续分配方式:一个用户程序分配一个连续的内存空间

    1)         单一连续分配:一个程序装入其他程序就不允许被装入。只是用于单用户单任务的OS中。

    2)         固定分区分配:把内存分为若干个固定大小的区域,每个分区装入一个作业,允许并发执行。

    3)         动态分区分配:根据实际需要,动态地为之分配内存空间。

    4)         动态重定位分区分配:通过重定位寄存器把相对地址转化成物理地址,此转化过程是在程序执行期间,随着每条指令或数据的访问自动进行的,故称为动态重定位。

    1. 分区分配算法

    1)         首次适应算法(以地址递增次序访问)

    2)         循环首次适应算法(从上一次分配处开始查找)

    3)         最佳适应算法(小内存到大内存依次查找)

    4)         最坏适应算法(每次分配从大内存开始割让)

    5)         快速适应算法(对空闲分区进行分类,并建立索引表,选最适合的控件分配给请求的进程)

    1. 对换:把暂时不运行的程序调到外存,需要时再调到内存。
    2. 地址变换机制:将用户地址空间中的逻辑地址变换为内存空间中的物理地址。
    3. 引入分段存储管理方式的目的,则主要是为了满足用户在编程和使用上多方面的要求。
    4. 段表是用于实现从逻辑段到物理内存区的映射。
    5. 分页和分段的主要区别

    1)         两者都采用离散分配方式,且都要通过地址应设机构来实现地址变换。

    2)         页是信息的物理单位,分页是为了有效的管理内存;段是逻辑单位,分段是为了维护信息完整性和独立性。

    3)         页的大小固定且由系统决定,段的长度不固定,决定于用户编写的程序。

    4)         分页的作业地址空间是一维的,而分段的作业地址空间是二维的。

    1. 段页式存储管理方式的原理:分段和分页相结合,先将用户程序分成若干个段,再把每个段分成若干个页,并为每个段赋予一个段名。其地质结构由段号、段内页号和页内地址组成。
    2. 页面置换算法有:最佳置换算法、先进先出置换算法、最近最久未使用置换算法、Clock置换算法。

    第五章 设备管理

    1. I/O系统是用于实现数据输入、输出及数据存储的系统。
    2. I/O设备类型:

    1)         特性:存储设备;输入/输出设备。

    2)         传输速率:低速设备;中速设备;高速设备。

    3)         信息交换的单位分类:块设备;字符设备。

    4)         共享属性:独占设备;共享设备;虚拟设备。

    1. 设备与控制器之间的接口:

    1)         数据信号线:设备和设备控制器之间传送数据信号

    2)         控制信号线:设备控制器向I/O设备发送控制信号的通路

    3)         状态信号线:传送指示设备当前状态的信号。

    1. 设备控制器

    主要职责是控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换。是CPU和I/O设备的接口,他接受CPU指令去控制I/O设备工作,使减轻处理机的工作量。

    设备控制器包括控制字符设备控制器控制块设备的控制器

    1. 设备控制器的基本功能

    1)         接受和识别命令

    2)         数据交换

    3)         标识和报告设备的状态

    4)         地址识别(CPU通过地质控制设备)

    5)         数据缓冲

    6)         差错控制

    1. I/O通道是一种特殊的处理机,它具有执行I/O指令的能力,可以控制I/O操作。类型分为:字节多路通道、数组选择通道、数组多路通道。
    2. 解决“瓶颈”问题的最有效的方法是增加设备到主机间的通路而不增加通道。
    3. I/O控制方式

    1)         程序I/O方式

    2)         中断驱动I/O控制方式

    3)         直接存储器访问(DMA)I/O控制方式

    4)         I/O通道控制方式

    1. SPOOLing技术

    通过SPOOLing技术便可将一台物理I/O设备虚拟为多台逻辑I/O设备,同样允许多个用户共享一台物理I/O设备。

    1. Spooling系统的组成

    输入井和输入井;输入缓冲区和输出缓冲区;输入进程和输出进程。

    1. SPOOLing系统的特点

    1)         提高了I/O的速度

    2)         将独占设备改造为共享设备

    3)         实现了虚拟设备功能

    1. 磁盘调度

    磁盘调度的主要目标是使磁盘的平均寻道时间最少。

    1. 常用的磁盘调度算法

    1)         先来先服务(适合进程较少的场合)

    2)         最短寻道时间优先(要访问的磁道与当前磁头所在磁道距离最近。会导致进程“饥饿”现象)

    3)         扫描算法(考虑访问的磁道与当前磁头所在磁道距离最近和磁头当前移动的方向)

    4)         循环扫描算法(规定磁头单向移动)

    5)         NSPetpSCAN和FSCAN调度算法

                                                                                                                                                                                                    第六章 文件管理

    1. 文件逻辑结构的类型

    1)  有结构文件(由一个以上的记录构成的文件,又称记录式文件)

    2)  无结构文件(由字符流构成的文件,又称流式文件)

    1. 记录式文件的长度分为定长记录和变长记录。
    2. 记录文件又分为顺序文件、索引文件、索引顺序文件。
    3. 大量的数据结构而后数据库是采用有结构的文件形式

    而大量的源代码、可执行文件、库函数等采用无结构文件。

    1. 顺序文件的优缺点

    1)         适合进行批量存取

    2)         存取效率是所有逻辑文件中最高的

    3)         也只有顺序文件才能存储在磁带上,并能有效的工作

    4)         不适合查找或修改单个记录

    5)         增加或删除一个记录时比较困难

    1. 索引文件的缺点:除了有主文件外,还须配置一张索引表,而且每个记录都要有一个索引表,因此提高了存储费用。
    2. 对已直接文件,检索时可以根据记录键值直接获得指定记录的物理地址。
    3. 哈希文件是键值通过Hash函数指向目录表,该表目的内容指向记录所在的物理块。
    4. 外存分配方式:连续分配、连接分配和索引分配三种。
    5. 连续分配的优缺点

    1)         顺序访问容易

    2)         顺序访问速度快

    缺点:

    1)         要求有连续的存储空间

    2)         必须实现知道文件的长度

    1. 链接分配中的链接方式分为隐式链接显式链接
    2. 为新建文件分配存储空间的方式分为连续和离散的分配方式。前置具有较高的文件访问速度,但可能产生较多的外存零头。后者能有效的利用外存空间,但访问速度较慢。无论哪种方式,存储空间的基本分配单位都是磁盘块而非字节。
    3. 文件存储空间管理的方法

    1)         空闲表法和空闲链表法

    2)         位示图法

    3)         成组链接法

    1. 空闲表法和空闲链表法都不适用于大型文件系统可使用成组链接法。

    常见面试题:

    1、进程是并发过程中程序的执行过程

    2、进程的特征:结构特征动态性并发性独立性异步性

    3、临界区指在每个进程中访问临界资源的那段代码

    4,现在操作系统中申请资源的基本单位是进程,在CPU得到执行的基本单位是线程,进程是由程序段、数据段、PCB组成的

    5,对临界资源应采取互斥访问方式来实现共享

    6,P.V操作是一种低级进程通信原语

    7,对于记录性信号量,在执行一次P操作时,信号量的值应当减1,当其值为小于0时进程应阻塞;在执行V操作时,信号量的值应当加1;当其值小于等于0时,应唤醒阻塞队列中的进程

    8,N个进程共享某一临界资源,(n-1)~1

    9,短作业优先算法,T1<T2<T3平均周转时间为:T1+2XT2/3+T3/3

    10,响应比Rp=(等待时间+要求服务时间)/要求服务器时间=响应时间/要求服务时间

    11死锁是指多个进程在运行过程中因争夺资源,而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,他们都将无法再向前推进。

    死锁的避免是根据防止系统进入不安全状态。

    产生死锁的根本原因是资源分配不当和资源数量不足发生死锁的四个必要条件是:互斥条件,请求和保持条件,不剥夺条件和环路等待条件,银行家算法用于避免死锁

    12,如果系统中有N个进程,最多为(N-1)个

    13,若系统采用轮转法调度进程系统采用的是剥夺式调度

    14,既考虑作业等待时间,又考虑作业执行时间,的调度算法是响应比优先调度算法

    15,资源的有序分配策略可以破坏死锁的“循环等待”

    16,并非所有的不安全状态都必然会转为死锁状态,但当系统进图不安全按状态后变有可能进入死锁状态,

    17,重定位:在作业地址空间中使用的逻辑地址变为内存物理地址

    18,支持程序放在不连续内存中储存管理方法有分取式分配,分段式分配,段页式分配页式存储主要特点是不要将作业同时全部装入到主存的的连续区域

    19,适合多道程序运行的存储管理中,存储保护是为了防止各道作业的相互干扰

    20,采用页式存储管理时,重定位的工作由地址转换机

    21,段页式存储管理中的地址映像表每个作业或进程一张段表,每个段一张页表

    22,在虚拟页式存储管理方案中,完成将页面调入内存的工作的是缺页中断处理

    23,分段管理和分页管理的主要区别是分页管理有存储保护,分段管理没有

    24,在股低估分区分配中,可以不同但预先固定的

    25,不使用中断机构的I/O控制方式是程序I/O方式

    26,spooling技术能独占设备改造成可以共享的虚拟设备  

    27,磁盘防伪中把数据从磁盘读出,叫做传输时间

    28,共享设备指同一时间内运行多个进程同时访问的设备

    29,通过软件的功能扩充,把原来独占的设备爱造成若干个可共享的设备,虚拟设备

    30,DMA方式如果I/O设备不通过CPU来完成

    31,设备独立性用户程序独立于具体物理设备的一种特性

    32,虚拟设备一个物理设备变换成多个对应的逻辑设备

    33,通道是一种特殊的处理机,通道按传递数据的方式分为:字节多路通道,数组选择通道,数组多路通道

    通道涉及的数据结构是设备控制器,控制器控制块,通道控制块,系统设备表

    34,磁盘高速缓冲设在内存中,目的是提高I/O磁盘速度

    35,磁盘空间的地址有盘面号,柱面号,扇区号组成。访问磁盘的时间有 寻道时间,旋转等待时间,读写时间 

    36,将系统段用参数翻译成设备操作命令的工作由设备无关的操作系统完成

    37,向设备寄存器写入控制命令由设备驱动程序完成

    38,寻找设备驱动程序由设备无关的操作系统软件完成

    39,设备管理的功能是设备分配,缓冲区管理和实现物理I/O设备的操作

    40,根据设备的固有属性特点,设备可分为独占设备,共享设备和虚拟设备

    41,引入缓冲区技术提高处理器执行程序设备的输入输出操作的并行程序文件管理

    42,物理文件的组织方式是由操作系统确定的,文件的顺序存取是按文件的逻辑号逐一存取

    43,系统通过树形目录结构来解决重名问题

    44,在UNIX操作系统中,把输入输出设备看做特殊文件

    45,打开文件操作的主要工作是把指定的目录复制到内存指定区域

    46,文件路径名是指从根目录到该文件所经历的路径中各符号名的集合

    47,按逻辑结构划分,文件主要有两类:记录是文件,流式文件,文件系统的主要目的是实现对文件的按名存取

    48连续结构文件必须采用连续分配方式,而链接结构文件和索引结构文件都可采取离散分配方式

    49,文件系统中,若文件的物理结构采用连续结构有关文件的物理位置的信息包括首块地址和文件长度

    50,位示图可用于磁盘空间管理,在文件系统中,为实现文件保护,一般采用口令,密码和访问控制                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

    1、进程具有独立功能程序在某个数据集合上的一次执行过程线程进程内的一个执行实体或执行单元

    进程和线程的区别

    (a)不同进程的地址空间是独立的,而同一进程内的线程共享同一地址空间。一个进程的线程在另一个进程内是不可见的。

    (b) 在引入线程的操作系统中,进程是资源分配和调度的单位,线程是处理机调度和分配的单位,资源是分配给进程的,线程只拥有很少资源,因而切换代价比进程切换低。


    2、死锁多道程序系统中当一组进程中的每个进程均无限期地等待被改组进程中的另一进程所占有且永远不会释放的资源,此时的系统处于死锁状态

    死锁产生的原因:

    (a)系统提供的资源有限;

    (b)进程推进顺序不当。

    产生死锁的必要条件:互斥条件、不可剥夺条件、请求和保持条件、循环等待条件


    3、执行如下访问页号序列: 1,2,3,4,1,2,5,1,2,3,4,5 试说明采用先进(1)FIFO: 9次(2)LRU:10次 (3)OPT:7次   


    4、什么是操作系统的基本功能?

    1.处理机管理。在多道程序或多用户的情况下,要组织多个作业同时运行,就要解决对处理机分配调度策略、分配实施和资源回收等问题。

    2.存储管理。存储管理的主要工作是对内部存储器进行分配、保护和扩充和管理。

    3.设备管理。涉及到通道、控制器、输入输出设备的分配和管理以及设备独立性。

    4.信息管理(文件系统管理) 是对系统的软件资源的管理。

    5.用户接口。操作系统还为用户提供一个友好的用户接口。一般来说,操作系统提供两种方式的接口来为用户服务。


    5、分级调度分为4级:

    (1) 作业调度

    (2) 交换调度

    (3) 进程调度 

    (4) 线程调度。


    6、试写出程序进程区别

    (1)进程是一个动态概念,而程序是一个静态概念。

    (2)进程具有并行特征,而程序不反映执行所以没有并行特征

    (3)进程是竞争计算机系统资源的基本单位,而程序不反映执行也就不会竞争计算机系统资源

    (4)不同的进程可以包含同一程序,只要该程序所对应的数据集不同。 


    7、页式管理的基本原理是什么?

    (1)进程的虚拟空间被划分成长度相等的页。

    (2)内存空间也按页的大小划分成长度相等的页面。

    (3)采用请求调页或预调技术实现内外存储器的统一管理。


    8、进程调度有哪些功能?

    (1)记录系统中所有进程的执行情况。

    (2)选择占有处理机的进程

    (3)进行进程上下文切换


    9、批处理操作系统、分时操作系统和实时操作系统的特点各是什么?

    (1) 批处理操作系统的特点:成批处理,系统吞吐量高,资源利用率高,用户不能直接干预作业的执行。

    (2)分时操作系统的特点:多路性、独立性、及时性、交互性。

    (3)实时操作系统的特点:及时响应、快速处理;高可靠性和安全性;不要求系统资源利用率。

    10Windows下的内存是如何管理的?

      Windows提供了3种方法来进行内存管理:虚拟内存最适合用来管理大型对象或者结构数组;内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据;内存堆栈,最适合用来管理大量的小对象。

      Windows操纵内存可以分两个层面:物理内存和虚拟内存。

      其中物理内存由系统管理,不允许应用程序直接访问,应用程序可见的只有一个2G地址空间,而内存分配是通过堆进行的。对于每个进程都有自己的默认堆,当一个堆创建后,就通过虚拟内存操作保留了相应大小的地址块(不占有实际的内存,系统消耗很小)。当在堆上分配一块内存时,系统在堆的地址表里找到一个空闲块(如果找不到,且堆创建属性是可扩充的,则扩充堆大小),为这个空闲块所包含的所有内存页提交物理对象(在物理内存上或硬盘的交换文件上),这时就可以访问这部分地址。提交时,系统将对所有进程的内存统一调配,如果物理内存不够,系统试图把一部分进程暂时不访问的页放入交换文件,以腾出部分物理内存。释放内存时,只在堆中将所在的页解除提交(相应的物理对象被解除),继续保留地址空间。

      如果要知道某个地址是否被占用/可不可以访问,只要查询此地址的虚拟内存状态即可。如果是提交,则可以访问。如果仅仅保留,或没保留,则产生一个软件异常。此外,有些内存页可以设置各种属性。如果是只读,向内存写也会产生软件异常。


    11、Windows消息调度机制是(C)

      A)指令队列;B)指令堆栈;C)消息队列;D)消息堆栈

    解析:

      处理消息队列的顺序。首先Windows绝对不是按队列先进先出的次序来处理的,而是有一定优先级的。优先级通过消息队列的状态标志来实现的。首先,最高优先级的是别的线程发过来的消息(通过sendmessage);其次,处理登记消息队列消息;再次处理QS_QUIT标志,处理虚拟输入队列,处理wm_paint;最后是wm_timer。


    12、描述实时系统基本特性

      在特定时间内完成特定的任务,实时性与可靠性。

      所谓“实时操作系统”,实际上是指操作系统工作时,其各种资源可以根据需要随时进行动态分配。由于各种资源可以进行动态分配,因此,其处理事务的能力较强、速度较快。


    13、中断轮询特点

      对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。尽管轮询需要时间,但轮询要比I/O设备的速度要快得多,所以一般不会发生不能及时处理的问题。当然,再快的处理机,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询毕竟占据了CPU相当一部分处理时间,因此,程序轮询是一种效率较低的方式,在现代计算机系统中已很少应用。

      程序中断通常简称中断,是指CPU在正常运行程序的过程中,由于预先安排或发生了各种随机的内部或外部事件,使CPU中断正在运行的程序,而转到为响应的服务程序去处理。

      轮询——效率低,等待时间很长,CPU利用率不高。

      中断——容易遗漏一些问题,CPU利用率高。

    14、什么是临界区如何解决冲突

      每个进程中访问临界资源的那段程序称为临界区每次只准许一个进程进入临界区进入后不允许其他进程进入

      (1)如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入;

      (2)任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待;

      (3)进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区;

      (4)如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。


    15、说说分段分页

      页是信息的物理单位分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。

      段是信息的逻辑单位它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。

      页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

      分页的作业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。


    16、说出你所知道的保持进程同步的方法

      进程间同步的主要方法有原子操作、信号量机制、自旋锁、管程、会合、分布式系统等。


    17、Linux中常用到的命令

      显示文件目录命令ls        如ls

      改变当前目录命令cd        如cd /home

      建立子目录mkdir           如mkdir xiong

      删除子目录命令rmdir       如rmdir /mnt/cdrom

      删除文件命令rm            如rm /ucdos.bat

      文件复制命令cp            如cp /ucdos /fox

      获取帮助信息命令man      如man ls

      显示文件的内容less        如less mwm.lx

      重定向与管道type          如type readme>>direct,将文件readme的内容追加到文direct中


    18、Linux文件属性有哪些?(共十位)

      -rw-r--r--那个是权限符号,总共是- --- --- ---这几个位

      第一个短横处是文件类型识别符:-表示普通文件;c表示字符设备(character);b表示块设备(block);d表示目录(directory);l表示链接文件(link);后面第一个三个连续的短横是用户权限位(User),第二个三个连续短横是组权限位(Group),第三个三个连续短横是其他权限位(Other)。每个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。如果每个权限位都有权限存在,那么满权限的情况就是:-rwxrwxrwx;权限为空的情况就是- --- --- ---。

      权限的设定可以用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:

      一个文件aaa具有完全空的权限- --- --- ---。

      chmod u+rw aaa(给用户权限位设置读写权限,其权限表示为:- rw- --- ---)

      chmod g+r aaa(给组设置权限为可读,其权限表示为:- --- r-- ---)

      chmod ugo+rw aaa(给用户,组,其它用户或组设置权限为读写,权限表示为:- rw- rw- rw-)

      如果aaa具有满权限- rwx rwx rwx。

      chmod u-x aaa(去掉用户可执行权限,权限表示为:- rw- rwx rwx)

      如果要给aaa赋予制定权限- rwx r-x r-x,命令为:

      chmod u=rwx,go=rx aaa


    19、简术OSI的物理层Layer1,链路层Layer2,网络层Layer3的任务。

      网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。

      链路层:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。

      物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。


    20、什么是中断中断时CPU做什么工作

      中断指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。


    21、你知道操作系统的内容分为几块吗?什么叫做虚拟内存?他和主存的关系如何?内存管理属于操作系统的内容吗

      操作系统的主要组成部分:进程和线程的管理,存储管理,设备管理,文件管理。虚拟内存是一些系统页文件,存放在磁盘上,每个系统页文件大小为4K,物理内存也被分页,每个页大小也为4K,这样虚拟页文件和物理内存页就可以对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。页文件就是内存页,物理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统所有使用的页文件的总和。


    22、线程是否具有相同的堆栈dll是否有独立的堆栈

      每个线程有自己的堆栈。

      dll是否有独立的堆栈?这个问题不好回答,或者说这个问题本身是否有问题。因为dll中的代码是被某些线程所执行,只有线程拥有堆栈。如果dll中的代码是exe中的线程所调用,那么这个时候是不是说这个dll没有独立的堆栈?如果dll中的代码是由dll自己创建的线程所执行,那么是不是说dll有独立的堆栈?

      以上讲的是堆栈,如果对于堆来说,每个dll有自己的堆,所以如果是从dll中动态分配的内存,最好是从dll中删除;如果你从dll中分配内存,然后在exe中,或者另外一个dll中删除,很有可能导致程序崩溃。


    23、什么是缓冲区溢出?有什么危害?其原因是什么?

      缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

      危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。

      造成缓冲区溢出的主原因是程序中没有仔细检查用户输入的参数

    24、什么是死锁?其条件是什么?怎样避免死锁?

      死锁的概念:在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。

      死锁产生的原因主要是:

           (1)系统资源不足;

           (2) 进程推进顺序非法。

      产生死锁的必要条件:

      (1)互斥(mutualexclusion),一个资源每次只能被一个进程使用;

      (2)不可抢占(nopreemption),进程已获得的资源,在未使用完之前,不能强行剥夺;

      (3)占有并等待(hold andwait),一个进程因请求资源而阻塞时,对已获得的资源保持不放;

      (4)环形等待(circularwait),若干进程之间形成一种首尾相接的循环等待资源关系。

      这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

      死锁的解除与预防:理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

      死锁的处理策略:鸵鸟策略、预防策略、避免策略、检测与恢复策略


    附录:

    1、什么是进程(Process)和线程(Thread)?有何区别?

      进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

      进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。

      2、Windows下的内存是如何管理的?

      Windows提供了3种方法来进行内存管理:虚拟内存,最适合用来管理大型对象或者结构数组;内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据;内存堆栈,最适合用来管理大量的小对象。

      Windows操纵内存可以分两个层面:物理内存和虚拟内存。

      其中物理内存由系统管理,不允许应用程序直接访问,应用程序可见的只有一个2G地址空间,而内存分配是通过堆进行的。对于每个进程都有自己的默认堆,当一个堆创建后,就通过虚拟内存操作保留了相应大小的地址块(不占有实际的内存,系统消耗很小)。当在堆上分配一块内存时,系统在堆的地址表里找到一个空闲块(如果找不到,且堆创建属性是可扩充的,则扩充堆大小),为这个空闲块所包含的所有内存页提交物理对象(在物理内存上或硬盘的交换文件上),这时就可以访问这部分地址。提交时,系统将对所有进程的内存统一调配,如果物理内存不够,系统试图把一部分进程暂时不访问的页放入交换文件,以腾出部分物理内存。释放内存时,只在堆中将所在的页解除提交(相应的物理对象被解除),继续保留地址空间。

      如果要知道某个地址是否被占用/可不可以访问,只要查询此地址的虚拟内存状态即可。如果是提交,则可以访问。如果仅仅保留,或没保留,则产生一个软件异常。此外,有些内存页可以设置各种属性。如果是只读,向内存写也会产生软件异常。

      3、Windows消息调度机制是?

      A)指令队列;B)指令堆栈;C)消息队列;D)消息堆栈

      答案:C

      处理消息队列的顺序。首先Windows绝对不是按队列先进先出的次序来处理的,而是有一定优先级的。优先级通过消息队列的状态标志来实现的。首先,最高优先级的是别的线程发过来的消息(通过sendmessage);其次,处理登记消息队列消息;再次处理QS_QUIT标志,处理虚拟输入队列,处理wm_paint;最后是wm_timer。

      4、描述实时系统的基本特性

      在特定时间内完成特定的任务,实时性与可靠性。

      所谓“实时操作系统”,实际上是指操作系统工作时,其各种资源可以根据需要随时进行动态分配。由于各种资源可以进行动态分配,因此,其处理事务的能力较强、速度较快。

      5、中断和轮询的特点

      对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。尽管轮询需要时间,但轮询要比I/O设备的速度要快得多,所以一般不会发生不能及时处理的问题。当然,再快的处理机,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询毕竟占据了CPU相当一部分处理时间,因此,程序轮询是一种效率较低的方式,在现代计算机系统中已很少应用。

      程序中断通常简称中断,是指CPU在正常运行程序的过程中,由于预先安排或发生了各种随机的内部或外部事件,使CPU中断正在运行的程序,而转到为响应的服务程序去处理。

      轮询——效率低,等待时间很长,CPU利用率不高。

      中断——容易遗漏一些问题,CPU利用率高。

    6、什么是临界区?如何解决冲突?

      每个进程中访问临界资源的那段程序称为临界区,每次只准许一个进程进入临界区,进入后不允许其他进程进入。

      (1)如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入;

      (2)任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待;

      (3)进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区;

      (4)如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。

      7、说说分段和分页

      页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。

      段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。

      页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

      分页的作业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。

      8、说出你所知道的保持进程同步的方法?

      进程间同步的主要方法有原子操作、信号量机制、自旋锁、管程、会合、分布式系统等。

      9、Linux中常用到的命令

      显示文件目录命令ls        如ls

      改变当前目录命令cd        如cd /home

      建立子目录mkdir           如mkdir xiong

      删除子目录命令rmdir       如rmdir /mnt/cdrom

      删除文件命令rm            如rm /ucdos.bat

      文件复制命令cp            如cp /ucdos /fox

      获取帮助信息命令man      如man ls

      显示文件的内容less        如less mwm.lx

      重定向与管道type          如type readme>>direct,将文件readme的内容追加到文direct中

    10、Linux文件属性有哪些?(共十位)

      -rw-r--r--那个是权限符号,总共是- --- --- ---这几个位。

      第一个短横处是文件类型识别符:-表示普通文件;c表示字符设备(character);b表示块设备(block);d表示目录(directory);l表示链接文件(link);后面第一个三个连续的短横是用户权限位(User),第二个三个连续短横是组权限位(Group),第三个三个连续短横是其他权限位(Other)。每个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。如果每个权限位都有权限存在,那么满权限的情况就是:-rwxrwxrwx;权限为空的情况就是- --- --- ---。

      权限的设定可以用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:

      一个文件aaa具有完全空的权限- --- --- ---。

      chmod u+rw aaa(给用户权限位设置读写权限,其权限表示为:- rw- --- ---)

      chmod g+r aaa(给组设置权限为可读,其权限表示为:- --- r-- ---)

      chmod ugo+rw aaa(给用户,组,其它用户或组设置权限为读写,权限表示为:- rw- rw- rw-)

      如果aaa具有满权限- rwx rwx rwx。

      chmod u-x aaa(去掉用户可执行权限,权限表示为:- rw- rwx rwx)

      如果要给aaa赋予制定权限- rwx r-x r-x,命令为:

      chmod u=rwx,go=rx aaa

      11、makefile文件的作用是什么?

      一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”。一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具。一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

      12、简术OSI的物理层Layer1,链路层Layer2,网络层Layer3的任务。

      网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。

      链路层:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。

      物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。

      13、什么是中断?中断时CPU做什么工作?

      中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。

      14、你知道操作系统的内容分为几块吗?什么叫做虚拟内存?他和主存的关系如何?内存管理属于操作系统的内容吗?

      操作系统的主要组成部分:进程和线程的管理,存储管理,设备管理,文件管理。虚拟内存是一些系统页文件,存放在磁盘上,每个系统页文件大小为4K,物理内存也被分页,每个页大小也为4K,这样虚拟页文件和物理内存页就可以对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。页文件就是内存页,物理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统所有使用的页文件的总和。

    15、线程是否具有相同的堆栈?dll是否有独立的堆栈?

      每个线程有自己的堆栈。

      dll是否有独立的堆栈?这个问题不好回答,或者说这个问题本身是否有问题。因为dll中的代码是被某些线程所执行,只有线程拥有堆栈。如果dll中的代码是exe中的线程所调用,那么这个时候是不是说这个dll没有独立的堆栈?如果dll中的代码是由dll自己创建的线程所执行,那么是不是说dll有独立的堆栈?

      以上讲的是堆栈,如果对于堆来说,每个dll有自己的堆,所以如果是从dll中动态分配的内存,最好是从dll中删除;如果你从dll中分配内存,然后在exe中,或者另外一个dll中删除,很有可能导致程序崩溃。

      16、什么是缓冲区溢出?有什么危害?其原因是什么?

      缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

      危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。

      造成缓冲区溢出的主原因是程序中没有仔细检查用户输入的参数。

      17、什么是死锁?其条件是什么?怎样避免死锁?

      死锁的概念:在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。

      死锁产生的原因主要是:? 系统资源不足;? 进程推进顺序非法。

      产生死锁的必要条件:

      (1)互斥(mutualexclusion),一个资源每次只能被一个进程使用;

      (2)不可抢占(nopreemption),进程已获得的资源,在未使用完之前,不能强行剥夺;

      (3)占有并等待(hold andwait),一个进程因请求资源而阻塞时,对已获得的资源保持不放;

      (4)环形等待(circularwait),若干进程之间形成一种首尾相接的循环等待资源关系。

      这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

      死锁的解除与预防:理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

      死锁的处理策略:鸵鸟策略、预防策略、避免策略、检测与恢复策略。

     1、程序和进程

      进程由两个部分组成:1)操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。2)地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。

     

    定义

    使用系统运行资源情况

    程序

    计算机指令的集合,它以文件的形式存储在磁盘上。程序是静态实体passive Entity),在多道程序系统中,它是不能独立运行的,更不能与其他程序并发执行。

    不使用【程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源】。

     

    进程

    通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。

    定义:进程是进程实体(包括:程序段、相关的数据段、进程控制块PCB)的运行过程,是系统进行资源分配和调度的一个独立单位。

    使用【进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源。】

      2、进程与线程

      如果说操作系统引入进程的目的是为了提高程序并发执行,以提高资源利用率和系统吞吐量。那么操作系统中引入线程的目的,则是为了减少进程并发执行过程中所付出的时空开销,使操作系统能很好的并发执行。

      进程process定义了一个执行环境,包括它自己私有的地址空间、一个句柄表,以及一个安全环境;线程则是一个控制流,有他自己的调用栈call stack,记录了它的执行历史。

      线程由两个部分组成:1)线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。2)线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。

      进程与线程的比较如下:

    比较

    进程

    线程

    活泼性

    不活泼(只是线程的容器)

    活泼

    地址空间

    系统赋予的独立的虚拟地址空间(对于32位进程来说,这个地址空间是4GB

    在进程的地址空间执行代码。线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。因为线程需要的开销比进程少

    调度

    仅是资源分配的基本单位

    独立调度、分派的基本单位

    并发性

    仅进程间并发(传统OS

    进程间、线程间并发

    拥有资源

    资源拥有的基本单位

    基本上不拥有资源

    系统开销

    创建、撤销、切换开销大

    仅保存少量寄存器内容,开销小。

      3、进程同步

      进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

      同步机制遵循的原则:

      (1)空闲让进;

      (2)忙则等待(保证对临界区的互斥访问);

      (3)有限等待(有限代表有限的时间,避免死等);

      (4)让权等待,(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)。

    4、进程间的通信是如何实现的?

      进程通信,是指进程之间的信息交换(信息量少则一个状态或数值,多者则是成千上万个字节)。因此,对于用信号量进行的进程间的互斥和同步,由于其所交换的信息量少而被归结为低级通信。

      所谓高级进程通信指:用户可以利用操作系统所提供的一组通信命令传送大量数据的一种通信方式。操作系统隐藏了进程通信的实现细节。或者说,通信过程对用户是透明的。

      高级通信机制可归结为三大类:

      (1)共享存储器系统(存储器中划分的共享存储区);实际操作中对应的是“剪贴板”(剪贴板实际上是系统维护管理的一块内存区域)的通信方式,比如举例如下:word进程按下ctrl+c,在ppt进程按下ctrl+v,即完成了word进程和ppt进程之间的通信,复制时将数据放入到剪贴板,粘贴时从剪贴板中取出数据,然后显示在ppt窗口上。

      (2)消息传递系统(进程间的数据交换以消息(message)为单位,当今最流行的微内核操作系统中,微内核与服务器之间的通信,无一例外地都采用了消息传递机制。应用举例:邮槽(MailSlot)是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据。

      (3)管道通信系统(管道即:连接读写进程以实现他们之间通信的共享文件(pipe文件,类似先进先出的队列,由一个进程写,另一进程读))。实际操作中,管道分为:匿名管道、命名管道。匿名管道是一个未命名的、单向管道,通过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信。命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信。

     

    同一机器两个进程间通信

    跨网络通信

    剪贴板Clipboard

    可以

    不可以

    匿名管道Pipe

    可以

    不可以

    命名管道(点对点单一通信,数据量可较大)Namedpipe

    可以

    可以

    邮槽(一对多,数据量较小,424字节以下)Mailslot

    可以

    可以

      5、线程同步

      根据用户模式及内核模式下的同步方式的不同,分类及对比如下:

     

    内核对象/

    非内核对象

    含义

    缺点

    适用

    关键代码段(临界区)CriticalSection

    非内核对象,工作在用户方式下,为用户模式对象

    从程序代码的角度来控制线程的并发性

    1.因为在等待进入关键代码段时无法设定超时值,所以其很容易进入死锁状态。2.不能跨进程使用。

    单个进程中线程间的同步(同步速度快)

    事件对象Event

    内核对象

    所有内核对象中最基本的。

    速度较慢(相比用户模式实现线程同步)

    多个进程间的各个线程间实现同步

    互斥对象Mutex

    内核对象

    代表对一个资源的独占式访问

    信号量

    Semaphore

    内核对象

    使用计数器来控制程序对一个共享资源的访问

      由于进程同步产生了一系列经典的同步问题“生产者-消费者”问题,“哲学家进餐”问题,“读者-写者”问题。


    常见的操作系统使用的文件系统整理

    文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

      【FAT】:

      常PC机使用的文件系统是FAT16。像基于MS-DOS,Win 95等系统都采用了FAT16文件系统。在Win 9X下,FAT16支持的分区最大为2GB。我们知道计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16的情况下,分区越大簇就相应的要大,存储效率就越低,势必造成存储空间的浪费。并且随着计算机硬件和应用的不断提高,FAT16文件系统已不能很好地适应系统的要求。在这种情况下,推出了增强的文件系统FAT32。同FAT16相比,FAT32主要具有以下特点:

      1、同FAT16相比FAT32最大的优点是可以支持的磁盘大小达到32G,但是不能支持小于512MB的分区。

      *基于FAT32的Win 2000可以支持分区最大为32GB;而基于 FAT16的Win 2000支持的分区最大为4GB。

      2、由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另一个分区采用了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高很多,通常情况下可以提高15%。

      3、FAT32文件系统可以重新定位根目录和使用FAT的备份副本。另外FAT32分区的启动记录被包含在一个含有关键数据的结构中,减少了计算机系统崩溃的可能性。

      【NTFS】:

      NTFS文件系统是一个基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。使用非常广泛的Windows NT 4.0采用的就是NTFS 4.0文件系统,相信它所带来的强大的系统安全性一定给广大用户留下了深刻的印象。Win 2000采用了更新版本的NTFS文件系统??NTFS 5.0,它的推出使得用户不但可以像Win 9X那样方便快捷地操作和管理计算机,同时也可享受到NTFS所带来的系统安全性。

      NTFS 5.0的特点主要体现在以下几个方面:

      1、NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB。而Win 2000中的FAT32支持分区的大小最大为32GB。

      2、NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS通过使用标准的事物处理日志和恢复技术来保证分区的一致性。发生系统失败事件时,NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。

      3、NTFS支持对分区、文件夹和文件的压缩。任何基于Windows的应用程序对NTFS分区上的压缩文件进行读写时不需要事先由其他程序进行解压缩,当对文件进行读取时,文件将自动进行解压缩;文件关闭或保存时会自动对文件进行压缩。

      4、NTFS采用了更小的簇,可以更有效率地管理磁盘空间。在Win 2000的FAT32文件系统的情况下,分区大小在2GB~8GB时簇的大小为4KB;分区大小在8GB~16GB时簇的大小为8KB;分区大小在16GB~32GB时,簇的大小则达到了16KB。而Win 2000的NTFS文件系统,当分区的大小在2GB以下时,簇的大小都比相应的FAT32簇小;当分区的大小在2GB以上时(2GB~2TB),簇的大小都为4KB。相比之下,NTFS可以比FAT32更有效地管理磁盘空间,最大限度地避免了磁盘空间的浪费。

      5、在NTFS分区上,可以为共享资源、文件夹以及文件设置访问许可权限。许可的设置包括两方面的内容:一是允许哪些组或用户对文件夹、文件和共享资源进行访问;二是获得访问许可的组或用户可以进行什么级别的访问。访问许可权限的设置不但适用于本地计算机的用户,同样也应用于通过网络的共享文件夹对文件进行访问的网络用户。与FAT32文件系统下对文件夹或文件进行访问相比,安全性要高得多。另外,在采用NTFS格式的Win 2000中,应用审核策略可以对文件夹、文件以及活动目录对象进行审核,审核结果记录在安全日志中,通过安全日志就可以查看哪些组或用户对文件夹、文件或活动目录对象进行了什么级别的操作,从而发现系统可能面临的非法访问,通过采取相应的措施,将这种安全隐患减到最低。这些在FAT32文件系统下,是不能实现的。

      6、在Win 2000的NTFS文件系统下可以进行磁盘配额管理。磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。设置磁盘配额后,可以对每一个用户的磁盘使用情况进行跟踪和控制,通过监测可以标识出超过配额报警阈值和配额限制的用户,从而采取相应的措施。磁盘配额管理功能的提供,使得管理员可以方便合理地为用户分配存储资源,避免由于磁盘空间使用的失控可能造成的系统崩溃,提高了系统的安全性。

      7、NTFS使用一个“变更”日志来跟踪记录文件所发生的变更。

    【Ext2】:

      Ext2是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。

      其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 电脑系统中,簇最大为 4KB,则单一文件大小上限为 2048GB,而文件系统的容量上限为 16384GB。

      但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,实际上能使用的文件系统容量最多也只有 2048GB。

      至于Ext3文件系统,它属于一种日志文件系统,是对ext2系统的扩展。它兼容ext2,并且从ext2转换成ext3并不复杂。

      【Ext3】:

      Ext3是一种日志式文件系统,是对ext2系统的扩展,它兼容ext2。日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部shutdown后才能进行关机。

      如果在文件系统尚未shutdown前就关机 (如停电) 时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,此一重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。

      为了克服此问题,使用所谓‘日志式文件系统 (Journal File System) ’。此类文件系统最大的特色是,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。

      由于资料的写入动作包含许多的细节,像是改变文件标头资料、搜寻磁盘可写入空间、一个个写入资料区段等等,每一个细节进行到一半若被中断,就会造成文件系统的不一致,因而需要重整。

      然而,在日志式文件系统中,由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。

      【Ext4】:

      Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:

      1、与 Ext3 兼容。执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。

      2、更大的文件系统和更大的文件。较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。

      3、无限数量的子目录。Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。

      4、Extents。Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。

      5、多块分配。当写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。

      6、延迟分配。Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。

      7、快速 fsck。以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。

      8、日志校验。日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。

    9、“无日志”(No Journaling)模式。日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。

      10、在线碎片整理。尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。

      11、inode 相关特性。Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。

      12、持久预分配(Persistent preallocation)。P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。

      13、默认启用 barrier。磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 “mount -o barrier=0” 命令禁用该特性。)

      【ZFS】:

      ZFS源自于Sun Microsystems为Solaris操作系统开发的文件系统。ZFS是一个具有高存储容量、文件系统与卷管理概念整合、崭新的磁盘逻辑结构的轻量级文件系统,同时也是一个便捷的存储池管理系统。ZFS是一个使用CDDL协议条款授权的开源项目。

      【HFS】:

      1、HFS文件系统概念

      分层文件系统(Hierarchical File System,HFS)是一种由苹果电脑开发,并使用在Mac OS上的文件系统。最初被设计用于软盘和硬盘,同时也可以在在只读媒体如CD-ROM上见到。

      2、HFS文件系统开发过程

      HFS首次出现在1985年9月17日,作为Macintosh电脑上新的文件系统。它取代只用于早期Mac型号所使用的平面文件系统Macintosh File System(MFS)。因为Macintosh电脑所产生的数据,比其它通常的文件系统,如DOS使用的FAT或原始Unix文件系统所允许存储的数据更多。苹果电脑开发了一种新式更适用的文件系统,而不是采用现有的规格。例如,HFS允许文件名最多有31个字符的长度,支持metadata和双分支(每个文件的数据和资源支分开存储)文件。

      尽管HFS象其它大多数文件系统一样被视为专有的格式,因为只有它为大多数最新的操作系统提供了很好的通用解决方法以存取HFS格式磁盘。

      在1998年,苹果电脑发布了HFS Plus,其改善了HFS对磁盘空间的地址定位效率低下,并加入了其它的改进。当前版本的Mac OS仍旧支持HFS,但从Mac OS X开始HFS卷不能作为启动用。

      3、构成方式

      分层文件系统把一个卷分为许多512字节的“逻辑块”。这些逻辑块被编组为“分配块”,这些分配块可以根据卷的尺寸包含一个或多个逻辑块。HFS对地址分配块使用16位数值,分配块的最高限制数量是65536。

      组成一个HFS卷需要下面的五个结构:

      1)卷的逻辑块0和1是启动块,它包含了系统启动信息。例如,启动时载入的系统名称和壳(通常是Finder)文件。

      2)逻辑块2包含主目录块(Master Directory Block,简称MDB)。

      3)逻辑块3是卷位图(Volume Bitmap)的启动块,它追踪分配块使用状态。

      4)总目录文件(Catalog File)是一个包含所有文件的记录和储存在卷中目录的B*-tree。

      5)扩展溢出文件(Extent Overflow File)是当最初总目录文件中三个扩展占用后,另外一个包含额外扩展记录的分配块对应信息的B*-tree。

    内核怎样管理你的内存

    在分析了进程的虚拟地址布局,我们转向内核以及他管理用户内存的机制。下图是gonzo的例子:

      Linux进程在内核中是由task_struct进程描述符实现的,task_struct的mm字段指向内存描述符mm_struct,他是进程的一个内存执行摘要。如上图所示,mm_struct存储了内存各个段的开始和结束地址、进程所使用的内存页面数(rss代表常驻集合大小)、使用的虚拟地址空间总数等等。在内存描述符中我们也可以找到两个用于管理进程内层的字段:虚拟内存集合和页表。Gonzo的内存区域如下图:

      每个虚拟内存区域(VMA)是一个虚拟地址空间上连续的区域;这些区域不会彼此覆盖。Vm_area_struct结构描述了一个内存区域,包括他的开始和技术地址、flags字段指定了他的行为和访问权限,vm_file字段指定了该区域映射的实际文件。一个没有映射文件的VMA成为匿名的。除了内存映射段以外,上面的每个内存段(堆、栈等等)相当于一个单独的VMA。这不是必须的,尽管在x86机器上通常是这样。VMA不会关心他在哪个段里面。

      一个进程的所有VMA以两种方式存储在他的内存描述符中,一种是以链表的方式存放在mmap字段,以开始虚拟地址进行了排序,另一种是以红黑树的方式存放,mm_rb字段为这颗红黑树的根。红黑树可以让内核根据给定的虚拟地址快速地找到内存区域。当我们读取文件/proc/pid_of_process/maps,内核仅仅是通过进程VMA的链接同时打印出每一个。

    计算机组成

     

    计算机的运行简单理解为这三层:硬件即组成计算机的所有摸得见看得着的东西是计算机运行的基础;应用程序即完成特定功能、目的的用户程序是计算机的价值体现;中间就是操作系统,连接了硬件和应用程序负责硬件调度、资源管理和分配(内存、文件、CPU等等)、安全等一系列功能。

    硬件层

     

    主要硬件包括CPU(算术、逻辑单元)、主存、辅助存储、系统总线、I/O设备(即输入输出)。

    CPU

    CPU本身(Processor)可以是单核、多核、多CPU架构,主要目的就是满足日益增长的运算需求。单核比较简单,多核(包括一CPU多核心和多CPU)立即涉及到核心之间高速缓存的共享,此处是CPU内置高速缓存非主存,进程之间寄存器数据的共享和进程处理器调度问题。

    总线:

    总线连接了所有的设备提供通讯的能力,注意设备之间同一时间的通信是会冲突的,这就要涉及到总线的决策,负责决策的可能是CPU或专有芯片。所有设备需要通信时要提交通信请求有CPU决定下一个通信的设备。

    另外一个问题显然连接到总线上的设备越多,冲突的几率就越大效率越差。所以总线可以有多层总线设计,比如设置I/O总线所有的I/O设备都通过I/O总线和I/O控制器连接,I/O控制器则连接在系统总线上代理I/O的通信请求。

    速度:

    CPU飞快,其中CPU内置的一级高速缓存保持了和CPU同样的速度但是容量极小,接下来可能存在二级、三级高速缓存;主存(内存)其次和CPU存在数量级上的差距;辅寸(多硬盘)的速度就不是一般的慢了,因为有机械运动,但是容量大很多;I/O设备多数慢的要死,但不是没有快的(比如图形、千兆以太网的速度是超过硬盘的)。总而言之就是快的太贵,贱的太慢,访问快的断电数据即失效,不失效的访问慢,所以就有了多级存储的设计。程序的运行必然是加载到主存的(内存)!

    局部性:

    多级存储的设计得益于局限性能够大幅提升性能。局限性本身分为时间局限性和空间局限性。时间局限性是说现在用到的指令很可能短时间内还会多次调用,空间局限性是现在调用的数据在辅寸上邻接的块很可能即将被用到。就是因为局限性的存在预读取才有了市场(所以有了磁盘整理),当然局限性是必然的——程序肯定趋向于统一存取、循环、分支逻辑肯定是指令的循环调用。——好的命中率决定了计算机的性能。

    指令周期(取指周期):

    计算机中CPU始终是取指-》执行的动作循环运行的,计算机从取指到完成指令的周期称为取指周期。因此针对CPU的性能优化有流水线和超标量体系结构,前者目的在于合理分割指令使取指和执行能够并行进行(预取指),后者则通过相同的运算结构重复设置实现多条指令同时执行(得益于指令的乱序执行)。

    I/O设备进化:

    I/O设备一般较慢,极端点的比如键盘这货简直慢的没法说。那么当程序需要读取I/O数据时(如读取一块数据、监听键盘输入)就会被I/O设备阻塞,这是最差的情况整个系统空转直到I/O设备读取数据完成。

    于是有了可编程I/O设备——你可以定期问我准备好数据了没,好了你就取没好你就干别的去,也就是轮询这法子还是非常慢因为CPU要定期过来问而且多数情况都是没准备好空耗系统资源(进程切换)。

    再后来有了中断,前提是指令的运行是可被中断和恢复的(现在当然都可以,把寄存器数据保存到缓存,完了再恢复嘛),需要读取的时候CPU发给I/O指令然后不理它了,需要读取的进程(或线程)进入阻塞状态换下一个进程来执行,当I/O准备好数据后发送一个中断信号给CPU,这时现在执行的进程被中断CPU会执行一段中断处理程序(通常很短)把之前阻塞的进程标记为Ready(可执行)状态,处理完中断后恢复之前中断的进程(或线程)继续执行。在当前进程执行完或者超时中断后(分时多道程序处理,超时也是一种中断),之前从阻塞中恢复的进程可能会被执行(取决于进程调度,不一定是下一个时间片里也可能是下几个时间片后或者干脆饿死了)。

    再后来又有了DMA(直接存储器访问),主要原因就是CPU很忙,你一个拷贝/传输整块数据的动作就不要每块数据都让我来处理了,系统中多了一个专门的辅助芯片干这个事情。CPU下达指令后辅助芯片负责设备之间的数据直接传输。DMA模块可以是总线中的一个模块也可以是I/O模块,但是仍然要占用总线(传输数据)所以并不是不会对系统性能产生影响,至少DMA冲突时CPU要等待一个总线周期。

    操作系统

    看完硬件层(简单看看,后面可能还要回头),再来看看操作系统层。最基本的元素肯定要包括进程、线程等等用于程序的执行。

    操作系统

    操作系统目的:

    方便:简化了计算机的使用,无论是用户还是开发者角度都极大的简化了对计算机的使用。用户角度提供了交互的能力,开发者角度提供了底层设备的接口、公共库等等。

    有效:提高计算机的利用效率。对于操作系统CPU运算、内存、辅存、I/O等等都是资源,如何能最大的利用资源是计算机要考虑的事情。(没有操作系统的年代显然效率非常低,同一时间只运行一个程序计算资源多数时间都在等待I/O设备、人等)。

    扩展的能力:在不阻碍服务前提下开发、测试、加入新的计算机能力。比如安装个程序、加个设备。

    操作系统发展

    串行处理:这是个久远的年代(上世纪50年代也不算太远哈),计算机一次只能运行一个程序,要通过输入设备读入程序(读卡器吧)运行结束后再将结果输出到打印机。这个年代是没有操作系统的。

    简单批处理:这个算是操作系统的鼻祖吧?就是常驻内存的一个监控程序,要运行的程序被管理员组织成一批,监控程序从存储器(卡片或磁带)读取要执行的Job将处理器控制权转交给程序运行结束后(成功或失败)控制权返回监控程序继续读入下一个任务。

    简单批处理节约了计算机调度和准备的时间——任务不再是一个一个的处理了,变成一批了。

    多道程序批处理:现代操作系统进程切换之父?哈哈。由于内存的加大除了容纳操作系统、一个程序以外还有足够的空间容纳第二、第三个程序,所以就有了同时运行多个程序的能力。在第一个程序被阻塞后(I/O等),可以转交控制权个第二、第三个程序。

    多道程序批处理节约了CPU等待I/O等慢速设备的时间,这个效率的提升非常客观。

    分时操作系统:注意关注在人的交互上。人肯定是比I/O还慢的设备了,由于早年计算机资源的稀缺当然要达到多人共用一台机器的目的。分时操作系统把计算机资源做时间切片,用户通过终端连接到计算机,每个中断都获取到时间切片内的计算资源,由于人是反应很钝的,所以就像没人都有一台计算机服务一样。

    操作系统的几张表

    Memory table:记录内存的使用情况,回收和分配内存时这里都会被更新。

    I/O table:记录I/O设备和通道的情况。

    File table:文件系统的占用情况,文件是否存在,文件状态。

    Process table:管理进程。

    进程和线程

    进程

    进程包括程序代码和一组(set)数据,是程序运行的实体(应该能算作最小单元吧,线程能执行的是一段逻辑,一个程序的启动至少是一个或多个进程)。

    进程的组成:

    进程所有属性的集合被称为进程映像(Process Image),这之中一共包括四部分:用户程序(User Program)、数据(User Data)、栈(Stack)和进程控制块(Process Control Block)。

    用户程序:要执行的程序。

    数据:用户空间中可以被用户修改的部分。比如进程数据、可修改程序。

    Stack:每个进程都有一个或者多个栈用于保存参数、过程调用地址、系统调用地址。

    进程控制块:操作系统控制进程需要的数据。包含了进程的属性,最基本的每个进程总要有个Id吧,还有进程状态、当前寄存器的值、程序计数器、Stack的指针等等。

    进程状态切换

    最起码的两个状态:ReadyRunning,进程自创建后进入Ready状态也就是可以执行的,这时的进程进入等待队列知道进程调度轮到自己执行时才能够被分配资源进入执行状体Running

    进程的基本状态一共五个,包括上面两个以外还会有被阻塞的情况(I/O、等待生产者生产、信号量等等)所以存在Blocked状态,进程创建过程中存在New状态、进程运行终结后处于Exit状态等待操作系统做进一步处理并销毁进程。

    进程状态之间的切换可以参考图中进程状态部分,大体过程:进程被允许创建进入New状态,这个过程中要分配进程Id、划分内存区域、初始化PCBProcess control block)、连接和创建或扩展其它的数据;上述过程完成以后进程可以运行了所以进入Ready状态等待系统调度;终于等到自己运行了,进程为Running状态这时候可能出现几种情况。1,进程运行结束进入Exit状态等待销毁。2,进程运行超时重新进入Ready状态等待下一次调度。3,进程被阻塞了进入Block状态等待所需要的数据或信号准备好,重新唤醒进入Ready状态。除此以外还有两个挂起状态,见下面的切换。

    调度的示意图参考进程调度示意子图,其中一个改进是操作系统很可能为不同的中断事件设立不同的阻塞队列,以便提高效率。

    进程切换(Swapping):

    说白了还是CPU计算资源宝贵和内存有限(内存在涨吃内存的程序也在涨)。为了能让更多的进程可以同时执行(实际上不是同时是调度),程序运行中有很大一部分会被I/O阻塞——原因是I/O太慢了,所以即便你要的数据不多那这个取数的过程CPU也够跑很多其它程序的了。所以导致的问题就是在内存中的进程都阻塞了,内存没地方了,CPU依然闲的蛋疼,怎么办?把硬盘上画出一块地儿(个人理解就是windows下的虚拟内存、Linux中的swap),塞得比较久的那些进程你们先出去待会,换些后面排着的进来。

    看到进程切换的子图中除了五个状态以外还有两个挂起态(就绪/挂起、阻塞/挂起)就是这个情况。虽然把进程从硬盘换入换出这个开销非常高,但是硬盘比起I/O设备还是快了很多,所以这一步是有价值的。

    当然还有一个路子是虚拟内存的时候,这个稍晚的时候再扯进来。

    进程执行模式:

    用户模式和内核模式,这两个模式还有多个别名不记录了。这是出于操作系统安全考虑的,有些重要的指令就只有内核模式下才能被CPU执行(硬件支持),总不能任意来个程序什么事情都给他干吧。

    有了执行模式就算有模式的切换,比如进程要调用系统操作时(system call)就有可能从用户模式切换到内核模式,system call执行后也会在切换回去。

     

    多线程定义

    多线程是指进程内支持并发路径执行的能力。

    与进程的关系

    一个进程至少包含一个线程,当进程中存在多个线程的时各个线程可以共享进程内的资源。进程内的线程共享进程的用户空间,操作系统仍然通过进程控制块控制进程进而影响到线程。线程本事具备自己的线程控制块、用户栈和系统栈。

    创建方式

    由于线程类型的不同(下面介绍)线程可以是操作系统创建的也可以使通过线程库(Lib)由进程自己创建的,对于进程创建的线程操作系统是不知道的。

    线程优势

    l 创建时间开销远小于进程的创建。因为不需要分配用户空间和那么多初始化动作。

    l 销毁线程的成本也远低于进程。

    l 线程之间的切换消耗低于进程,特别是同一进程内的线程切换消耗更低。

    l 线程间通信的效率比进程间通信要高,因为进城之间安全性问题需要隔离和互斥,同一进程内的线程可以共享进程资源而不需要提前获取锁。

    线程同步

    进程也涉及到同步,但是线程的同步更需要开发者注意。上面提到了线程共享进程的资源并且不需要获取锁,所以线程之间是没有操作系统来保证隔离的。

    线程类型

    类型分为用户级线程和内核级线程。用户级线程即通过Lib创建的对操作系统是透明的,内核级线程是由操作系统创建的。

    用户级

    内核级

    通过线程库创建,对操作系统不可见

    由操作系统来管理

    比内核级的线程更高效,不涉及模式切换

    在线程切换时需要模式切换(因为是调用系统级的指令)

    进程中同时只能有一个线程在运行,还是多段程序的思路

    线程可以并发运行,特别指多核计算机

    一旦被阻塞整个进程就被阻塞,也就是所有的线程都完蛋了

    只会阻塞引起阻塞的线程

     

    线程的四个应用场景

    l 前后台运算:即有UI和后台运算的程序,你总不希望后台数据运算时前面的UI界面就对用户没响应了吧?所以这里应该分开线程,后台启动单独的线程运算,界面在不同的线程了所有能时时相应用户的操作(哪怕只是提示计算中)。

    l 异步计算:比如应对电路故障的实时备份功能,通过线程无论是在代码量上还是开销上都要比你编写定时调度的功能要高效。

    l 速度敏感的运算:多线程的计算机可以在计算一组数据的同时读入下一组数据(当然弄几个进程干这事儿也可以,但是开销明显更大)。

    l 模块化的程序架构:对于包含多个活动或者多个源头和目标的输入输出程序,也许更容易使用多线程来设计和实现(就是每个线程干一摊子事儿,大家数据在一起自己取谁也别干涉谁)。

    l 另外的比如Java程序,每个程序就是一个JVM的进程,至于这里面你起多少线程操作系统是不关心的。

     

    并发性

    竞争条件

    竞争条件发生在多进程或者多线程同时修改同一个数据项的情况下,这时数据的最终结果依赖于各个进程(线程)执行的顺序(也就是结果不是唯一确定的了,比如同时修改变量bP1执行b = 1, P2执行b = 2结果有竞争失败者决定)。

    临界区

    类似于b的这种资源称为临界资源(critical resource),程序中操作临界资源的程序段称为临界区(critical section)。就是说事儿肯定是出在临界区里的。

    互斥(multual exclusion

    多个进程尝试进入同一个不可共享的资源的时候进程间需要是互斥的。这个不可共享的资源就是上面说的临界资源,进入的程序段即临界区。

    互斥的要求:

    l 互斥是系统强制的。

    l 在临界区外挂起的进程不能够干涉其他进程。

    l 请求临界资源的进程不能被无限期的延迟,即不能有死锁。

    l 当没有进程处于临界区时,对临界资源的请求必须立即分配。

    l 互斥不能建立在任何关于进程相对速度或执行顺序的假设上。

    l 一个进程在临界区的时间应该是有限的。

     

    进程交互

    进程交互分三种情况:

    l 进程间互不相认:比如多道程序设计,这些进程间存在共享资源但是彼此不知道,操作系统需要保证进程间的安全。

    l 进程间简介知道彼此:进程不知道彼此的ID,但是知道存在共享资源,进程间表现为合作。

    l 进程间直接知道彼此:进程知道彼此的ID,存在共享资源,进程间表现为合作。

     

    并发性的硬件支持

    Interrupt disable

    进程声明自己的某一段程序是不可被中断的,这招只在单个处理器的情况下有用,因为多个处理器则存在进程并行运行。

    Compare & swap instruction

    CPU提供的原子指令,用测试值(test value)检查内存单元(*word),如果相等就用给定的值设置内存单元(newvalue),最终返回替换前的内存单元值。

    使用:内存单元的初始值是0,多个进程执行用0去测试并替换为1的指令,只有获取到0的返回值的进程获得了进入临界区的资格,在离开临界区前进程要重置内存单元值为0

    Exchange Instruction

    CPU提供的原子指令,用内存区域的值和一个寄存器的值交换。也就是只有换到寄存器初始值(换完以后检查内存区域的值)的那个进程可以进入临界区并在离开时重置寄存器。

    硬件支持存在的弊端:

    1,采用的是忙等待(busy waiting)的方式,CPU一直在进程间切换,效率低。

    2,可能发生饥饿:总有一个二活人品差,抢不到而又没有任何办法干预。

    3,可能存在死锁:P1获得了临界资源但是同时P1P2中断了(P2优先级高),P2却无法获得被P1占有的临界资源,P1同时得不到CPU的计算周期。

    并发性的软件支持

    信号量(semaphore

    用于进程间传递信号的一个整数值。提供了三种操作初始化、信号加和信号减。只有01的信号量称为二元信号量。减操作semwait用于阻塞一个进程(当信号量为0的时候阻塞),加操作semsignal用于激活被阻塞的进程。、

    生产者与消费者

    生产者负责生产资源并加入到指定的缓存中,加入过程如果缓存已满要阻塞生产者;消费者负责消费资源,如果缓存已空要避免消费者消费不存在的资源。

    const int bufferSize = n1;

    semaphore s = 1, n = 0, e = bufferSize;

    producer

    {

    while(true)

    {

    produce();

    semwait(e);

    semwait(s);//s信号量用于控制每次只有一个进入critical section

    append();

    semsignal(s);

    semsignal(n);

    }

    }

    consumer

    {

    while(true)

    {

    semwait(n);

    semwait(s);

    taken();

    semsignal(s);

    semsignal(e);

    consume();

    }

    }

    监听者(管程)

    信号量的麻烦在于分布在程序的各个地方,一处错误就可能导致并发同步的错误。监听者提供了更完善的机制用于并发同步。参考监听者子图。

    监听者包括局部数据、条件变量和若干过程和等待队列等,局部变量是被监听者机制保存的处于外部进程不能访问或影响局部变量。

    进程可以通过调用监听者的某一过程来进入监听者,但是同一时间只有一个进程处于监听者中(其它的在外面排队,也就是进入队列)。

    监听者包含若干个条件变量,可以视条件变量为指向某一等待队列的指针。

    监听者提供了cwaitcsignal方法,调用cwait(c)将在条件变量c上阻塞当前进程并使监听者可用,当前进程加入到条件变量c的等待队列,调用csignal(c)将激活条件变量c的等待队列上的进程并重新尝试获得监听者(一般是激活一个,也有可能是signalAll<对于条件变量不明确的情况激活所有的进程,使正确的进程运行其它的进程则因为未获得条件变量再次阻塞>)。

    除此监听者还提供了紧急队列(也可能没有),对于进入到过程中的但最后没有调用csignal的进程(它可能是在过程中阻塞了或者怎么完蛋了)有两种处理方式:1,踢出去重新回到进入队列和大家竞争。2,考虑到这个进程已经执行了过程的部分逻辑有必要把它加入到紧急队列中,监听者会在空闲后重新激活紧急队列中的进程。

    注意与信号量不同的是,在调用csignal(c)的时候如果条件变量c的等待队列上没有任何进程,那这个动作将不产生任何效果也不会累计下去。

    生产者/消费者问题中Monitor的实现:

    monitor

    {

    int size, nextin, nextout

    appand(node)

    {

    if(nextin == size) cwait(notFull);

    buffer[nextin] = node;

    nextin = (nextin + 1) % size;

    count++;

    csignal(notEmpty);

    }

     

    take(char x)

    {

    if(count == 0)cwait(notEmpty);

    x = buffer[nextout];

    nextout = (next + 1) % size;

    count--;

    csignal(notFull);

    }

    }

    消息传递

    消息传递是进程间通信的另一个手段,其一个优点是除了进程间还可以适应分布式、共享的系统。消息传递最典型的两个原语:send(source, message)receive(destination, message),其中可以是阻塞send、阻塞receive的也可以是不阻塞send阻塞receive的或者两者都不阻塞。

    消息的组成包括消息头和消息体,消息头包括目的地Id、消息格式、源Id、消息长度等信息,消息体则是消息内容。

    寻址:消息可以是一对一的也可以是一对多、多对一或者多对多。

    消息的排队原则:默认情况下消息的接收应该是先进先出的对了,除此还要考虑紧急程度的优先级设置。

    生产者消费者的消息实现:

    producer

    {

    while(true)

    {

    receive(mayproduce, pmsg);

    pmsg = produce();

    send(mayconsume, pmsg);

    }

    }

    consumer

    {

    while(true)

    {

    receive(mayconsume, pmsg);

    pmsg = consume();

    send(mayproduce, pmsg);

    }

    }

    main()

    {

    create_messagebox(mayconsume);

    create_messagebox(mayproduce);

    for(int i = 0; i < N; i++) send(mayproduce, null);

    parbegin(producer, consumer);

    }

     

    读者和写者问题

    读者/写者问题不同于生产者消费者,一个资源可以同时有多个读者但是同一时间只能有一个写者。写者和读者不能同时获取资源。

    可以存在两种类型的锁

    1,读者优先:文件未被占用或存在读者时可以继续加入读者。

    2,写者优先:文件被读者占用后一旦出现写者后续不能加入读者。

    可以基于信号量或者消息发送来解决,个人觉得能通过信号量的一定能通过Monitor解决。

    死锁和饥饿

    死锁:两个或多个进程间都需要几个临界资源,但是各个进程持有其中一个临界资源而尝试获取另外的临界资源。

    饥饿:可能是优先级或者调度算法本身的原因导致某个进程始终无法获取到临界资源(竞争激烈),虽然不存在死锁但是这个进程做不了任何事情。

    联合进程图(Join Process Diagram

    资源类型

    可重用资源:比如I/O设备、文件等等,它们在同一时间只可以被一个进程使用,但是使用之后并不会因此而销毁。

    可消耗资源:比如存在I/O中的一段流数据,一旦被使用就不在存在了,但是可以被制造出来。除此以外还有信号、中断、消息等等。

    死锁形成的条件

    1.互斥

    2.不存在抢占

    3.持有和等待

    4.形成了等待的环路

    1~3:有可能产生死锁但是并没死锁。只有4发生的时候死锁才是真的产生了。

    死锁预防(protection

    死锁的预防不同于死锁避免,死锁预防的目的在于干涉死锁形成的条件1~4使得死锁无法形成,往往导致的成本很高并且不很实用。

    1.互斥:无法消除,有并发就有互斥。

    2.抢占:这个可以做到有几种途径:a,当进程资源请求被拒绝时强制其释放已占有的资源,在后续需要时可以重新申请。b,当进程申请已被其它进程占有的资源时系统允许其抢占。这两种方法都有一个大前提就是资源状态必须是容易保存和恢复的,否则就啥都没了。

    3.持有和等待:可以让进程一次申请所有需要的资源,这将不会出现持有并等待的情况。但是这是在进程能够预测它所使用的所有资源的前提下才成立的,并且效率很低。进程会在没有用到资源前先占用资源。

    4.形成环路:可以将各个资源类型定义成线性顺序,只有占有了前面资源的进程才能进一步申请后续资源——同样效率是硬伤。

     

    死锁避免(avoidance

    死锁的避免是运行时发现进程的启动或者请求会导致死锁,从而采取不启动或阻塞的措施。

    1,如果进程的请求导致死锁,则不启动进程。这个比较难做到,因为它要求进程提前预知自己要用到的所有资源。

    2,如果进程请求的资源可能导致死锁,则不分配资源给进程(塞你一会儿)。这个是更可行的办法。

    方法2的运算如下:

    OS中始终维护下列数据:

    1,矩阵C(claim)为各个进程声明的需要用到资源。

    2,矩阵A(allocation)现在以分配给各个进程的情况。

    3,向量R当前系统拥有的资源

    当一个进程申请起源是,OS假设分配资源给它并更下上面的数据,之后查看是否会产生死锁:

    1C - A得到矩阵P描述每个进程顺利完成时要得到的剩余资源。

    2,向量R - A中各个资源的合计值等到向量V当前可用的资源。

    3,如果向量V中的资源不足以使P中任何一个进程得到满足,那么即将发生死锁,这时候拒绝进程的请求。

    4,如果存在可完成的进程,把进程的资源加入到向量V中重复3步骤直到所有进程可完成或出现死锁。

     

    R1

    R2

    R3

    P1

    3

    2

    2

    P2

    6

    1

    3

    P3

    3

    1

    4

    P4

    4

    2

    2

    矩阵C

     

     

    R1

    R2

    R3

    P1

    1

    0

    0

    P2

    6

    1

    2

    P3

    2

    1

    1

    P4

    0

    0

    2

    矩阵A

     

    R1

    R2

    R3

    P1

    2

    2

    2

    P2

    0

    0

    1

    P3

    1

    0

    3

    P4

    4

    2

    0

    矩阵C - A

    R1

    R2

    R3

    9

    3

    6

    系统资源向量R

    R1

    R2

    R3

    0

    1

    1

    当前可用资源向量V

    由于当前可用资源可以满足P2,所以可以加回P2的资源并重复步骤3

    死锁的检测和恢复

    死锁的检测其实和上面的步骤是一样的需要两个矩阵:Q——进程请求资源(是排除已分配资源后)、A——进程已经分配的资源,一个向量V当前可用资源。

    1,标记A中所有资源占用都为0的进程行。

    2,初始化临时的向量W是它等于V

    3,查找Q中为标记的i行,其中i行小于向量W。如果找不到i则种植算法。

    4,如果找到i行,将i标记并把Ai行数据加回到W中。重复步骤3

    当算法结束时如果存在为标记的行则已经发生死锁。

     

    死锁的恢复有点野蛮:

    1,取消所有死锁的进程。这是现代操作系统最常用的办法。

    2,回滚进程到之前一个检查点(checkpoint),重新启动。操作系统需要具备回滚和恢复的能力,这样仍然有死锁的风险,但是并发的不确定性能保证死锁最终不再发生。

    3,连续取消死锁进程直到最终不再出现死锁。取消进程的顺序依赖某种成本的原则,取消后重新调用死锁检测,如果仍然存在死锁继续取消。

    4,连续抢占资源直到死锁不再发生。同样基于某些成本选择的方法,资源抢占后重新调用死锁检测,一个被抢占资源的进程需要回滚到获取该资源前的检查点。

    34步骤可以考虑一下原则:

    l 目前消耗处理器时间最少。

    l 目前为止产生的输出最少

    l 预计剩下的时间最长。

    l 目前位置分配的资源总量最少。

    l 优先级最低。

    哲学家就餐问题

    一个屋子里有5个哲学家他们一天中除了睡觉只做思考和吃饭两件事情,屋子里有一个桌子提供了哲学家喜欢的意大利粉,但是由于哲学家每天至思考导致身体退化他们需要用两个叉子才能够进食,他们坐下后会先拿起左手的叉子,然后拿起右手的叉子,之后进食吃饱以后放下两把叉子。桌子周围一共提供了五把椅子在每个椅子间提供了一把叉子,请为哲学家设计吃饭的算法。

    如果5个哲学家同时饿了那么每个人都会拿到左手的叉子而死锁。

    哲学家吃饭问题可以通过信号量或者Monitor来处理。

     

     

    内存管理

    内存管理的目的:

    l 重定位

    l 保护

    l 共享

    l 逻辑组织

    l 物理组织

    内存分区

    固定分区

    分为大小相等和大小不等的固定分区策略。内存预先被划分为固定大小的内存区域,进程可以安装到大于等于自身的内存区域中。

    存在内部碎片、大于最大内存区域的进程无法加载、内存利用不充分。

    动态分区

    动态的根据进程大小进行内存区域划分,从而使得每个进程可以装进和自己大小相等的内存区域。

    存在外部碎片、需要定时压缩外部碎片否则内存被割裂成很多小区域。

    伙伴系统

    采用二分法把内存等大小的两块区域(2^1),再将其中一块区域继续二分为2^2层,逐次分配下去直到进程所需的大小M2^(N+1) < M <2^N)时保存进程。在进程释放后再进行合并为较大的块。

    伙伴系统弥补了固定分区和动态分区的缺点,但是分页和分段提供了更高级的分区方式。

    重定位

    因为进程换入换出后不一定仍加载到原来的内存位置,所以在程序中不可能确切的写出实际的内存地址,而是通过偏移量来描述位置。

    分页

    内存被划分成许多等大小的帧,程序被划分成与帧大小相等的若干页。进程加载时需要将所有页加载到内存中不一定连续的帧中。系统维护了页表描述程序占用的页和空闲页表。

    分页没有外部碎片,由于每个帧很小只有最后一帧是可能存在内部碎片的,所以只会出现很小的内部碎片。

    页的大小将直接影响性能。页太小时:页数多开始时页面错误率很高,一段时间后由于页面都已加入趋于平稳,但是过小的页将使每次读写的区块很小。页增大时:每一页所包含的单元和相关单元越来越远,局部性被削弱错误率增加,不断增大时错误率又减小当页大小等于进程P时不再有也错误,整个进程都在内存中。由此导致的问题是主存中能存入的进程越来越少。

    页表

    操作系统为每个进程维护一个页表描述进程中页与帧的对应,逻辑地址分为了页号和偏移量两部分。一般情况下页表的大小位页的大小,页表中每条记录称为页表实体(PTEpage table entry)。

    页表可以是多级页表,受制于页大小的限制页表的大小不能大于一页(也不可能把巨大的页表存放在主存中),因此页表做多级处理,根页表始终在主存中,当次级页表不在主存中时从辅存加载对应的页表进主存。

    根据页表寻址

    l 根据虚拟地址的页号查找根页表对应的帧号。

    l 帧号+次级页号合成次级页表的地址找到对应的主存中帧号(如果存在的话)。

    l 帧号+偏移量获得实地址。

    l 如果页表中页表实体的标志位标志当前页没有加载到主存中,发生页错误中断交给操作系统加载,进程被中断处于Block状态。

    反向页表(Inverter Page Table

    这是另一个可行的从虚地址获取实地址的方案。

    针对虚拟内存中页表大小和虚拟地址范围成比例的缺点(太大了),反向页表大小是固定的取决于主存中实际帧数。反响列表对虚拟地址的页号做Hash运算取得Hash值,每一个Hash值对应一个数据项。数据项中记录了进程ID和主存中帧号,通过帧号和偏移量就可以得到实地址了。由于多个虚拟地址可能映射到同一个Hash值,反向页表需要维持链结构(当前项连接到同值的其它项),所以进程IDHash值共同决定了虚拟地址对应的数据项。

    反响的含义是指使用帧号而不是页号来索引页表项。

    转移后备缓冲器(TLBTranslation Lookside Buffer

    这是(虚拟内存地址转换)硬件设备的一部分,相当于高速缓存。因为正常情况下虚拟地址的访问要经过两次主存——一次查找帧地址,一次取数据,转移后备缓冲器缓存了页号和帧地址的对应关系,只有在未命中的情况下采取访问页表查找帧号。

    分段

    简单分段类似于简单分页,是将主存换分成大小不等的若干段,一个进程可以存储在不连续的段中。分段的大小受限于分段最大长度。分段对程序员是可见的,它具有处理不断增长的数据结构的能力以及支持共享和保护的能力。操作系统为每个进程维护一个段表。

    分段存在外部碎片。

    段页结合

    段页结构是将程序划分成段,每段保存在主存中对应的段里,在主存中段是由等大小的多个页组成,当段最后不足一个页时占用一个页。

    段页结合的方式结合了分段和分页的长处。在分段系统中由于每段有长度属性,避免了程序不经意的越界访问。进程间存在共享时多个进程可能持有同一个段的引用,页结构也可以是实现类似的结构。

    虚拟内存

    当程序太大超过主存时就需要虚拟内存了,另外多道程序设计希望同时有尽可能多的进程加载到内存中,由于局部性的原理进程不需要全部加载进内存而是加载频繁是用的区块(称为驻留集),进程的其它部分保存着专门的辅存区域中。这个机制称为虚拟内存。

    系统抖动

    当系统换出一块内存区域后紧接着它有需要调用它,当这种情况频繁发生的时候就导致了系统抖动。

    读取策略

    分为请求式分页和预约式分页。请求式分页是指当确实需要访问到某页时才把它加载进主存,预约式分页是利用局部性原理将可能访问到的当前请求的后续页面加载到主存中。显然预约式分页更可取,但是会造成一定的浪费,在首次加载页面和发生页错误时适合采取预约式分页。

    放置策略

    替换策略

    替换策略是在加载新的页时主存已满需要替换出页时决定那些页将被替换的算法。

    最佳(OPTOptimal

    最少发生页错误的算法,是优先替换那些距离访问最远的页面,需要预知页的请求顺序,本身是不可能实现的,但是可以作为参考比对其它策略。

    最近最少使用

    实际上是性能上最接近最佳的,但是仍难以实现。一种实现方式是给每个页定义最近访问的时间标签,并在每次访问后更新标签,即使通过硬件支持成本和开销仍然很高。

    先进先出

    依赖的理论是一个在很久以前加载的页现在很可能已经不再访问了,但是结果往往并非如此,这种策略很容易实现。

    时钟

    环形的结构,通过指针指示当前所在位置,每个页有一个使用为在访问后标记其值为1。在需要替换时移动指针找到第一个标记位等于0的页,指针每移动过一个页就将这个页的使用位清零。这样如果没有使用位为0的页,当移动一圈以后最初的位置就会被清理。

    一个改进是增加修改位——这也是必须的因为被修改的内存必然要写入辅存。现在有两个指示位(访问u,修改m),算法如下:

    1,查找u=0,m=0的页,如果存在替换。这一步不清零访问位。

    2,如果1失败,查找u=0m=1的页,并且这个过程中把访问位清零。

    3,如果2失败,重复1,必要时重复2

    这样好处是尽量不去替换发生数据修改的页,少了写回辅存的动作。

    页缓冲

    也是避免系统抖动的一个策略,在主存中划分出一定的缓存,用于保存那些被替换出的页,根据局部性原理他们很可能近期会被访问到。这个缓存是一个先入先出的队列,一般页面被访问则直接从缓存中取回,如果一直没有被访问则最终会被挤出缓存。

    驻留集管理(Resident Set

    虚拟内存中并非一个进程的所有部分都加载到主存中,程序运行过程中常驻内存的部分称为驻留集。

    驻留集的讨论包括两部分:驻留集分配(大小)和替换范围。其中驻留集不可变的情况下替换算法已经在替换侧路讨论过了,驻留集可变的情况下将有所不同。

    固定分配,局部范围:每个进程的驻留集大小固定,每个进程一旦有一个页换进来就要有一个页换出去。需要根据程序的类型、优先级等预先分配固定的大小,一旦过小则会保持较高的也错误率,如果较大则会占用资源,系统运行缓慢。

    动态分配,全局范围:根据进程运行的状态调整驻留集的大小,如果页错误率较高就适当加大驻留集,如果进程错误率一直保持较低水平说明程序的驻留集足够大,可以适当削减一些也不会危及程序。全局范围则可在所有进程间选择要被替换出的页,难点在于没办法确定该从哪里换出页(即很可能换了不该换的),解决办法是页缓冲。

    动态分配,局部范围:动态分配的效果同上,同时限制在进程自己的范围内换出页。在这个策略中要求对增加或减少驻留集大小进行评估并且要预估将来进程的情况,因此比简单全局替换要复杂得多,但会提供更好的性能。

    驻留集的替换策略

    工作集策略(Working Set

    Wt,r)是关于t和r的函数,t是单位时间,r是窗口的宽度定义最近的r个单位时间中用到的页的集合。即始终有W(t, r+1) 包含 W(t, r)。

    工作集如下工作:

    1,监视每个进程的工作集。

    2,周期性的从一个进程的驻留集中移除那些不在工作集中的页,可以使用LRU策略。

    3,只有当一个进程的工作集在主存时才可以执行该进程(也就是驻留集包含了工作集)。

    首先工作集是有效的,它利用率局部性原理,并未该原理设计了一个可以减少页错误的内存管理策略。遗憾的是工作集存在很多问题:

    1,现在不总是代表未来。

    2,开销太大,实现监视每个进程不现实。

    3,r最优值未知。

    但是工作集提供了参考,以下方案都是基于工作集思想的:

    页错误频率(Page Fault FrequencyPFF

    主存中每个页都有一个使用位(和时钟的一样作用),操作系统记录每个进程上一次页错误的时间戳,如果发生了页错误查看两次页错误的时间间隔如果小于阈值F,则加入新的页(扩大驻留集),否则清除所有使用位为0的页,并把当前驻留集的页使用位清零(缩小驻留集)。一个改进时加入使用两个阈值——一个是驻留集增加的最高阈值,一个是驻留集减小的最低阈值(指频率)。

    页面错误频率是工作集的一个折衷,使用页缓冲则可以达到相当好的效率。但是一个缺点是如果要转移到新的局部性,会导致暂时的驻留集猛增。转移到新的局部性是指,进程运行一段时间会切换到不同的逻辑指令部分,这时候局部性发生偏移,之前的驻留集不再需要。

    采样间隔可变工作集(Variable-interval Simple Working SetVSWS

    针对PFF在内存高峰是来不及淘汰就得驻留集而导致进程频繁换入换出等开销(频率不够快),采用动态的采样率以期望尽快淘汰不需要的页。

    采用三个参数:L采样区间最长宽度、M采样区间最短快读、Q采样区间允许发生的页错误数。VSWSPFF一样使用了页的使用位,不同之处在于频率的调整:

    1,如果采样时间超过了最长时间L,挂起进程并扫描使用位。

    2,未达到最长时间,但是页错误数超过了Q

    2.1,如果采样间隔超过了M则挂起进程并扫描使用位。

    2.2,如果采样间隔没有超过M,则一直等待采样时间到达M进行扫描。

    清除策略

    清除策略目的在于确定何时讲一个被修改的页写回辅存,分为请求式清除和预约式清除。

    请求式清除采取动作的时间比较慢,影响性能。

    预约式清除把需要修改的页在需要用到它们的页帧之前批量的写回辅存。但是预约式清除写回的页在替换策略确定移除它之前仍有驻留在主存中,这期间可能再次发生修改导致清除无意义。

    改进办法是使用页缓冲,分为两个表存储替换策略淘汰的页。一个表寸修改的页,一个表存未修改的页,修改表中的页被批量的写回辅存,然后移动到未修改表中,未修改的表准备被挤出或者拿回。

     

    加载控制

    加载控制是关注多道程序设计的控制,系统中多道程序的数量称为多道程序设计级。当多道程序数量过少时系统会比较空闲,过多时则会导致较高的页错误率和抖动。

    一个方案称为L=SL是页错误间隔的平均时间,S是页错误的平均处理时间,实验表明当两者接近时处理器使用率达到最大。

    另一个方案是50%方案,即始终报纸分页设备的使用率保持在50%左右,此时的处理器使用率也是最大。

    另外策略是监视时钟(Clock)替换策略的环形缓存区指针移动速度,当移动速度低于某个阈值时可能是以下两种情况之一:

    1,很少发生页错误,指针很少移动。

    2,未被使用的驻留页太多,指针不需要移动太多就可以找到可清除页。

    这两种情况都表明进程的驻留集分配太大,可以增加多道程序设计级。另外还可以包括一个高阈值,如果指针移动速度超过这个阈值,则表明多道程序设计级太高,导致频繁的页错误,则要挂起进程以减少多道程序设计级。挂起进程的策略可以是:

    l 最低优先级

    l 正在发生页错误的进程(Faulting process):原因是该进程很肯能驻留集还没有形成,因此暂停它的代价很低。

    l 最后被激活的进程:同样很可能有最小的驻留集。

    l 拥有最小驻留集的进程:重新装入的代价最小,但是不利于驻留集较小的程序。

    l 最大的进程:释放较大的空间,不用很快又去取活其它的进程。

    l 具有最大剩余执行窗口的进程:类似于最少剩余时间策略,把已运行时间最短的挂起。

     

    处理器调度

     

    单处理器调度

    调度类型

    长程调度:决定是否将任务加入到待执行的进程池中。

    中程调度:决定进程的部分或全部加入到内存中(从SuspendedReady)。

    短程调度:决定哪一个就绪的进程将被执行。

    I/O调度:决定哪一个挂起的I/O请求将被可用的I/O设备执行。

    处理器调度关注的是短程调度。

    调度准则

    面向用户

    响应时间:从任务提交到开始有响应输出的时间,一般的当处理器开始处理任务时即开始有输出。

    周转时间:从任务提交到任务完成的时间。

    最后期限:当可以指定最后期限时,操作系统降低其它目标,是满足最后期限的作业数目的百分比达到最高。

    可预测性:无论系统当前负载情况是繁重还是空闲,一个给定工作完成的总时间和总代价应该是相等的。

    面向系统

    吞吐量:单位时间内完成的进程数。

    处理器利用率:处理器处于忙状态的时间百分比。对于昂贵的共享系统来说这是一个重要的准则,对于个人系统则显得不那么重要。

    公平性:没有来自用户或其它系统的指导时操作系统应该公平的对待所有进程,没有一个进程会处于饥饿状态。

    强制优先级:当指定了优先级后调度策略应优先响应高优先级的进程。

    平衡资源:调度策略应是系统的所有资源保持忙碌的状态,较少使用紧缺系统资源的进程应该得到照顾。

    调度算法

    归一化周转时间:它是指进程周转时间与服务时间的比率,最小值是1.0.该值表示进程的相对延迟,典型的进程的执行时间越长可容忍的延迟越长。

    先来先服务(FCFS:没有优先级和抢占,所有进程按照加入的顺序执行。这样的调度偏向于执行时间长的进程。FCFS策略本身对操作系统不是很有吸引力,但是它经常和优先级系统配合使用产生有价值的调度策略。

    轮转(Round Robin:对处理器资源进行时间分片,依次分配相同的时间资源给每个就绪的进程。轮转的时间片最好略大于一次典型交互的时间,当时间片足够大时退化为FCFS策略。

    轮转增加了处理时钟中断、进程切换和分配函数的开销,因此时间片不应该过短。该策略对短执行时间的进程有所改善,但是一个问题是进程分为I/O密集型和处理器密集型,由于I/O密集型进程经常被I/O中断,所以轮转策略倾向于处理器密集型。

    一个改善的策略是虚拟轮转法(Virtual Round Robin),它增加了一个I/O队列,当一个进程被I/O阻塞后它加入到I/O队列,在就绪后它I/O队列有高于就绪队列的优先级,该进程后续的执行时间与已执行时间的和不会超过时间片。

    最短进程优先(SPNshortest process Next:具有最短执行时间的进程有更高的优先级,它依赖于系统估计进程的执行时间,在批处理系统中任务加入时程序员给出任务的估计时间,如果任务执行时间远远超过给出的估计时间它将被废弃。在生产环境中有大量的重复任务,系统将监控每次任务执行的时间以估计执行时间,最简单的公式是s=(各次时间和)/n,一个避免每次求和的优化是s=S(n-1) + Tn/n,上述公式每次执行的权值是相同的,典型情况下我们希望最近的执行情况有更大的权值Sn+1 = aTn + (1-a)Sn

    最少剩余时间(SRTshortest remain time:是SPN的改进版本增加了抢占机制,在不断有短进程加入的情况下长进程可能处于饥饿状态。

    最高相应比优先(HRRN,Highest Response Rapid Next:使用公式(w+s)/s,其中w是等待时间,s是服务时间。操作系统始终选择具有最高相应比的进程,同样需要估计和记录进程的服务时间。该策略非常具有吸引力,当偏向短进程时,长进程由于得不到处理响应比不断增加。

    反馈:不想SPNSTRHRRN策略那样需要估计时间,反馈策略倾向于短进程,它具备多个队列Q1~Qn,当进程加入时处于Q1队列中,采用FCFS的顺序服务队列中的每个进程,当进程允许超过时间阈值时中断并加入到下一级队列中Q2,依次类推。Q1具有最高的优先级,只有Q1中不存在进程是才执行下一级的队列。这样可能导致的问题是过长的队列可能加入到Qn队列后处于饥饿状态,因此要见识进程的等待时间,如果超过一定长度则重新调入到Q1中。

     

    多处理器调度

    多处理器调度关注的类型

    粒度

    无约束并行性:进程之间没有显示的同步,每个进程都是一个单独的程序。无约束并行可能达到每个用户都像是使用单独的计算机或工作站。

    粗粒度和非常粗粒度并行性:进程之间存在这同步,但是在一个非常粗浅的级别上,这种情况可以简单的处理成一组运行在多道程序单处理器的并发进程,在多处理器系统是允许的软件进行很少或者不进行改动就可以支持。

    中等粒度并行性:应用程序可以被进程中一组线程有效的实现,这种情况下程序员需要显示的指定潜在的同步性,应用程序之间需要高程度的合作与交互。

    细粒度并行性:代表着比线程间更加复杂的同步情况,迄今为止仍是特殊的未被分割的领域。

    进程调度

    集中调度or对等调度:

    集中调度即调度中存在主处理器,所有的任务分发由主处理器来完成,这种情况下主处理器可能成为系统的瓶颈。

    单处理器使用多道程序设计:

     

    与单处理器性能的不同:

    多个处理器系统中由于一个长进程在单个处理器上执行时,其它的进程可以分配到另外的处理器上因此复杂的调度策略不再显得非常重要,调度策略的开销可能成为性能损失。FCFS策略变得可接受。

    线程调度

    负载分配:

    提供全局队列,每个处理器只要空闲就从队列中取任务执行。

    优点是:负载均匀的分配给处理器,不存在空闲的处理器;不需要集中调度;可以使用单处理的任何一种调度方案进行分配。

    缺点是:中心队列占居了必须互斥访问的存储器区域,因此多处理器同时查找时会成为瓶颈,当只有几十个处理器时不是大问题,但是上百个处理器时就会出现瓶颈。被抢占的线程可能在不同的处理器上执行,如果每个处理器都配有高速缓存的话那么命中率将非常低。如果进程的所有线程都视为在公共线程池中那么进程的线程可能不会同时被处理,当线程间存在高度合作时则出现瓶颈。

    组调度:

    一组相关的线程基于一对一的原则,同时分配到一组处理器上去。

    优点:如果紧密相关的进程并行执行那么同步阻塞可能减少,从进程推广到线程组调度把一个进程所有的线程视为相关的;调度开销可能减少,因为进程内线程间可能相关如果一个线程在高速允许,而它以来的线程没有运行就会出现阻塞和调度。

    缺点:组调度同一时间调度一个进程中相关线程,某些进程的特性可能至适应单线程允许将会出现其它处理器空闲的情况,解决办法是把若干单线程的进程视为一组允许。

    专用处理器分配:

    每个程序执行时被分配给一组处理器,处理器个数与进程的线程数相等,当进程执行完后处理器返回到处理器池中等待处理其它任务。这个策略看似是极端浪费的,它会等到进程运行结束才将处理器分配给其它的进程使用,而一旦一个线程被I/O阻塞执行它的处理器将空闲。

    采用这个策略的原因:

    1,高度并行的系统中有数十或者数百个处理,每个处理器只占系统总代价的一小部分,处理器利用率不再是衡量有效性或性能的重要因素。

    2,一个程序的生命周期里避免进程切换会加快程序运行。

    动态调度:

    执行期间进程的线程数可以改变。某些应用程序可能提供了语言和系统工具允许动态的改变进程中的线程数目。提供了一种操作系统和应用程序共同进行调度决策的方法。

    当一个作业请求一个或多个处理器时:

    1,如果有空闲处理器分配满足它们需求。

    2,否则如果作业新到达,从当前已分配多个处理器的作业中分出一个处理器给它。

    3,如果都不满足那么作业处于未完成状态直到有空闲的处理器或者改作业废除它的请求。

    4,当释放一个或多个处理器时为这些处理器扫描当前未满足的请求队列,给每个没有分配处理器的作业分配一个处理器,如果还有空闲处理器再次扫描队列,按照FCFS原则分配处理器。

     

     

    I/O设备调度

    I/O功能的逻辑结构

    逻辑I/O:逻辑I/O层将I/O设备视为逻辑资源,不关心底层的细节。逻辑I/O代表用户进程管理的一般I/O功能,允许它们根据设备标识符以及诸如打开、关闭、读取等操作与设备打交道。

    设备I/O:请求的操作和数据(缓冲的数据、记录等)被转换成适当的I/O指令序列、通道命令和控制器指令。可以使用缓存技术以提高使用率。

    调度和控制:关于I/O操作的排队、调度和控制发生在这一层,可以在这一次处理中断,收集和报告I/O状态。这一层是与I/O设备真正打交道的软件层。

    I/O缓冲

    I/O设备划分

    I/O设备分为面向块(block oriented和面向流(stream oriented)的设备,面向块的设备将信息保存在块中,通常是固定大小的,传输过程中一次传送一块。面向流的设备以字节流的方式传输数据。

    单缓冲:系统在发送I/O指令后给I/O设备分配一块位于主存中的缓冲区,传输数据被放在缓冲区中,当传输完成时立即尝试读取下一块。根据局部性原理有理由期望下一块被读取,这种机制称为超前读。

    双缓冲:单缓冲时I/O设备必须等待读取缓冲区中数据被完全读出才能再次写入,双缓冲设置两块缓存区域以平滑这种趋势。设C为进程处理块的时间,T位读取块的时间,我们可以粗略估计块的执行时间位maxCT),当C>=T是进程将不需要等待I/O,当C<T是则I/O设备可以全速运行。

    循环缓冲:当爆发性的执行大量的I/O操作时,则仅有双缓冲就不够了,这种情况下使用多于两个缓冲的方案来缓解,这种缓冲区域自身被当成循环区域使用。

    需要指出的是缓存是一种技术旨在平缓I/O请求峰值的,当进程需求的I/O平均值大于I/O传输速度是再多的缓冲也不能解决问题。

    磁盘调度

    磁盘性能参数

    寻道时间:机械臂移动到数据所在轨道的时间,现在典型磁盘的寻道时间Ts=10ms

    旋转延迟:磁盘旋转到要读取的数据位置的延迟,一般取平均时间即1/2r,其中r表示转速。

    传送时间:磁头读取数据所花费的时间b/(Nr),b表示要读取的字节数,N表示磁道上总字节数,r表示转速。

    磁盘调度策略

    先进先出

    先来的请求先服务,由于数据的请求式随机的,会导致较高的寻址时间,效率差。

    优先级

    优先级是高优先级的请求先服务,一般是为了满足操作系统的特定目的,并没有改善磁盘性能的能力。

    后进先出(LIFO

    令人惊讶的是这种选取最近请求的策略有许多优点。把设备资源提供给最近(使用系统)的用户时会导致磁头臂在一个顺序文件中移动时移动的很少,甚至不移动。利用这种局部性原理可以提高吞吐量减少队列长度,只要一个作业积极的使用磁盘它就能尽快得到处理。

    当然如果有大量的请求就会导致最先的请求饿死。

    最短服务时间优先(SSTF

    总是选择磁头臂移动最少的请求响应,对于移动距离相等的请求可以随机移动向一边。同样如果一个进程大量的请求临近的数据会导致其它请求饥饿。

    SCAN

    SCAN要求磁头臂向一个方向移动,移动过程中响应在当前磁道的请求。当磁头臂到达最外(内)层磁道时,再反向扫描。这种算法并没有很好的利用局部性原理(对最近横跨过的区域不公平,不如SSTFLIFO好),由于两侧的数据被快速的扫描了两次因此它偏向于外围数据(局部性原理)。

    C-SCAN

    限定在一个方向扫描,当达到最后一个磁道时,磁头臂返回到相反方向的磁道末端重新开始扫描。

    N-step-SCANFSCAN

    为了克服进程的粘滞性,在SCANC-SCAN中一个或多个进程对一个磁道有较高的访问速度时可能会垄断这个磁道一段时间。N-step-SCAN设置若干个N个请求的队列,每次扫描只响应一个队列里的请求,当开始扫描时新的请求需要加入到下一个队列中。

     

    RAID

    RAID是一组磁盘系统把它们看为一个单个的逻辑驱动器。

    数据分布在物理驱动器阵列中

    使用冗余的磁盘容量保存奇偶检验信息,保障一个磁盘失败时,数据具有可恢复性。

    磁盘高速缓冲

    高速缓存是系统从主存中划分的一块区域,利用了局部性原理保存最近访问的数据块,用于提高更好的磁盘性能。

    替换算法

    LRU:最少访问,将缓冲区设置为一个栈,当一个块被访问后加入到栈中,如果再次得当访问则把该块从当前位置移动到栈顶,随着块的加入那些不被访问的将会挤出栈中。

    LFU:最小频率访问,对缓存中的块增加计数特性,每次被访问到时计数加1。当访问辅存时,把计数最小的块移除,加入最近的块。由于局部性的问题,一个块可能短时间内多次访问使得计次很高,但是这之后并不意味着还会再次访问它,所以LFU并不是一个好的算法。

    基于频率的替换算法:克服LFU的确定,在LRU的栈模型中划分出位于栈顶的若干帧为新区,当块位于新区是重复访问不增加访问次数。

    文件管理

    文件系统软件结构

    基本文件系统:计算机与外部环境的接口,该层处理磁盘、磁带的交互数据。

    基本I/O管理程序:负责所有文件I/O的初始和终止。

    逻辑I/O:是用户和应用程序能够访问到记录。

    访问方法层(堆、顺序文件、索引顺序文件、索引、散列):距离用户和应用程序最近的层,在应用程序与保存数据的设备之间提供了标准接口。

    文件结构:

    域(Field):基本的数据单元,一个域包含一个值,如雇员名字、日期等。

    记录(Record):一组相关域的集合,可以看做应用程序的一个单元。

    文件(File):一组相关记录的集合,它被用户或应用程序看做一个实体,并可以通过名字访问。

    数据库(DB):一组相关数据的集合,它的本质特征是数据之间存在着明确的关系,可供不同的应用程序使用。

    文件组织和访问

    堆:

    最简单的文件系统。数据按它们到达的顺序被组织,通过特定的分隔符或特定的域指明。每个域应该是自描述的,数据之间不一定存在联系或相同的格式。

    当数据在处理器采集并存储时或者当数据难以存储时会用到堆。只能穷举搜索,对大多数应用都不适用。

    顺序文件:

    文件具有固定的格式,所有的记录都有相同的格式,具有相同数目、长度固定的域按照顺序组成。每条记录第一个域称为关键域,唯一标识了这条记录。

    交互的表现较差,需要顺序的搜索。一种情况下顺序文件按照顺序存储在磁盘上,在发生文件修改时需要移动数据,可能的处理方式是把数据存在临时堆上,定期的将数据批量写回顺序文件。另一种情况文件可能采用链式存储,该方法带来一些方便,但是是以额外的处理和开销为代价的。

    索引顺序文件

    弥补了顺序文件检索的问题。检索文件可以是简单的顺序文件,每条记录包括两个值一个关键域和指向文件的指针。简单的检索可以是一级的,也可以由多级检索。查找文件时找到相等的域或者关键域值之前最大的域。

    索引文件

    顺序文件和索引顺序文件只能是顺序检索或对关键域检索,索引文件对感兴趣的域提供了索引,索引文件本身可以是顺序的。索引文件分为完全索引和部分索引,差别在于被索引的域是全部域还仅仅是感兴趣的域。

    索引文件一般只提供索引访问的方式,不再支持顺序访问,因此记录的组织也不必是顺序的,应用程序只能通过指针访问。

    直接文件或散列文件

    直接文件或散列文件开发直接访问磁盘中任何一个地址一致的块的能力,要求每条记录中都有一个关键域,但这里不存在顺序的概念。

    记录组块

    磁盘中数据保存在块中,块越大每次传输的数据越多,效率越高。当时大的块要求操作系统提供更大或者复杂的缓存,并且由于局部性的关系大块中的数据可能是应用程序不需要的造成浪费。

    固定组块

    使用固定长度的记录,并且若干条完整记录保存到一个块中,每个块末尾可能有未使用的空间称为内部碎片。

    可变长度跨越式组块

    块的长度可变,记录可以跨越块保存,如果一个块的末尾空间不足一条记录时,剩下的数据可以保存在下一个块中,通过后继指针指明。造成了更复杂的处理,并且当读取跨越块的数据时需要读取两次,消除了内部碎片。

    可变长度非跨越式组块

    和上面相同,但是记录不可以跨越块保存。

    二级存储管理

    文件分配

    预分配:文件请求时声明需要的空间,一次性分配。

    动态分配:根据文件的增长每次分配一定的空间,或者一块。

    分配方法:

    连续分配:始终给文件分配连续的空间。这种分配方式对于顺序文件非常高效,并且可以简单的检索到需要的文件块。但是会产生外部碎片,并且需要实时运行压缩程序以消除外部碎片。

    链式分配:文件不需要顺序保存,每块尾部通过指针指向下一块数据,文件分配表中同样只要保存一个表项。

    链式分配的一个后果是局部性不再被利用,如果要顺序的读取一个文件时需要一连串访问磁盘的不同部分,这对系统的影响很严重。一些系统周期性的的对文件进行合并。

    索引分配:每个文件在文件分配表中有一个一级索引,分配给文件的每个分区在索引中都有一个表项,典型的文件索引在物理上并不保存在文件分配表上,而是保存在独立的一个块上,文件分配表中该文件索引指向这个块。

    可以消除外部碎片,按大小可变的分区分配可以提高局部性,任何情况下(大小可变分区、按块保存)都需要不时的对文件进行合并。使用大小可变的分区情况下合并可以减少文件索引。索引分配支持顺序和直接读取数据,是最普遍的一种文件分配形式。

    空闲空间管理

    位表:使用一个向量,向量的每一位代表一块磁盘,0表示空闲,1表示使用。优点是容易找到一块或一组连续的空间,问题是需要穷举来找到合适大小的区域,当磁盘剩余很少空间时这个问题尤为严重,因此需要设置特殊的数据结构辅助查找。如位表可以在逻辑上划分为不同的区域,建立区域汇总表统计每个区域的使用情况,查找空闲位时可以先找到合适的区域在查找位表中这部分区域的使用情况。

    位表需要加载在主存中,一个位表所需要的存储总量为【(磁盘大小)/(8*文件系统块大小)】(计算的是占用的字节数),因此一个16GB的磁盘,块大小位512字节时位表占用4MB,如果每次去数据都从硬盘加载4MB的位表的话这个速度是难以忍受的。

    链式空闲区

    空闲表可以使用指向每个空闲区的指针和他们的长度值被连接在一起,因为空闲表只需要一个指向第一个空闲区的指针,因此这种情况下空闲表的大小是可以忽略的。

    这种分配法适合所有的文件分配方法,如果按块分配可以移动位于头部的指针,如果是按区域分配则可以顺序的找到合适的区域并更新指针。

    存在的问题:1,使用一段时间磁盘会出现很多碎片,许多区变成只有一块大小。2,写时需要先读取该块以发现下一块的指针,如果进程请求大量的单个块这个效率是很差的,同意删除的时候也会导致很慢。

    索引

    索引是把空闲空间看做文件,使用之前介绍的索引表的方式记录。基于效率的原因,索引适合使用在大小可变的分区分配的情况下。

    空闲块列表

    每个空闲块都有一个顺序号,把顺序号保存在磁盘的一个保留区中。根据磁盘的大小,存储一个块号需要24位或32位。这是一种令人满意的方法,空闲块列表部分保存在主存里:

    1,磁盘空闲块列表占用空间小于磁盘空间的1%

    2,尽管空闲块太大了,不能保存在主存。但是两种有效技术把该表的一小部分保存在主存里:

    a,这个表可以是一个下推栈,栈中靠前的数千元素保存在内存中,当分配一个新块时它从栈顶弹出,同样当一个块被接触时把它压入栈中。只有栈中部分满了或者空了时候才需要从磁盘传输数据,通常情况下它是零访问时间的。

    b,这个表可以看所FIFO的队列,分配时从头部取走,取消分配时从队尾入队,只有队空了或者满了时才需要与磁盘传输。



    展开全文
  • 计算机操作系统 一.操作系统引论 1.操作系统的目标和功能 目标 方便性 有效性 提高系统资源利用率 提高系统吞吐量 可扩充性 开放性 作用 OS作为用户与计算机硬件系统之间的接口 ...

    计算机操作系统

    一.操作系统引论

    1.操作系统的目标和功能

    • 目标
      • 方便性
      • 有效性
        • 提高系统资源利用率
        • 提高系统吞吐量
      • 可扩充性
      • 开放性
    • 作用
      • OS作为用户与计算机硬件系统之间的接口
        • 命令方式
        • 系统调用方式
        • 图标–窗口方式
      • OS实现了对计算机资源的抽象

    2.操作系统的发展过程

    • 未配置操作系统的计算机系统
      • 人工操作方式

          用户独占全机 CPU等待人工操作 严重降低了计算机资源的利用率
        
      • 脱机输入/输出(Off–Line I/O)方式

          减少了CPU的空闲时间 提高了I/O速度 效率仍然不理想
        
    • 单道批处理系统
    • 多道批处理系统
      1.资源利用率高
      2.系统吞吐量大
      3.平均周转时间长
      4.无交互能力
      • (宏观并行,微观串行)
    • 分时系统
      特征:
      1.多路性
      2.独立性
      3.及时性
      4.交互性
    • 实时系统
    • 集群系统–超算~云计算
    • 微机操作系统的发展

    3.操作系统的基本特征

    • 1.并发concurrence
      • 区别并行和并发

          并行性是指两个或多个事件在同一时刻发生→宏观并行,微观并行
          并发性是指两个或多个事件在同一时间间隔内发生→宏观并行,微观串行
        
        • 并发是进程宏观一起运行,微观上交替运行,而并行是指同时运行
      • 引入进程

          进程是指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令,数据和堆栈等组成的,是一个能独立运行的活动实体
        
    • 2.共享sharing
      • 1.互斥共享方式
      • 2.同时访问方式
      • 并发和共享是多用户(多任务)OS的两个最基本的特征。它们又是互为存在的条件
    • 3.虚拟virtual
      • 时分复用技术
      • 空分复用技术
    • 4.异步asynchronism

    4.操作系统的主要功能

    • 1.处理机管理功能
      • 进程控制
      • 进程同步
        • 进程互斥方式
        • 进程同步方式(协同)
      • 进程通信
      • 调度
        • 作业调度
        • 进程调度
    • 2.存储器管理功能
      • 内存分配
        • 静态分配
        • 动态分配
      • 内存保护
      • 地址映射
      • 内存扩充
    • 3.设备管理功能
      • 缓冲管理
      • 设备分配
      • 设备处理
        • 设备处理程序又称设备驱动程序
    • 4.文件管理功能
      • 文件存储空间的管理
      • 目录管理
      • 文件的读写管理和保护
    • 5.操作系统与用户之间的接口
      • 用户接口
      • 程序接口
    • 6.现代操作系统的新功能
      • 系统安全
      • 网络的功能和服务
      • 支持多媒体

    5.OS结构设计

    • 传统操作系统结构
      • 无结构操作系统
      • 模块化OS
      • 分层式结构OS
    • 微内核os结构
      • 客户/服务器模式
      • 面对对象的程序设计

    第二章进程的描述与控制

    前驱图和程序执行

    程序并发执行

    • 程序的并发执行
    • 程序并发执行时的特征
      • 间断性
      • 失去封闭性
      • 不可再现性

    进程的描述

    • 进程的定义
      • 进程是程序的一次执行
      • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
      • 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
    • 进程的特征
      • 动态性
      • 并发性
      • 独立性
      • 异步性
    • 从操作系统角度分类
      • 系统进程
      • 用户进程
    • 进程和程序的区别
      • 进程是动态概念,而程序则是静态概念
      • 程序是指令的有序集合,永远存在;进程强调是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;
      • 进程具有并发性,而程序没有
      • 进程可创建其他进程,而程序并不能形成新的程序
      • 进程是竞争计算机资源的基本单位,程序不是
    • 进程和程序的联系
      • 进程是程序在数据集上的一次执行
      • 程序是构成进程的组成部分,一个程序可对应多个进程,一个进程可包括多个程序
      • 进程的运行目标是执行所对应的程序
      • 从静态看,进程由程序、数据和进程控制块(PCB)组成
    • 进程的基本状态及转换
      • 进程的三种基本状态
        • 就绪状态ready
        • 执行状态running
        • 阻塞状态block
      • 三种基本状态的转换
      • 创建状态和终止状态
        • 五状态进程模型
      • 注意
        • 阻塞态->运行态和就绪态->阻塞态这二种状态转换不可能发生
    • 挂起操作和进程状态的转换
      • 挂起和阻塞的区别
      • 挂起操作的目的
        • 终端用户的需要: 修改、检查进程
        • 父进程的需要:修改、协调子进程
        • 对换的需要:缓和内存
        • 负荷调节的需要:保证实时任务的执行
      • 关键图
    • 进程管理中的数据结构
      • 进程控制块PCB的作用
        • 作为独立运行基本单位的标志
        • 能实现间断性运行方式
        • 提供进程管理所需要的信息
        • 提供进程调度所需要的信息
        • 实现与其他进程的同步与通信
      • 进程控制块的信息
        • 进程标识符
          • 外部标识符PID
          • 内部标识符(端口)
        • 处理机状态
          • 通用寄存器
          • 指令计数器
          • 程序状态字PSW
          • 用户栈指针
        • 进程调度信息
          • 进程状态
          • 进程优先级
          • 进程调度所需的其他信息
          • 事件
        • 进程控制信息
          • 程序和数据的地址
          • 进程同步和通信机制
          • 资源清单
          • 链接指针
        • 进程控制块的组织方式
          • 线性方式
          • 链接方式
          • 索引方式

    进程控制

    • 操作系统内核
      • 两大功能
        • 支撑功能
          • 中断管理
          • 时钟管理
          • 原语操作
            • 进程的管理,由若干原语(primitive)来执行
        • 资源管理功能
          • 进程管理
          • 存储器管理
          • 设备管理
      • 状态
        • 系统态,管态,内核态
        • 用户态,目态
    • 进程的创建
      • 进程的层次结构
        • 父进程
        • 子进程
      • 引起创建进程的事件
        • 用户登录
        • 作业调度
        • 提供服务
        • 应用请求
      • 进程的创建过程
        • 1.申请空白PCB
        • 2.为新进程分配其运行所需的资源
        • 3.初始化进程块PCB
        • 4.如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列
      • 进程的终止
        • 引起进程终止的事件
          • 1.正常结束
          • 2.异常结束
          • 3.外界干预
        • 进程的终止过程
          • 1.根据被终止进程的标识符
      • 进程的阻塞与唤醒
        • 引起进程阻塞和唤醒的事件
          • 请求系统服务而未满足
          • 启动某种操作而阻塞当前进程
          • 新数据尚未到达
          • 无新工作可做:系统进程
        • 进程阻塞过程(自己阻塞自己)
        • 进程唤醒过程(系统或其他进程唤醒自己)
      • 进程的挂起与激活
        • suspend
        • active
    • 进程同步
      • 基本概念
        • 两种形式的制约关系
          • 间接相互制约关系
            • 互斥——竞争
          • 直接相互制约关系
            • 同步——协作
        • 临界资源
        • 分区
          • 进入区enter section
          • 临界区critical section
          • 退出区exit section
          • 剩余区remainder section
        • 同步机制应遵循的规则
          • 1.空闲让进
          • 2.忙则等待
          • 3.有限等待
          • 4.让权等待
      • 进程同步机制
        • 软件同步机制:都没有解决让权等待,而且部分方法还会产生死锁的情况
        • 硬件同步机制
          • 关中断
          • 利用Test-and-Set指令实现互斥
          • 利用swap指令实现进程互斥
        • 信号量机制
          • 整型信号量
          • 记录型信号量
            • 由于整型信号量没有遵循让权等待原则,记录型允许负数,即阻塞链表
          • AND型信号量
          • 信号量集
            • 理解:AND型号量的wait和signal仅能对信号施以加1或减1操作,意味着每次只能对某类临界资源进行一个单位的申请或释放。当一次需要N个单位时,便要进行N次wait操作,这显然是低效的,甚至会增加死锁的概率。此外,在有些情况下,为确保系统的安全性,当所申请的资源数量低于某一下限值时,还必须进行管制,不予以分配。因此,当进程申请某类临界资源时,在每次分配前,都必须测试资源数量,判断是否大于可分配的下限值,决定是否予以分配
            • 操作
              • Swait(S1,t1,d1…Sn,tn,dn)
              • Ssignal(S1,d1…Sn,dn)
            • 特殊情况
      • 经典进程的同步问题
        • 生产者–消费者问题
        • 哲学家进餐问题
        • 读者–写者问题

    进程通信

    • 进程通信是指进程之间的信息交换,又称低级进程通信
    • 进程通信的类型
      • 共享存储器系统
        • 基于共享数据结构的通信方式
          • 生产者和消费者
        • 基于共享存储区的通信方式
          • 高级通信
      • 管道通信系统(pipe)
        • 高级通信
      • 消息传递系统
        • 高级通信
        • 方式分类
          • 直接通信
          • 间接通信
      • 客服机–服务器系统
    • 消息传递通信的实现方式
      • 直接消息传递系统
      • 信箱通信

    线程的基本概念

    • 线程的引入
      • 线程的引入正是为了简化线程间的通信,以小的开销来提高进程内的并发程度
      • 多线程并发的不足
        • 进程的两个基本属性
          • 一个拥有资源的独立单位,可独立分配系统资源
          • 一个可独立调度和分派的基本单位,PCB
        • 程序并发执行所需付出的时空开销
          • 创建进程
          • 撤销进程
          • 进程切换
        • 进程间通信效率低
        • 将分配资源和调度两个属性分开
      • 线程——作为调度和分派的基本单位
        • 进程是系统资源分配的单位,线程是处理器调度的单位
        • 线程表示进程的一个控制点,可以执行一系列的指令。通常,和应用程序的一个函数相对应
        • 进程分解为线程还可以有效利用多处理器和多核计算机
    • 线程与进程的比较
      • 不同点
        • 调度的基本单位
        • 并发性
      • 相似点
        • 状态:运行、阻塞、就绪
        • 线程具有一定的生命期
        • 进程可创建线程,一个线程可创建另一个子线程
        • 多个线程并发执行时仍然存在互斥与同步
    • 线程的实现
      • 线程的实现方式
        • 内核支持线程KST
        • 用户级线程ULT
        • 组合方式
      • 多线程OS中的进程属性
        • 进程是一个可拥有资源的基本单位
        • 多个线程可并发执行
        • 进程已不是可执行的实体
      • 线程的状态和线程控制块
        • 线程运行的三个状态
          • 执行状态
          • 就绪状态
          • 阻塞状态
        • 线程控制块TCB

    第三章:处理机调度与死锁

    处理机调度算法的目标

    • 处理机调度算法的共同目标
      • 资源利用率:CPU的利用率=CPU有效工作时间/(CPU有效工作时间+CPU空闲等待时间)
      • 公平性
      • 平衡性
      • 策略强制执行
    • 批处理系统的目标
      • 平均周转时间短
      • 系统吞吐量高
      • 处理机利用率高
    • 分时系统的目标
      • 响应时间快
      • 均衡性
    • 实时系统目标
      • 截止时间的保证
      • 可预测性
    • 处理机调度的层次
      • 高级调度(作业调度)
        • 分时系统无需作业调度,因为需要交互
        • 批处理系统需要作业调度
      • 中级调度(和挂起有关)
      • 低级调度(进程调度)
        • 进程调度是最基本的调度,任何操作系统都有进程调度。
        • 低级调度的三个基本机制
          • 排队器
          • 分派器
          • 上下文切换
        • 进程调度方式
          • 非抢占方式
          • 抢占方式
            • 优先权原则
            • 短进程优先原则
            • 时间片原则
        • 进程调度的任务
          • 保存处理机的现场信息
          • 按某种算法选取进程
          • 把处理器分配给进程
        • 进程调度的算法
          • 优先级调度算法
            • 优先级调度算法的类型
              • 非抢占式优先级调度算法
                • 等当前进程执行完以后,再执行另一个优先权最高的进程
                • 这种调度算法主要用于批处理系统中;也可用于某些对实时性要求不严的实时系统中。
              • 抢占式优先级调度算法
                • 不等当前进程结束,直接抢处理机
                • 常用于要求比较严格的实时系统中, 以及对性能要求较高的批处理和分时系统中。
            • 优先级的类型
              • 静态优先级
                • 优先权是在创建进程时确定的,且在进程的整个运行期间保持不变。一般地,优先权是利用某一范围内的一个整数来表示的,例如,07或0255中的某一整数, 又把该整数称为优先数。
                • 可以参考BIOS系统中设置boot的优先级
              • 动态优先级
                • 在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。
          • 轮转调度算法
            • 基本原理:在轮转(RR)法中,系统根据FCFS策略,将所有的就绪进程排成一个就绪队列,并可设置每隔一定时间间隔(如30ms)即产生一次中断,激活系统中的进程调度程序,完成一次调度,将CPU分配给队首进程,令其执行
            • 进程切换时机
              • 时间片未用完,进程完成
              • 时间片到,进程未完成
            • 时间片大小的确定
              • 太小利于短作业,增加系统切换开销
              • 太长就退化为FCFS算法
              • 一般选择: q略大于一次交互所需要的时间,使大多数进程在一个时间片内完成
            • 一般来说,平均周转时间将比SJF长,但是有较好的响应时间
          • 多队列调度算法
          • 多级反馈队列调度算法
            • 调度机制
              • 设置多个就绪队列
              • 每个队列都采用FCFS算法
              • 按照队列优先级调度,在第n队列中采取按时间片轮转的方式运行
            • 调度算法的性能
              • 对于终端型用户,由于作业小,感觉满意
              • 对于短批处理作业用户,周转时间也较小
              • 长批处理作业用户,也能够得到执行
          • 基于公平原则的调度算法
            • 保证调度算法
            • 公平分享调度算法

    作业与作业调度

    • 作业
      • 作业不仅包含程序和数据,还配有一份作业说明书,系统根据说明书对程序的运行进行控制。批处理系统是以作业为单位从外存掉入内存的。
    • 作业控制块JCB
      • 为每个作业设置一个JCB,保存了对作业管理调度的全部信息。是作业存在的标志。
    • 作业步
      • 作业步,每个作业都必须经过若干相对独立,有相互关联的顺序步骤才能得到结果。每一个步骤就是一个作业步。
    • 作业运行的三个阶段
      • 收容阶段
      • 运行阶段
      • 完成阶段
    • 作业运行的三个状态
      • 后备状态
      • 运行状态
      • 完成状态
    • 作业调度的主要任务
      • 接纳多少个作业
      • 接纳哪些作业
    • 先来先服务(first–come first–served,FCFS)调度算法
      • 比较有利于长作业,而不利于短作业。
      • 有利于CPU繁忙的作业,而不利于I/O繁忙的作业。
    • 短作业优先(short job first,SJF)的调度算法
      • 优点
        • 比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间;
        • 提高系统的吞吐量;
      • 缺点
        • 必须预知作业的运行时间
        • 对长作业非常不利,长作业的周转时间会明显地增长
        • 在采用SJF算法时,人–机无法实现交互
        • 该调度算法完全未考虑作业的紧迫程度,故不能保证紧迫性作业能得到及时处理
    • 优先级调度算法(priority–scheduling algorithm,PSA)
    • 高响应比优先调度算法(Highest Response Ratio Next,HRRN)
      • 原理
        • 在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比RP然后选择其值最大的作业投入运行
        • 优先权=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间=1+等待时间/要求服务时间
      • 特点
        • 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而类似于SJF算法,有利于短作业
        • 当要求服务的时间相同时,作业的优先权又决定于其等待时间,因而该算法又类似于FCFS算法
        • 对于长时间的优先级,可以为随等待时间的增加而提高,当等待时间足够长时,也可获得处理机

    实时调度(HRT和SRT任务)

    • 实现实时调度的基本条件
      • 提供必要信息
        • 就绪时间
        • 开始截止时间和完成截止时间
        • 处理时间
        • 资源要求
        • 优先级
      • 系统处理能力强
        • ∑(Ci/Pi)≤1
        • N个处理机:∑(Ci/Pi)≤N
      • 采用抢占式调度机制
      • 具有快速切换机制
        • 对中断的快速响应能力
        • 快速的任务分派能力
    • 实时调度算法的分类
      • 非抢占式调度算法
        • 非抢占式轮转调度算法
        • 非抢占式优先调度算法
      • 抢占式调度算法
        • 基于时钟中断的抢占式优先级调度算法
        • 立即抢占的优先级调度算法
    • 最早截止时间优先EDF(Earliest Deadline First)算法
      • 根据任务的开始截至时间来确定任务的优先级
        • 截至时间越早,优先级越高
      • 非抢占式调度方式用于非周期实时任务
      • 抢占式调度方式用于周期实时任务
    • 最低松弛度优先LLF(Least Laxity First)算法
      • 类似EDF
      • 算法根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度愈高,为该任务所赋予的优先级就愈高, 以使之优先执行。
      • 松弛度例子
        • 例如,一个任务在200ms时必须完成,而它本身所需的运行时间就有100ms,因此,调度程序必须在100 ms之前调度执行,该任务的紧急程度(松弛程度)为100 ms
    • 优先级倒置(Priority inversion problem)
      • 优先级倒置的形成
        • 高优先级进程被低优先级进程延迟或阻塞。
      • 优先级倒置的解决方法
        • 简单的:假如进程P3在进入临界区后P3所占用的处理机就不允许被抢占
        • 实用的:建立在动态优先级继承基础上的

    死锁概述

    • 资源问题
      • 可重用性资源
        • 计算机外设
      • 消耗性资源
        • 数据,消息
      • 可抢占性资源
        • 不引起死锁
        • CPU,内存
      • 不可抢占性资源
        • 光驱,打印机
    • 计算机系统中的死锁
      • 竞争不可抢占性资源引起死锁
      • 竞争可消耗资源引起死锁
      • 进程推进顺序不当引起死锁
    • 死锁的定义,必要条件和处理方法
      • 定义:如果一组进程中的每一个进程都在等待仅由该进程中的其他进程才能引发的事件,那么该组进程是死锁的
      • 产生死锁的必要条件
        • 互斥条件
        • 请求和保存条件
        • 不可抢占条件
        • 循环等待条件
          • 如果每个资源只有一个实例,则环路等待条件是死锁存在的充分必要条件
      • 处理死锁的方法
        • 预防死锁
          • 静态方法,在进程执行前采取的措施,通过设置某些限制条件,去破坏产生死锁的四个条件之一,防止发生死锁。
          • 预防死锁的策略
            • 破坏"请求和保存"条件
              • 第一种协议
                • 所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源
                • 优点:简单,易行,安全
                • 缺点
                  • 资源被严重浪费,严重地恶化了资源的利用率
                  • 使进程经常会发生饥饿现象
              • 第二种协议
                • 它允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的,且已用毕的全部资源,然后再请求新的所需资源
            • 破坏"不可抢占"条件
              • 当一个已经保存了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请
            • 破坏"循环等待"条件
              • 对系统所以资源类型进行线性排序,并赋予不同的序号
              • 例如令输入机的序号为1,打印机序号为2,磁盘机序号为3等。所有进程对资源的请求必须严格按资源序号递增的次序提出。
        • 避免死锁
          • 动态的方法,在进程执行过程中采取的措施,不需事先采取限制措施破坏产生死锁的必要条件,而是在进程申请资源时用某种方法去防止系统进入不安全状态,从而避免发生死锁。如银行家算法
          • 避免死锁的策略
            • 系统安全状态
              • 安全状态
                • 某时刻,对于并发执行的n个进程,若系统能够按照某种顺序如<p1,p2…pn>来为每个进程分配所需资源,直至最大需求,从而使每个进程都可顺利完成,则认为该时刻系统处于安全状态,这样的序列为安全序列
              • 安全状态之例
              • 由安全状态向不安全状态的转换
            • 利用银行家算法避免死锁
              • 含义:每一个新进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将这些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它,否则让进程等待
              • 银行家算法中的数据结构
                • 可用资源向量 Available[m]:m为系统中资源种类数,Available[j]=k表示系统中第j类资源数为k个。
                • 最大需求矩阵 Max[n,m]:n为系统中进程数,Max[i,j]=k表示进程i对j类资源的最大需求数为中k。
                • 分配矩阵 Allocation[n,m]:它定义了系统中每一类资源当前已分配给每一进程资源数, Allocation[i,j] = k表示进程i已分得j类资源的数目为k个。
                • 需求矩阵 Need[n,m]:它表示每个进程尚需的各类资源数,Need[i,j]=k 表示进程i 还需要j类资源k个。Need[i,j]=Max[i,j] - Allocation[i,j]
              • 银行家算法
              • 安全性算法
              • 银行家算法之例
              • 解题
                • 矩阵
                • 列表
        • 检测死锁
          • 死锁的检测与解除
            • 死锁的检测
              • 资源分配图
                • 简化步骤
                  • 选择一个没有阻塞的进程p
                  • 将p移走,包括它的所有请求边和分配边
                  • 重复步骤1,2,直至不能继续下去
              • 死锁定理
                • 若一系列简化以后不能使所有的进程节点都成为孤立节点
              • 检测时机
                • 当进程等待时检测死锁 (其缺点是系统的开销大)
                • 定时检测
                • 系统资源利用率下降时检测死锁
              • 死锁检测中的数据结构
            • 死锁的解除
              • 抢占资源
              • 终止(或撤销)进程
              • 终止进程的方法
                • 终止所有死锁进程
                • 逐个终止进程
                  • 代价最小
                    • 进程的优先级的大小
                    • 进程已执行了多少时间,还需时间
                    • 进程在运行中已经使用资源的多少,还需多少资源
                    • 进程的性质是交互式还是批处理的
              • 付出代价最小的死锁解除算法
                • 是使用一个有效的挂起和解除机构来挂起一些死锁的进程
        • 解除死锁

    第四章:存储器管理

    存储器的层次结构

    • 多层结构的存储系统
      • 存储器的多层结构
        • CPU寄存器
        • 主存
        • 辅存
      • 可执行存储器
        • 寄存器和主存的总称
        • 访问速度快,进程可以在很少的时钟周期内用一条load或store指令完成存取。
    • 主存储器与寄存器
    • 高速缓存和磁盘缓存

    程序的装入和链接

    • 步骤
      • 编译
        • 源程序 ->目标模块(Object modules)--------Compiler
          • 由编译程序对用户源程序进行编译,形成若干个目标模块
      • 链接
        • 一组目标模块 ->装入模块 (Load Module)----------Linker
          • 由链接程序将编译后形成的一组目标模板以及它们所需要的库函数链接在一起,形成一个完整的装入模块
      • 装入
        • 装入模块 ->内存 --------Loader
          • 由装入程序将装入模块装入内存
    • 程序的装入
      • 绝对装入方式
        • 在编译时,如果知道程序将驻留在内存中指定的位置。编译程序将产生绝对地址的目标代码。
      • 可重定位装入方式
        • 在可执行文件中,列出各个需要重定位的地址单元和相对地址值。当用户程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换(一般在装入内存时由软件完成)。
        • 优点:不需硬件支持,可以装入有限多道程序。
        • 缺点:一个程序通常需要占用连续的内存空间,程序装入内存后不能移动。不易实现共享。
      • 动态运行时的装入方式
        • 动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行
        • 优点:
          • OS可以将一个程序分散存放于不连续的内存空间,可以移动程序,有利用实现共享。
          • 能够支持程序执行中产生的地址引用,如指针变量(而不仅是生成可执行文件时的地址引用)。
        • 缺点:需要硬件支持,OS实现较复杂。
        • 它是虚拟存储的基础。
    • 程序的链接
      • 静态链接方式(lib)
      • 装入时动态链接
      • 运行时动态链接(dll)

    连续分配存储管理方式

    • 连续分配
      • 单一连续分配(DOS)
      • 固定分区分配(浪费很多空间)
      • 动态分区分配
    • 地址映射和存储保护措施
      • 基址寄存器:程序的最小物理地址
      • 界限寄存器:程序的逻辑地址范围
      • 物理地址 = 逻辑地址 + 基址
    • 内碎片:占用分区之内未被利用的空间
    • 外碎片:占用分区之间难以利用的空闲分区(通常是小空闲分区)
    • 把内存划分为若干个固定大小的连续分区。固定式分区又称为静态分区。
      • 分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象)。
      • 分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
      • 优点:无外碎片、易实现、开销小。
      • 缺点:
        • 存在内碎片,造成浪费
        • 分区总数固定,限制了并发执行的程序数目。
        • 通用Os很少采用,部分控制系统中采用
    • 动态创建分区:指在作业装入内存时,从可用的内存中划出一块连续的区域分配给它,且分区大小正好等于该作业的大小。可变式分区中分区的大小和分区的个数都是可变的,而且是根据作业的大小和多少动态地划分。
      • 基于顺序搜索的动态分区分配算法
        • 首次适应算法(first fit,FF)
          • 顺序找,找到一个满足的就分配,但是可能存在浪费
          • 这种方法目的在于减少查找时间。
          • 空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序
        • 循环首次适应算法(next fit,NF)
          • 相对上面那种,不是顺序,类似哈希算法中左右交叉排序
          • 空闲分区分布得更均匀,查找开销小
          • 从上次找到的空闲区的下一个空闲区开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。
        • 最佳适应算法(best fit,BF)
          • 找到最合适的,但是大区域的访问次数减少
          • 这种方法能使外碎片尽量小。
          • 空闲分区表(空闲区链)中的空闲分区要按大小从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。
        • 最坏适应算法(worst fit,WF)
          • 相对于最好而言,找最大的区域下手,导致最大的区域可能很少,也造成许多碎片
          • 空闲分区按大小由大到小排序
      • 基于索引搜索的动态分区分配算法
        • 快速适应算法(quick fit)
        • 伙伴系统(buddy system)
        • 哈希算法
      • 动态可重定位分区分配
        • 紧凑
        • 动态重定位
          • 动态运行时装入,地址转化在指令执行时进行,需获得硬件地址变换机制的支持
          • 内存地址=相对地址+起始地址
        • 动态重定位分区分配算法
          • 1、在某个分区被释放后立即进行紧凑,系统总是只有一个连续的分区而无碎片,此法很花费机时。
          • 2、当“请求分配模块”找不到足够大的自由分区分给用户时再进行紧凑,这样紧缩的次数比上种方法少得多,但管理复杂。采用此法的动态重定位分区分配算法框图如下:
      • 优点:没有内碎片。
      • 缺点:外碎片。

    对换(了解)

    • 系统把所有的作业放在外存,每次只调用一个作业进入内存运行,当时间片用完时,将它调至外存后备队列上等待,在从后备队列调入另一个作业进入内存运行。

    基本分页存储管理方式

    • 分页存储管理的基本方式
      • 页面
        • 将一个进程的逻辑地址空间分成若干个大小相等的片
      • 页框(frame)
        • 内存空间分成与页面相同大小的存储块
      • 由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”
      • 地址结构
        • 页号P+位移量W(0-31)
      • 页表
        • 在分页系统中,允许将进程的各个页离散地存储在内存在内存的任一物理块中,为保证进程仍然能够正确地运行,即能在内存中找到每一个页面所对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表
        • 页表的作用是实现从页面号到物理块号的地址映射
    • 地址变换机构
      • 基本的地址变换机构
        • 要访问两次内存
        • 页表大都驻留在内存中
        • 为了实现地址变换功能,在系统中设置页表寄存器(PTR),用来存放页表的始址和页表的长度。
        • 在进程未执行时,每个进程对应的页表的始址和长度存放在进程的PCB中,当该进程被调度时,就将它们装入页表寄存器。
      • 具有快表的地址变换机构
        • 提高了效率,此处会有计算题
        • 如果页表存放在内存中,则每次访问内存时,都要先访问内存中的页表,然后根据所形成的物理地址再访问内存。这样CPU存一个数据必须访问两次内存,从而使计算机的处理速度降低了1/2。
        • 为了提高地址变换的速度,在地址变换机构中增设了一个具有并行查询功能的特殊的高速缓冲存储器,称为“联想存储器”或“快表”,用以存放当前访问的那些页表项。
        • 地址变换过程为:
          • 1、CPU给出有效地址
          • 2、地址变换机构自动地将页号送入高速缓存,确定所需要的页是否在快表中。
          • 3、若是,则直接读出该页所对应的物理块号,送入物理地址寄存器;
          • 4、若快表中未找到对应的页表项,则需再访问内存中的页表
          • 5、找到后,把从页表中读出的页表项存入快表中的一个寄存器单元中,以取代一个旧的页表项。
    • 两级和多级页表
      • 主要是有的时候页表太多了,要化简
      • 格式:外层页号P1+外层页内地址P2+页内地址d
      • 基本方法:将页表进行分页,每个页面的大小与内存物理块的大小相同,并为它们进行编号,可以离散地将各个页面分别存放在不同的物理块中。
    • 反置页表
      • 反置页表为每一个物理块(页框)设置一个页表项,并按物理块排序,其内容则是页号和其所属进程的标识。
    • 优点:
      • 没有外碎片,每个内碎片不超过页大小。
      • 一个程序不必连续存放。
      • 便于改变程序占用空间的大小。即随着程序运行而动态生成的数据增多,地址空间可相应增长。
    • 缺点:程序全部装入内存。

    分段存储管理方式

    • 引入
      • 方便编程
      • 信息共享
      • 动态增长
      • 动态链接
    • 在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段是一组完整的逻辑信息,每个段都有自己的名字,都是从零开始编址的一段连续的地址空间,各段长度是不等的。
    • 内存空间被动态的划分为若干个长度不相同的区域,称为物理段,每个物理段由起始地址和长度确定
    • 分段系统的基本原理
      • 分段
        • 格式:段号+段内地址
      • 段表
        • 段表实现了从逻辑段到物理内存区的映射。
      • 地址变换机构
    • 和分页的区别
      • 页是信息的物理单位
      • 页的大小固定且由系统固定
      • 分页的用户程序地址空间是一维的
      • 通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度。
      • 分页是系统管理的需要,分段是用户应用的需要。一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
    • 信息共享
      • 这是分段最重要的优点
    • 段页式存储管理方式
      • 基本原理
        • 格式:段号(S)+段内页号(P)+页内地址(W)
      • 地址变换过程
        • 需要三次访问过程
      • 在段页式系统中,为了获得一条指令或数据,需三次访问内存:第一次访问内存中的段表,从中取得页表始址;第二次访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正根据所得的物理地址取出指令或数据。

    第五章:虚拟存储器

    常规存储管理方式的特征

    • 一次性
    • 驻留性

    局部性原理

    • 程序在执行时将呈现出局部性特征,即在一较短的时间内,程序的执行仅局限于某个部分,相应地,它所访问的存储空间也局限于某个区域
    • 时间局限性
      • 如果程序中的某条指令一旦执行, 则不久以后该指令可能再次执行;如果某数据被访问过, 则不久以后该数据可能再次被访问。产生时间局限性的典型原因,是由于在程序中存在着大量的循环操作
    • 空间局限性
      • 一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,其典型情况便是程序的顺序执行。

    定义

    • 指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统

    优点

    • 大程序:可在较小的可用内存中执行较大的用户程序;
    • 大的用户空间:提供给用户可用的虚拟内存空间通常大于物理内存(real memory)
    • 并发:可在内存中容纳更多程序并发执行;
    • 易于开发:不必影响编程时的程序结构
    • 以CPU时间和外存空间换取昂贵内存空间,这是操作系统中的资源转换技术

    特征

    • 离散性
      • 指在内存分配时采用离散的分配方式,它是虚拟存储器的实现的基础
    • 多次性
      • 指一个作业被分成多次调入内存运行,即在作业运行时没有必要将其全部装入,只须将当前要运行的那部分程序和数据装入内存即可。多次性是虚拟存储器最重要的特征
    • 对换性
      • 指允许在作业的运行过程中在内存和外存的对换区之间换进、换出。
    • 虚拟性
      • 指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。

    虚拟存储器的实现方式

    • 请求分页存储管理方式
      • 硬件
        • 请求页表机制
          • 格式:页号+物理块号+状态位P+访问字段A+修改位M+外存地址
        • 缺页中断机构
        • 地址变换机构(过程图很关键)
      • 请求分页中的内存分配
        • 最小物理块数
          • 即能保证进程正常运行所需的最小物理块数
        • 内存分配策略
          • 固定分配局部置换(国王的大儿子)
          • 可变分配全局置换(国王的二儿子)
          • 可变分配局部置换(国王的小儿子)
      • 物理块分配算法
        • 平均分配算法
        • 按比例分配算法
        • 考虑优先权的分配算法
      • 页面调入策略
        • 系统应在何时调入所需页面
          • 预调页策略(不能实现)
          • 请求调页策略(需要才给)
        • 系统应该从何处调入这些页面
          • 对换区
          • 文件区
        • 页面调入过程
        • 缺页率(出计算题)
    • 请求分段系统
      • 硬件
        • 请求分段的段表机构
        • 缺段中断机构
        • 地址变换机构

    页面置换算法

    • 抖动的概念
      • 即刚被换出的页很快又要被访问,需要将它重新调入,此时又需要再选一页调出
    • 最佳置换算法(需要预知后面进程,所以不能实现)
    • 先进先出页面置换算法(FIFO)
      • 选择在内存中驻留时间最久的页面予以淘汰
    • 最近最久未使用置换算法(LRU)Recently
      • 寄存器支持
      • 特殊的栈结构
    • 最少使用置换算法(LFU)Frequently
    • clock置换算法(对访问位A的判断)
      • 改进型——增加对修改位M思维判断
    • 页面缓冲算法(PBA,page buffering algorithm)
      • 空闲页面链表
      • 修改页面链表

    第六章:输入输出系统

    I/O系统的功能,模型和接口

    • I/O系统管理的对象是I/O设备和相应的设备控制器。
    • I/O系统的基本功能
      • 隐藏物理设备的细节
      • 与设备的无关性
      • 提高处理机和I/O设备的利用率
      • 对I/O设备进行控制
      • 确保对设备的正确共享
      • 错误处理
    • I/O软件的层次结构
      • 用户层I/O软件
      • 设备独立性软件
      • 设备驱动程序(厂家开发)
      • 中断处理程序
      • 硬件
    • I/O系统的分层
      • 中断处理程序
      • 设备驱动程序
      • 设备独立性软件
    • I/O系统接口
      • 块设备接口
        • 指以数据块为单位来组织和传送数据信息的设备
        • 典型的块设备是磁盘、光盘
        • 块设备的基本特征
          • ①传输速率较高,通常每秒钟为几兆位;
          • ②它是可寻址的,即可随机地读/写任意一块;
          • ③磁盘设备的I/O采用DMA方式。
      • 流设备接口
        • 又称字符设备指以单个字符为单位来传送数据信息的设备
        • 这类设备一般用于数据的输入和输出,有交互式终端、打印机
        • 字符设备的基本特征
          • ①传输速率较低;
          • ②不可寻址,即不能指定输入时的源地址或输出时的目标地址;
          • ③字符设备的I/O常采用中断驱动方式。
      • 网络通信接口
        • 提供网络接入功能,使计算机能通过网络与其他计算机进行通信或上网浏览。

    I/O设备和设备控制器

    • 分类
      • 使用特性分
        • 存储设备
        • I/O设备
      • 传输速率分
        • 低速设备(几字节——几百字节)
          • 典型的设备有键盘、鼠标、语音的输入
        • 中速设备(数千——数万字节)
          • 典型的设备有行式打印机、激光打印机
        • 高速设备(数十万——千兆字节)
          • 典型的设备有磁带机、磁盘机、光盘机
    • 设备并不是直接与CPU进行通信,而是与设备控制器通信。在设备与设备控制器之间应该有一个接口。
      • 数据信号:控制器 ← 设备 ← 控制器
        • 传送数据信号,输入、输出bit
      • 控制信号: 控制器 → 设备
        • 执行读、写操作的信号
      • 状态信号:设备当前使用状态
    • 设备控制器
      • 主要功能:控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换
      • 基本功能
        • 接收和识别命令
          • 控制寄存器、命令译码器
        • 数据交换
          • 实现CPU与控制器,控制器与设备间的数据交换
        • 标识和报告设备的状态
        • 地址识别
          • 配置地址译码器,识别不同的设备
        • 数据缓冲区
        • 差错控制
      • 设备控制器的组成
        • 设备控制器与处理机(CPU)的接口
          • 实现CPU与设备控制器之间的通信
        • 设备控制器与设备的接口
          • 控制器可连接多个设备
        • I/O逻辑
          • 实现对设备的控制
          • CPU利用该逻辑向控制器发送I/O命令
          • 命令、地址译码
    • 内存映像I/O
      • 驱动程序将抽象I/O命令转换出的一系列具体的命令,参数等数据装入设备控制器的相应寄存器,由控制器来执行这些命令,具体实施对I/O设备的操作
    • I/O通道
      • 目的:建立独立的I/O操作(组织, 管理和结束),使由CPU处理的I/O工作转由通道完成(解放CPU,实现并行)

      • 什么是I/O通道?

        • 是一种特殊的处理机,具有通过执行通道程序完成I/O操作的指令
        • 特点:指令单一(局限于与I/O操作相关的指令),与CPU共享内存
      • 基本过程:

        • CPU向通道发出I/O指令->通道接收指令->从内存取出通道程序处理I/O->向CPU发出中断
      • 通道类型

        • 字节多路通道
          • 低中速连接子通道时间片轮转方式共享主通道
          • 字节多路通道不适于连接高速设备,这推动了按数组方式进行数据传送的数组选择通道的形成。
        • 数组选择通道
          • 这种通道可以连接多台高速设备,但只含有一个分配型子通道,在一段时间内只能执行一道通道程序, 控制一台设备进行数据传送, 直至该设备传送完毕释放该通道。这种通道的利用率很低。
        • 数组多路通道
          • 含有多个非分配型子通道,前两种通道的组合,通道利用率较好
      • 瓶颈问题

        • 原因;通道不足
        • 解决办法:增加设备到主机间的通路,而不增加通道(结果类似RS触发器)

    中断机构和中断处理程序

    • 中断
      • 分类
        • 中断(外部触发)
          • 对外部I/O设备发出的中断信号的响应
        • 陷入(内部原因:除0)
          • 由CPU内部事件引起的中断
      • 中断向量表(类比51单片机)
        • 中断程序的入口地址表
      • 中断优先级
        • 对紧急程度不同的中断处理方式
      • 对多中断源的处理方式
        • 屏蔽中断
        • 嵌套中断
    • 中断处理程序
      • 测定是否有未响应的中断信号
      • 保护被中断进程的CPU环境
      • 转入相应的设备处理程序
      • 中断处理
      • 恢复CPU 的现场并退出中断

    设备驱动程序

    • 是I/O进程与设备控制器之间的通信程序,又由于它常以进程的形式存在,故以后就简称为设备驱动进程
    • 主要任务是接受来自它上一层的与设备无关软件的抽象请求,并执行这个请求。
    • 功能
        1. 接收由I/O进程发来的命令和参数, 并将命令中的抽象要求转换为具体要求。例如,将磁盘块号转换为磁盘的盘面、 磁道号及扇区号。
        1. 检查用户I/O请求的合法性,了解I/O设备的状态,传递有关参数,设置设备的工作方式。
        1. 发出I/O命令,如果设备空闲,便立即启动I/O设备去完成指定的I/O操作;如果设备处于忙碌状态,则将请求者的请求块挂在设备队列上等待。
        1. 及时响应由控制器或通道发来的中断请求,并根据其中断类型调用相应的中断处理程序进行处理。
        1. 对于设置有通道的计算机系统,驱动程序还应能够根据用户的I/O请求,自动地构成通道程序。
    • 设备驱动程序的处理过程
      • 将用户和上层软件对设备控制的抽象要求转换成对设备的具体要求,如对抽象要求的盘块号转换为磁盘的盘面、磁道及扇区。
      • 检查I/O请求的合理性。
      • 读出和检查设备的状态,确保设备处于就绪态。
      • 传送必要的参数,如传送的字节数,数据在主存的首址等。
      • 工作方式的设置。
      • 启动I/O设备,并检查启动是否成功,如成功则将控制返回给I/O控制系统,在I/O设备忙于传送数据时,该用户进程把自己阻塞,直至中断到来才将它唤醒,而CPU可干别的事。
    • 对I/O设备的控制方式
      • I/O控制的宗旨
        • 减少CPU对I/O控制的干预
        • 充分利用CPU完成数据处理工作
      • I/O 控制方式
        • 轮询的可编程I/O方式
        • 中断驱动I/O方式
        • DMA控制方式
        • I/O通道控制方式
    • DMA控制器组成
      • 主机与DMA控制器的接口
      • DMA控制器与块设备的接口
      • I/O控制逻辑

    与设备无关的I/O软件

    • 基本概念
      • 含义: 应用程序独立于具体使用的物理设备。
      • 驱动程序是一个与硬件(或设备)紧密相关的软件。为实现设备独立性,须在驱动程序上设置一层软件,称为设备独立性软件。
      • 设备独立性(Device Independence)的优点
        • 以物理设备名使用设备
        • 引入了逻辑设备名
        • 逻辑设备名称到物理设备名称的转换(易于实现I/O重定向)
    • 与设备无关的软件
      • 设备驱动程序的统一接口
      • 缓存管理
      • 差错控制
      • 对独立设备的分配与回收
      • 独立于设备的逻辑数据块
    • 设备分配中的数据结构
      • 设备控制表DCT
      • 控制器控制表COCT
      • 通道控制表CHCT
      • 显然,在有通道的系统中,一个进程只有获得了通道,控制器和所需设备三者之后,才具备了进行I/O操作的物理条件
      • 系统设备表SDT
      • 逻辑设备表LUT
      • 分配的流程,从资源多的到资源紧张的:LUT->SDT->DCT->COCT->CHCT
      • 在申请设备的过程中,根据用户请求的I/O设备的逻辑名,查找逻辑设备和物理设备的映射表;以物理设备为索引,查找SDT,找到该设备所连接的DCT;继续查找与该设备连接的COCT和CHCT,就找到了一条通路。

    用户层的I/O软件

    • 系统调用与库函数
      • OS向用户提供的所有功能,用户进程都必须通过系统调用来获取
      • 在C语言以及UNIX系统中,系统调用(如read)与各系统调用所使用的库函数(如read)之间几乎是一一对应的。而微软的叫Win32API
    • 假脱机系统(spooling)
      • spooling技术是对脱机输入/输出系统的模拟
      • 主要组成
        • 输入/输出井
        • 输入/输出缓冲区
        • 输入/输出进程
        • 井管理程序
      • 特点(体现操作系统的虚拟性)
        • 提高了I/O的速度
          • 对数据所进行的I/O操作,已从对低速设备演变为对输入井或输出井中的数据存取。
        • 将独占设备改造为共享设备
          • 实际分给用户进程的不是打印设备,而是共享输出井中的存储区域
        • 实现了虚拟设备功能
          • 将独占设备变成多台独占的虚拟设备。

    缓冲区管理

    • 缓冲的引入(原因)
      • 缓和CPU与I/O设备间速度不匹配的矛盾
      • 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
      • 提高CPU和I/O设备之间的并行性
      • 解决数据粒度不匹配的问题
    • 单缓冲区
      • 即在CPU计算的时候,将数据数据输入到缓冲区(大小取决与T和C的大小)
    • 双缓冲区
      • 即允许CPU连续工作(T不断)
    • 环形缓冲区(专为生产者和消费者打造)
      • 组成
        • 多个缓冲区
        • 多个指针
      • 使用
        • Getbuf过程
        • Releasebuf过程
      • 同步问题
    • 缓冲池(理解为更大的缓冲区)
      • 组成
        • 空白缓冲队列(emq)
          • 由空缓冲区链接而成F(emq),L(emq)分别指向该队列首尾缓冲区
        • 输入队列(inq)
          • 由装满输入数据的缓冲区链接而成F(inq),L(inq)分别指向该队列首尾缓冲区
        • 输出队列(outq)
          • 由装满输出数据的缓冲区链接而成F(outq), L(outq)分别指向该队列首尾缓冲
      • Getbuf和Putbuf过程
        • 收容:缓冲池接收外界数据
        • 提取:外界从缓冲池获得数据
      • 缓冲区工作方式(从缓冲区的角度来看)
        • 收容输入
        • 提取输入
        • 收容输出
        • 提取输出

    磁盘存储器的性能和调度

    • 数据的组织和格式
    • 磁盘的类型
      • 固定头磁盘(贵)
      • 移动头磁盘
    • 磁盘访问的时间(关键)
      • 寻道时间Ts=m*n+s
      • 旋转延迟时间Tr
      • 传输时间Tt=b/rN
      • 总时间Ta=Ts+1/2r+b/rN
    • 磁盘的调度算法(掌握图表)
      • 先来先服务(FCFS)
        • 优点:公平,简单
        • 缺点:可能导致某些进程的请求长期得不到满足
      • 最短寻道时间优先(SSTF)
        • 说明:要求访问的磁道和当前磁头所在的磁道距离最近,以使每次的寻道时间最短
      • 扫描算法(SCAN)
        • 扫描算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁道当前的移动方向
        • 联想电梯的运行
        • 可防止低优先级进程出现“饥饿”的现象
      • 循环扫描算法(CSCAN)
        • 算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描
      • NStepScan算法
        • N步SCAN算法是将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS算法依次这些子队列。
      • FSCAN算法
        • 是Nstepscan算法的简化,将磁盘请求队列分成两个子队列

    第七章:文件管理

    数据项

    • 基本数据项
    • 组合数据项

    记录

    • 记录是一组相关数据项的集合,用于描述一个对象在某个方面的属性

    文件

    • 文件类型
    • 文件长度
    • 文件的物理位置
    • 文件的建立时间

    文件操作

    • 创建文件
    • 删除文件
    • 读文件
    • 写文件
    • 设置文件读写的位置

    文件的逻辑结构

    • 顺序文件
    • 记录寻址
    • 索引文件
    • 索引顺序文件
    • 直接文件和哈希文件

    文件目录

    • 文件控制块(FCB)
      • 文件名+inode(属性)
    • 简单的文件目录
      • 单级文件目录
        • 查找慢
        • 不允许重名
        • 不便于实现文件共享
      • 两级文件目录
        • 提高检索速度,从M*N到M+N
    • 树形结构目录
      • 路径名
        • “…”是父目录
        • “/”是根目录
        • 区别绝对路径和相对路径(…/…/…/1/2/3/)

    文件共享

    • 有向无循环图(DAG)
    • 利用符号链接实现文件共享
      • 实际上就是“快捷方式”

    文件保护

    操作系统思维导图图片

    思维导图下载地址

    github:希望大家可以给一个star,谢谢支持

    码云:希望大家可以给一个star,谢谢支持

    展开全文
  • 曾几何时,接到公司命令,要求负责的产品兼容国产数据库和操作系统,估计是中美贸易战波及的,吭吭唧唧做完了,做个总结吧,通过这个项目,感觉国产数据库和操作系统也不差,虽然底层是oracle和linux,但是至少做到...

          曾几何时,接到公司命令,要求负责的产品兼容国产数据库和操作系统,估计是中美贸易战波及的,吭吭唧唧做完了,做个总结吧,通过这个项目,感觉国产数据库和操作系统也不差,虽然底层是oracle和linux,但是至少做到了无缝兼容,估计也是一种技术策略,既做到了国产化,也大大降低了使用者的学习成本,大规模推广做了基础。另外感觉达梦的数据库迁移工具用起来挺爽,可视化傻瓜式做的比较好,就是系统稳定性和性能还需要提高,社区和网上资料太少,需要加强。言归正传,讲讲碰到的几个坑及解决方法吧。

     一、达梦数据库

          达梦数据库底层是oracle数据库,如果本身已经是oracle数据库的话,语法基本相同,只是程序需要改造点,需要引入达梦jdbc驱动,如果使用SYSDBA的话,程序模型层需要加模式名。如下改造:

        1.先在代码src目录下新建一个lib目录,将DmDialect-for-hibernate5.0.jar,DmJdbcDriver18.jar拷入该目录

        2.应用项目中pom.xml中增加上面的两个依赖包

    <dependency>
      <groupId>com.dm</groupId>
      <artifactId>DmJdbcDriver18</artifactId>
      <version>1.8</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/lib/DmJdbcDriver18.jar</systemPath>
    </dependency>
    <dependency>
      <groupId>com.dm</groupId>
      <artifactId>DmDialect</artifactId>
      <version>5.0</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/lib/DmDialect-for-hibernate5.0.jar</systemPath>
    </dependency>
    
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <skip>true</skip>
      </configuration>
    </plugin>

        3.配置文件配置数据库链接

    #DMJDBC 驱动类
    spring.datasource.driverClassName=dm.jdbc.driver.DmDriver
    #DMURL 连接
    spring.datasource.url=jdbc:dm://127.0.0.1:5236/AUTHUSER
    #DM用户名
    spring.datasource.username=SYSDBA
    #DM用户口令
    spring.datasource.password=SYSDBA
    
    ##DMHibernate方言
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DmDialect

        4.如果用户使用SYSDBA,模型层需要加模式名

          

       5.调用存储过程,封装了个通用方法

    /**
     * DM数据库 调用存储过程公共方法
     *
     * @param param         调用存储过程的参数
     * @param procedureName 对应数据库的存储过程名
     * @param dataSource    auth,cdr的连接
     * @return
     */
    public static List getDmOutReturnList(Map<String, String> param, String procedureName, DataSource dataSource) {
        ResultSet rs = null;
        List list = new ArrayList();
        //拼接入参
        String sqlStr = getSqlStr(param, procedureName);
        try {
            //创建数据库连接
            Connection conn = dataSource.getConnection();
            //创建连接状态
            Statement state = conn.createStatement();
            //执行sql
            CallableStatement cstmt = conn.prepareCall(sqlStr);
            for (Map.Entry<String, String> entry : param.entrySet()) {
                cstmt.setString(entry.getKey(), entry.getValue());
            }
            cstmt.registerOutParameter(param.size() + 1, OracleTypes.CURSOR);
            cstmt.execute();
            rs = (ResultSet) cstmt.getObject(param.size() + 1);
            list = convertList(rs);
    
            //关闭ResultSet
            rs.close();
            //关闭连接状态
            state.close();
            //释放(归还)连接
            conn.close();
    
            return list;
        } catch (Exception e) {
            LOGGER.error("调用存储过程报错:{}", procedureName, e);
        }
    
        return list;
    }
    
    /**
     * ResultSet 转 List
     *
     * @param rs ResultSet
     * @return List
     */
    private static List convertList(ResultSet rs) {
        List list = new ArrayList();
        try {
            ResultSetMetaData md = rs.getMetaData();
            int columnCount = md.getColumnCount();
            while (rs.next()) {
                Map rowData = new HashMap();
                for (int i = 1; i <= columnCount; i++) {
                    rowData.put(md.getColumnName(i), rs.getObject(i));
                }
                list.add(rowData);
            }
            return list;
        } catch (Exception e) {
            LOGGER.error("转换出错:{}", e.getMessage());
        }
        return list;
    }
    
    /**
     * 拼接入参
     *
     * @param param         存储入参
     * @param procedureName 存储名
     * @return sql
     */
    private static String getSqlStr(Map<String, String> param, String procedureName) {
        List list = new ArrayList();
        for (int i = 0; i < param.size() + 1; i++) {
            list.add("?");
        }
        return "call " + procedureName + "(" + StringUtils.join(list.toArray(), ",") + ")";
    
    }

    二、使用操作系统

          本次是平生第一次使用linux操作系统,在同事的帮助下入了门,然后一顿百度,也基本能完成一般的项目部署工作,收获挺多,也对Linux起了兴趣,年底赚钱了准备买个电脑,明年的学习计划就有Linux了,毕竟往后玩大数据,这是必备技能。关于国产操作系统这次工作也没过多说的,待会直接贴网址。就一个坑,部署上去的jar包配置文件放到项目外会出现失效问题,后来把它放到里面了就好了。

         

         

     

    参考资料:达梦:

                       https://blog.csdn.net/wllpeter/article/details/79486426

                      https://blog.csdn.net/jay_1989/article/details/51075200

                     linux:

                   https://www.cnblogs.com/wanwen/p/7495578.html

                    https://www.runoob.com/linux/linux-comm-chmod.html   

                    https://blog.csdn.net/bingxuesiyang/article/details/88417465 

    展开全文
  • 操作系统总结之文件管理

    万次阅读 多人点赞 2018-07-07 16:11:32
    一:主要内容: 概述 文件的逻辑结构 ( 顺序文件,索引文件,索引顺序文件,直接文件和哈希文件 ) 外存分配方式 ...如何高效的对文件进行管理是操作系统实现的目标。 二:文件和文件系统 ...

    一:主要内容:

    1. 概述
    2. 文件的逻辑结构 ( 顺序文件,索引文件,索引顺序文件,直接文件和哈希文件 )
    3. 外存分配方式
    4. 文件目录管理
    5. 文件存储空间管理
    6. 文件系统的可靠性和安全性
    7. 文件系统的数据一致性控制

    文件管理,由于系统的内存有限并且不能长期保存,故平时总是把它们以文件的形式存放在外存中,需要时再将它们调入内存。如何高效的对文件进行管理是操作系统实现的目标。

    二:文件和文件系统

    2.1

      现代OS几乎都是通过文件系统来组织和管理在计算机中所存储的大量程序和数据的。文件系统的管理功能是通过把它所管理的程序和数据组织成一系列文件的方法来实现的。而文件则是指具有文件名的若干相关元素的集合。元素通常是记录,而记录是一组有意义的数据项的集合。可以把数据组成分为数据项、记录、文件。
      
      ①数据项,数据项是最低级数据组织形式。分为基本数据项(用于描述一个对象某种属性的字符集,是数据组织中可以明明的最小逻辑数据单位,即原子数据,又称为数据元素或字段)和组合数据项(由若干个基本数据项组成)

      ② 记录,是一组相关数据项的集合,用于描述一个对象在某方面的属性,为了能够唯一标识一个记录,需要在一个记录的各个数据项中确定一个或几个数据项,把他们的集合称为关键字,关键字是能够唯一标识一个记录的数据项。

      ③ 文件,文件是具有文件名的一组相关元素的集合,分为有结构文件(又称记录式文件:文件由一组相似记录组成 。如报考某学校的所有考生的报考信息记录)和无结构文件(又称流式文件:被看成是一个字符流。比如一个二进制文件或字符文件)。有结构文件由若干个相关记录组成,无结构文件则被看成一个字符流。文件是文件系统的最大数据单位。文件应该具有自己的属性,包括文件类型(如源文件、目标文件、可执行文件等),文件长度(文件的当前长度,也可能是最大允许长度),文件的物理位置(指示文件在哪一个设备上及在该设备的哪个位置的指针),文件的建立时间(文件最后一次修改时间)。
      
       一个文件可对应若干个记录,一个记录可对应若干个数据项。

      文件系统管理的对象有:文件(作为文件管理的直接对象),目录(为了方便用户对文件的存取和检索,在文件系统中配置目录,每个目录项中,必须含有文件名及该文件所在的物理地址,对目录的组织和管理是方便和提高对文件存取速度的关键),磁盘(文件和目录必定占用存储空间,对这部分空间的有效管理,不仅能提高外存的利用率,而且能提高对文件的存取速度)。
      

    2.2 文件的属性、基本操作以及文件的打开和关闭

    2.2.1 文件的属性

    ①名称:文件名称唯一,以容易读取的形式保存。

    ②标识符:标识文件系统内文件的唯一标签,通常为数字,它是对人不可读的一种内部名称。

    ③类型:被支持不同类型的文件系统所使用。

    ④位置:指向设备和设备上文件的指针。

    ⑤大小:文件当前大小(用字节、字或块表示),也可包含文件允许的最大值。

    ⑥保护:对文件进行保护的访问控制信息。

    ⑦时间、日期和用户标识:文件创建、上次修改和上次访问的相关信息,用于保护、 安全和跟踪文件的使用。

    2.2.2 文件的基本橾作

      ① 创建文件,在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项,目录项中应该记录新文件的文件名及其在外存的地址等属性。

      ② 删除文件,当已不再需要某文件时,可将其从文件系统中删除,在删除时,系统应先从目录中找到要删除文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。

      ③ 读文件,读文件时,须在相应系统调用中给出文件名和应读入的内存目标地址。此时,系统要查找目录,找到指定目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件进行读/写。

      ④ 写文件,写文件时,须在相应系统调用中给出文件名和其在内存源地址。此时,系统要查找目录,找到指定目录项,从再利用目录中的写指针进行写操作。

      ⑤ 截断文件,如果一个文件的内容已经陈旧而需要全部更新时,一种方法是将此文件删除,再重新创建一个新文件,但如果文件名和属性均无改变,则可采取截断文件的方法,其将原有的文件长度设置为0,放弃原有文件的内容。

      ⑥ 设置文件的读/写位置,用于设置文件读/写指针的位置,以便每次读/写文件时,不需要从始端开始而是从所设置的位置开始操作。可以改顺序存取为随机存取。

    2.2.3 文件的打开和关闭

    来源:当前OS所提供的大多数对文件的操作,其过程大致都是这样两步:首先,检索文件目录来找到指定文件的属性及其在外存上的位置;然后,对文件实施相应的操作,如读/写文件等,当用户要求对一个文件实施多次读/写或其他操作时,每次都要从检索目录开始,为了避免多次重复地检索目录,在大多数OS中都引入了打开这一文件系统调用,当用户第一次请求对某文件系统进行操作时,先利用open系统调用将该文件打开。

    打开是指系统将指名文件的属性(包括该文件在外存上的物理位置)从外存拷贝到内存打开文件表的一个表目中,并将该表目的编号(索引号)返回给用户,以后,当用户再要求对该文件进行操作时,便可利用系统所返回的索引号向系统提出操作请求,系统便可直接利用该索引号到打开文件表中去查找,从而避免了对该文件的再次检索,如果用户不再需要对该文件实施操作,可利用关闭系统调用来关闭此文件,OS将会把该文件从打开文件表中的表目上删除掉。

    三:文件的逻辑结构

    • 文件的逻辑结构:从用户角度看文件的组织形式
    • 文件的物理结构:文件在外存上的存储组织形式

    3.1 文件的逻辑结构类型

    无结构文件(流式文件)
    

    无结构文件是最简单的文件组织形式。无结构文件将数据按顺序组织成记录并积累保存,它是有序相关信息项的集合,以字节(Byte)为单位。由于无结构文件没有结构,因而对记录的访问只能通过穷举搜索的方式,故这种文件形式对大多数应用不适用。但字符流的无结构文件管理简单,用户可以方便地对其进行操作。所以,那些对基本信息单位操作不多的文件较适于釆用字符流的无结构方式,如源程序、可执行文件、库函数等。

    有结构文件(记录式文件)
    

    按记录的组织形式可以分为:

    3.1.1 顺序文件

    文件是记录的集合,文件中的记录可以是任意顺序的,因此,它可以按照各种不同的顺序进行排列,一般地,可归纳为以下两种情况。

      ① 串结构,个记录之间的顺序与关键字无关,通常按照时间先后排序,最先存入的记录作为第一个记录,其次,为第二个记录,以此类推。

      ② 顺序结构,文件中所有记录按照关键字排列,可以按照关键词长度从大到小排列。顺序结构的检索效率更高。

      顺序文件的最佳应用场合是在对诸记录进行批量存取时,即每次要读或写一大批记录时,此时,对顺序文件的存取效率是所有逻辑文件中最高的,此外,只有顺序文件才能存储在磁带上,并能有效工作。但是想要增加或删除一个文件比较困难。

    提问:为什么增加或删除一个文件比较困难?

    答:类似于数组的缺点。

    3.1.2 索引文件

      对于定长记录文件,可以方便的实现顺序存取和直接存取,然而,对于变长记录就很难实现。为了解决变长记录检索问题,可为变长记录文件建立一张索引表,对主文件中的每个记录,在索引表中设有一个相应的表项,用于记录该记录的长度 L 及指向该记录的指针(指向该记录在逻辑地址空间的首址),由于索引表按记录键排序的,因此,索引表本身就是一个定长记录的顺序文件。从而可以方便实现直接存取。
    这里写图片描述

    索引表与文件一一对应
    

      由于是按照关键字进行建立的索引,所以在对索引文件进行检索时,首先根据用户(程序)提供的关键字,并利用折半查找检索索引表,从中找到相应的表项,再利用该表项给出的指向记录的指针值,去访问所需的记录。每当要向索引文件中增加一个新纪录时,便须对索引表进行修改。索引表的问题在于除了有主文件外,还需要配置一张索引表,每个记录需要有一个索引项,因此提高了存储费用。优点就是拥有较快的检索速度,适合用于对及时性要求比较高的场合。

    3.1.3 索引顺序文件

    其有效克服了变长记录不便于直接存取的缺点,而且所付出的代价也不算太大,它是顺序文件和索引文件相结合的产物,它将顺序文件中的所有记录分为若干个组,为顺序文件建立一张索引表,在索引表中为每组中的第一个记录建立一个索引项,其中含有该记录的键值和指向记录的指针。

      这里写图片描述
    在对索引顺序文件进行检索时,首先利用用户(程序)所提供的关键字及某种查找算法去检索索引表,找到该记录组中的第一个记录的表项,从中得到该记录组第一个记录在主文件中的位置,然后,再利用顺序查找法去查找主文件,从中找出所要求的记录。

    3.1.4 直接文件

      对于直接文件,则根据给定的记录键值,直接获得指定记录的物理地址,换言之,记录键值本身就决定了记录的物理地址,这种由记录键值到记录物理地址的转换被称为键值转换。

    3.1.5 哈希(Hash)文件

      利用Hash函数可将记录键值转换为相应记录的地址,为了能实现文件存储空间的动态分配,通常由Hash函数所求得的并非是相应记录的地址,而是指向一目录表相应表目的指针,该表目的内容指向相应记录所在的物理块。
      这里写图片描述
    emmmmmmm , 这个所讲的意思并不是很懂~_~

    四:文件目录管理

    为了能够对文件实施有效的管理,必须对它们加以妥善组织,这主要是通过文件目录实现的,文件目录也是一种数据结构,用于标识系统中的文件及其物理地址,供检索时使用,对目录的管理要求如下:

      ① 实现按名存取,即用户只须向系统提供所需访问的文件的名字,便能够快速准确地找到指定文件在外存上的存储位置,这是目录管理中最基本的功能。

      ② 提高对目录检索速度,通过合理地组织目录结构的方法,可加快对目录的检索速度,从而提高对文件的存取速度。

      ③ 文件共享,在多用户系统中,应该允许用户共享一个文件。

      ④ 允许文件重名,系统应允许不同用户对不同文件采用相同的名字,以便用户按照自己的习惯给文件命名和使用文件。

    4.1 文件控制块

      为了能对文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为文件控制块FCB,文件管理程序可借助于文件控制块中的信息,对文件施加各种操作,文件与文件控制块一一对应,而人们把文件控制块的有序集合称为文件目录,一个文件控制块就是一个文件目录项。通常,一个文件目录也可被看成是一个文件,称为目录文件。
      
        文件控制块包含基本信息、存取控制信息、使用信息。
        
      ① 基本信息,包括文件名(标识一个文件的符号名,在每个系统中,每个文件都有唯一的名字,用户利用该名字进行存取);文件物理位置(指文件在外存上的存储位置,包括存放文件的设备名、文件在外村上的起始盘块号、指示文件所占用的盘块数或字节数的文件长度);文件逻辑结构(指示文件是流式文件还是记录式文件、记录数,文件是定长还是变长记录);文件物理结构(指示文件是顺序文件、链式文件还是索引文件)

      ② 存取控制信息,包括文件主的存取权限、核准用户的存取权限及一般用户的存取权限。

      ③ 使用信息,包括文件的建立日期和时间、文件上一次修改的日期和时间及当前使用信息(这项信息包括当前已打开该文件的进程数、是否被其他进程锁住、文件在内存中是否已被修改但尚未拷贝到盘上)

    4.2 索引结点

      文件目录通常是存放在磁盘上的,当文件很多时,文件目录可能要占用大量的盘块,在查找的过程中,先将存放目录文件的第一个盘块中的目录调入内存,然后把用户所给定的文件名和目录项中的文件名逐一对比。若未找到指定文件,则再将下一个盘块中的目录项调入内存。在检索目录文件时,只用到了文件名,仅当找到一个目录项(即其中的文件名与指定要查找的文件名相匹配)时,才需要从该目录项中读出该文件的物理地址,而其他一些对该文件进行描述的信息,在检索目录时一概不用,显然,这些信息在检索目录时不需要调入内存。为此,在有的系统中,如UNIX系统,便采用了把文件名和文件描述信息分开的方法,亦即,使文件描述信息单独形成一个称为索引结点的数据结构,简称为i结点,在文件目录中的每个目录项由文件名和指向该文件所对应的i结点的指针所构成。
      这里写图片描述

    每个文件都有唯一的磁盘索引结点(磁盘索引结点信息与文件名等信息一起构成了FCB)
    

    4.3 目录结构

      目录结构的组织,关系到文件系统的存取速度,也关系到文件的共享性和安全性,目前常用的目录结构形式有单级目录、两级目录、多级目录。
      ① 单级目录结构,在整个系统中只建立一张目录表,每个文件占一个目录项,目录项中含文件名、文件扩展名、文件长度、文件类型、文件物理地址、状态位(表示目录项是否空闲)等。每当要建立一个新文件时,必须先检查所有的目录项,以保证新文件名在目录中是唯一的,然后再从目录表中找到一个空白目录项,填入新文件的文件名及其他说明信息,并置状态为1,删除文件时,先从目录中找到该文件的目录项,回收该文件所占用的存储空间,然后再清除该目录项。单级目录的有点是简单并且能够实现目录管理的基本功能-按名存取,但是查找速度慢(查找一个目录项要花费较多的时间),不允许重名(在一个目录表中的所有文件,都不能与另一个文件有相同的名字,这是难以避免的),不便于实现文件共享(每一个用户都有自己的名字空间或命名习惯,因此,应该允许不同用户使用不同的文件名来访问同一个文件)
      这里写图片描述
        ② 两级目录结构,为每个用户建立一个单独的用户文件目录UFD(User File Directory),这些文件目录具有相似的结构,由用户所有文件的文件控制块组成。此外,系统中还有一个主文件目录MFD(Master File Directory)在主文件目录中,每个用户目录文件都占有一个目录项,其目录项包括用户名和指向用户目录文件的指针。
        这里写图片描述
      两级目录结构克服了单级目录的缺点,具有如下优点:提高了检索目录的速度(如果在主目录中有n个子目录,每个用户目录最多为m个目录项,则为查找一指定的目录项,最多只需要检索n+m个目录项)。在不同的用户目录中,可以使用相同的文件名(只要在用户自己的UFD中,每个文件名都是唯一的,不同用户可以有文件名相同的文件)。不同用户还可使用不同的文件名来访问系统中同一个共享文件。但在多个用户需要合作完成一个大任务时,不便于用户之间共享文件。
       ③ 多级目录结构,对于大型文件系统,通常采用三级或三级以上的目录结构,以提高对目录的检索速度和文件系统的性能。多级目录结构又称为树形目录结构,主目录被称为根目录,把数据文件称为树叶,其他的目录均作为树的结点。 
        
       这里写图片描述
       
    说明:方框代表目录文件,圆圈代表数据文件
    1. 应该允许在一个目录文件中的目录项既是作为目录文件的FCB,又是数据文件的FCB,这一信息可用目录项中的一位来指示。如用户A总目录中,目录项A是目录文件FCB,而目录项B和D则是数据文件的FCB。
    2. 系统中的每个文件都有唯一的路径名
    3. 绝对路径与相对路径

    4.4 目录查询技术

      当用户要访问一个已存在的文件时,系统首先利用用户提供的文件名对目录进行查询,找出该文件的文件控制块或对应索引结点,然后,根据FCB或索引结点中所记录的文件物理地址(盘块号),换算出文件在磁盘上的物理位置,最后,再通过磁盘驱动程序,将所需文件读入内存。目前常用的方式有线性检索法和Hash方法。
      ① 线性检索法,其又称为顺序检索法,在树形目录中,用户提供的文件名是由多个文件分量名组成的路径名,此时须对多级目录进行查找,假定用户给定的文件路径名为/usr/ast/mbox,则查找过程如下。  
      这里写图片描述
      
    1. 读入第一个文件分量名usr,用它与根目录文件(或当前目录文件)中各目录项中的文件名顺序地进行比较
    2. 得到匹配项的索引结点号是6
    3. 从6号索引结点中得到usr目录文件放在132号盘块中,将该盘块内容读入内存
    4. 再将路径名中的第二个分量名ast读入,用它与放在132号盘块中的第二级目录文件中各目录项的文件名顺序进行比较
    5. 依次类推

      ② Hash方法,系统利用用户提供的文件名并将它转换为文件目录的索引值,再利用该索引值到目录中去查找,这将提高检索速度。

    五:文件共享(略)

    六:文件保护(略)

    参考文献:

    https://www.cnblogs.com/tangshiguang/p/6746235.html
    https://blog.csdn.net/xiaoyangsavvy/article/details/78260777

    展开全文
  • ROS 操作系统总结

    千次阅读 2014-01-23 11:08:04
    ROS 操作系统 是起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,2008年之后就由Willow Garage来进行推动。 ROS 是开源的,是用于...
  • 自学考试操作系统总结

    千次阅读 2017-04-16 21:55:04
    匆匆忙忙,10天时间,看书+练习完成了操作系统的学习,今天考完了,总的来说感觉还可以。 操作系统是一门特别好的学科,为什么好呢? 一、基础知识 该学科设计到的基础知识比较简单,全面 二、技术知识 围绕要...
  • IBM3650 M3安装操作系统总结

    千次阅读 2013-08-06 08:54:40
    电脑系统装了很多,给服务器装系统还是第一次。折腾了两天总算是装上了,其实也很简单。 1.需要一张引导盘(针对IBM服务器,别的服务器就不知道了)ibm service guid。可以到IBM官网下载 地址:...
  • (需要Word版笔记的请私信留邮箱) AIX是IBM小型机专用系统: AIX系统中使用的shell是ksh ...操作:遵循vi编辑器界面下的操作方 Esc +k 组合键 向回返 Esc +j 组合键 向下返 Esc +h 组合键 光标向左 Es...
  • 伙伴系统 哈希算法 利用哈希快速查找的优点,以及空间可利用空闲区的分布规则简历哈希函数,构造一张以空闲分区大小为关键字的哈希表,记录空闲分区的链表表头指针。程序分配的时候根据所需大小,通过哈希...
  • https://blog.csdn.net/Caoyang_He/article/details/80741238
  • 操作系统教程总结

    万次阅读 多人点赞 2016-12-19 18:31:55
    操作系统虚拟机为用户提供了一种简单、清晰、易用、高效的计算机模型。虚拟机的每种资源都是物力资源通过复用、虚拟和抽象而得到的产物。 虚拟机提供进程运行的逻辑计算环境。
  • 操作系统基础知识复习总结

    万次阅读 多人点赞 2018-06-11 13:55:23
    操作系统 操作系统概述 操作系统作用 存储管理 处理机管理 设备管理 文件管理 用户接口 操作系统的定义 是管理和控制计算机系统中各种硬件和软件资源、合理地组织计算机工作流程的...
  • 计算机操作系统核心知识点总结&面试笔试要点

    万次阅读 多人点赞 2019-08-14 22:00:41
    操作系统之基础篇 一、 操作系统概述  1. 操作系统的演进   无操作系统:人工操作,用户独占,CPU等待人工操作,资源利用率很低。   批处理系统:批量输入任务,无需等待人工操作,资源利用率提升,提出多道...
  • 操作系统原理总结

    万次阅读 多人点赞 2018-07-10 23:15:47
    转载:https://blog.csdn.net/yanglingwell/article/details/53745758 操作系统原理总结made by @杨领well (yanglingwell@sina.com)一、基础知识点1. 操作系统的资源管理技术资源管理解决物理资源数量不足和合理...
  • 操作系统(第四版)期末复习总结(上)

    万次阅读 多人点赞 2018-07-01 16:26:38
    马上要考操作系统了,第一章操作系统引论1、操作系统是什么?操作系统为用户完成所有“硬件相关,应用无关“的工作,以给用户方便、高效、安全的使用环境1.1、定义: 操作系统是一个大型的程序系统,它负责计算机的...
  • 操作系统课程总结

    万次阅读 2018-07-01 19:12:16
    用户在需要使用操作系统服务时, 调用系统调用,陷入内核(不同的 任务,所对应调用的系统调用号也 不同,在调用系统调用陷入内核时, 会同时向OS内核传入一个系统调用 号i) 进入内核后,根据i查找系统调用 表,...
  • 操作系统知识点总结(第一章 操作系统引论)

    千次阅读 多人点赞 2019-03-07 20:36:22
    操作系统的分类:批处理操作系统,分时操作系统,实时操作系统,嵌入式操作系统,个人计算机操作系统,网络操作系统,分布式操作系统 操作系统的发展过程: 人工操作方式:硬件非常昂贵,没有操作系统。 批处理...
  • 操作系统概论总结

    千次阅读 热门讨论 2014-04-06 17:34:01
    什么是操作系统操作系统是一个系统软件,他是一些程序模块的集合。他们能有效的组织和管理计算机系统中的软件硬件资源,合理的组织计算家工作流程,控制进程的执行,并向用户提供各种服务功能,使用户能灵活方便...
  • 操作系统思维导图总结

    千次阅读 多人点赞 2021-01-09 10:26:40
    操作系统详细知识点和习题见我这篇博客操作系统期末总结 第一章 1.1操作系统的概念、功能 1.2操作系统的特征 1.3操作系统的发展与分类 1.4操作系统的运行机制 1.5中断和异常 1.6系统调用 1.7操作系统的体系...
  • 操作系统面试知识点总结

    万次阅读 多人点赞 2016-07-12 10:20:39
    操作系统面试知识点总结
  • 操作系统实训总结

    千次阅读 2016-07-25 16:46:22
    操作系统实训总结 放假回到家,看到这几个周实训做的工作,以及散乱的文档与资料,觉得应该整理一下,面对操作系统实训,其实感悟是很多的,我常说操作系统是精神层面的,非应用层面,学好操作系统,再来应用,便有...
  • 计算机操作系统知识点总结

    千次阅读 多人点赞 2019-01-26 13:25:15
    在大三学习操作系统时所做的总结,上传到论坛以备日后复习使用。 第一章操作系统概述 1)计算机软件是指程序和与程序相关的文档的集合 2)按功能可把软件分为“系统软件”和“应用软件”两部分 系统软件:操作系统...
  • 手机操作系统学习总结

    千次阅读 2016-07-30 16:52:00
    手机操作系统 手机操作系统主要应用在智能手机上。主流的智能手机有Google Android和苹果的iOS等。智能手机与非智能手机都支持JAVA,智能机与非智能机的区别主要看能否基于系统平台的功能扩展,非JAVA应用平台,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,115,402
精华内容 446,160
关键字:

操作系统总结