免费智能真题库 > 历年试卷 > 软件设计师 > 2019年下半年 软件设计师 下午试卷 案例
  第5题      
  知识点:   类图   观察   设计模式   文件管理

 
【说明】
文件管理系统中定义了类OfficeDoc和DocExplorer。当类OfficeDoe发生变化时,类DocExplorer的所有对象都要更新其自身的状态。现采用观察者(Observer) 设计模式来实现该需求,所设计的类图如图5-1所示。




 
问题:5.1   阅读上面说明和C++代码,将应填入(n) 处的字句写在答题纸的对应栏内。
 
 
 

   知识点讲解    
   · 类图    · 观察    · 设计模式    · 文件管理
 
       类图
        类图(Class Diagram)展现了一组对象、接口、协作及其之间的关系。在面向对象系统的建模中所建立的最常见的图就是类图。
        类图给出了系统的静态设计视图,包含主动类的类图给出了系统的静态进程视图。作为模型管理视图还可以含有包或子系统,二者都用于把模型元素聚集成更大的组块。类图用于对系统的静态视图建模。这种视图主要支持系统的功能需求,即系统要提供给最终用户的服务。当对系统的静态设计建模时,通常以下述3种方式之一使用类图:对系统的词汇建模;对简单的协作建模;对逻辑数据库模式建模。
        作为静态视图的类图可以包含依赖、关联、泛化、组合、实现关系以及注解和约束等。
        (1)依赖关系是两个事物之间的语义关系,其中一个事物发生变化会影响另一个事物的语义。
        (2)关联关系是一种结构关系,它描述了一组对象之间的链接关系。其中有一种特殊类型的关联关系,即聚集关系,它描述了整体与部分的结构关系。
        (3)泛化关系是一种一般—特殊关系,利用这种关系,子类可以共享父类的结构和行为。
        (4)实现关系是类之间的语义关系,其中的一个类制订了另一个类保证执行的契约。实现关系用于两种情况:在接口和实现它们的类或构件之间;在用例和它们的协作之间。
        (5)组合是聚集关系的变种,表示元素间更强的组合关系。各种关系图例如下图所示。
        
        各种关系图例
 
       观察
        观察是指直接察看个人在各自的环境中如何执行工作(或任务)和实施流程。当产品使用者难以或不愿清晰说明他们的需求时,就更需要通过观察来了解他们的工作细节。观察,也称为“工作跟踪”,通常由观察者从外部来观看业务专家如何执行工作。也可以由“参与观察者”来观察,他通过实际执行一个流程或程序,来体验该流程或程序是如何实施的,以便挖掘出隐藏的需求。
 
       设计模式
        “每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。设计模式的核心在于提供了相关问题的解决方案。
        设计模式一般有如下4个要素。
        (1)模式名称(pattern name)。模式名称应具有实际的含义,能反映模式的适用性和意图。
        (2)问题(problem)。描述了应该在何时使用模式,解释了设计问题和问题存在的前因后果。可能描述了特定的设计问题,如怎样用对象表示算法等;也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
        (3)解决方案(solution)。描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。解决方案并不描述一个特定的具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
        (4)效果(consequences)。描述了模式应用的效果及使用模式应权衡的问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
        设计模式确定了所包含的类和实例,它们的角色、协作方式以及职责分配。每一个设计模式都集中于一个特定的面向对象设计问题或设计要点,描述了什么时候使用它,在另一些设计约束条件下是否还能使用,以及使用的效果和如何取舍。按照设计模式的目的可以分为创建型、结构型和行为型三大类,如下表所示。
        
        设计模式分类
               创建型设计模式
               创建型模式与对象的创建有关,抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
               创建型模式包括面向类和面向对象两种。Factory Method(工厂方法)定义一个用于创建对象的接口,让子类决定实例化哪一个类。Abstract Factory(抽象工厂)提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。Builder(生成器)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Factory Method使一个类的实例化延迟到其子类。Prototype(原型)用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。Singleton(单例)模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
               下面以抽象工厂模式和单例模式为例进行说明。
                      Abstract Factory(抽象工厂)
                      (1)意图。提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
                      (2)结构。抽象工厂模式的结构如下图所示。
                      
                      抽象工厂模式结构图
                      其中:
                      .AbstractFactory声明一个创建抽象产品对象的操作接口。
                      .ConcreteFactory实现创建具体产品对象的操作。
                      .AbstractProduct为一类产品对象声明一个接口。
                      .ConcreteProduct定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口。
                      .Client仅使用由AbstractFactory和AbstractProduct类声明的接口。
                      (3)适用性。Abstract Factory模式适用于:
                      .一个系统要独立于它的产品的创建、组合和表示时。
                      .一个系统要由多个产品系列中的一个来配置时。
                      .当要强调一系列相关的产品对象的设计以便进行联合使用时。
                      .当提供一个产品类库,只想显示它们的接口而不是实现时。
                      Singleton(单例)
                      (1)意图。保证一个类仅有一个实例,并提供一个访问它的全局访问点。
                      (2)结构。单例模式的结构如下图所示。
                      
                      单例模式结构图
                      其中:Singleton指定一个Instance操作,允许客户访问它的唯一实例,Instance是一个类操作;可能负责创建它自己的唯一实例。
                      (3)适用性。Singleton模式适用于:
                      .当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
                      .当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。
               结构型设计模式
               结构型模式处理类或对象的组合,涉及如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果这个类包含了所有父类的性质。这一模式尤其有助于多个独立开发的类库协同工作。其中一个例子是类形式的Adapter(适配器)模式。一般来说,适配器使得一个接口与其他接口兼容,从而给出了多个不同接口的统一抽象。为此,类Adapter对一个adaptee类进行私有继承。这样,适配器就可以用adaptee的接口表示它的接口。对象Adapter依赖于对象组合。
               下面以适配器模式和代理模式为例进行说明。
                      Adapter(适配器)模式
                      (1)意图。将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
                      
                      类适配器结构图
                      (2)结构。类适配器使用多重继承对一个接口与另一个接口进行匹配,其结构如上图所示。对象适配器依赖于对象组合,其结构如下图所示。
                      
                      对象适配器结构图
                      其中:
                      .Target定义Client使用的与特定领域相关的接口。
                      .Client与符合Target接口的对象协同。
                      .Adaptee定义一个已经存在的接口,这个接口需要适配。
                      .Adapter对Adaptee的接口与Target接口进行适配。
                      (3)适用性。Adapter模式适用于:
                      .想使用一个已经存在的类,而它的接口不符合要求。
                      .想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
                      .(仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
                      Proxy(代理)模式
                      (1)意图。为其他对象提供一种代理以控制对这个对象的访问。
                      (2)结构。代理模式的结构如下图所示。
                      
                      代理模式结构图
                      其中:
                      .Proxy保存一个引用使得代理可以访问实体;提供一个与Subject的接口相同的接口,使代理可以用来代替实体;控制对实体的存取,并可能负责创建和删除它;其他功能依赖于代理的类型:Remote Proxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求;Virtual Proxy可以缓存实体的附加信息,以便延迟对它的访问;Protection Proxy检查调用者是否具有实现一个请求所必需的访问权限。
                      .Subject定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
                      .RealSubject定义Proxy所代表的实体。
                      (3)适用性。Proxy模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候,常见情况有:
                      .远程代理(Remote Proxy)为一个对象在不同地址空间提供局部代表。
                      .虚代理(Virtual Proxy)根据需要创建开销很大的对象。
                      .保护代理(Protection Proxy)控制对原始对象的访问,用于对象应该有不同的访问权限的时候。
                      .智能引用(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放;当第一次引用一个持久对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
                      结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。因为可以在运行时刻改变对象组合关系,所以对象组合方式具有更大的灵活性,而这种机制用静态类组合是不可能实现的。
                      Composite(组合)模式将对象组合成树型结构以表示“部分—整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。它描述了如何构造一个类层次式结构,这一结构由两种类型的对象所对应的类构成。其中的组合对象使得用户可以组合基元对象以及其他的组合对象,从而形成任意复杂的结构。proxy(代理)模式为其他对象提供一种代理以控制对这个对象的访问,其中,proxy对象作为其他对象的一个方便的替代或占位符。它的使用可以有多种形式,例如可以在局部空间中代表一个远程地址空间中的对象,也可以表示一个要求被加载的较大的对象,还可以用来保护对敏感对象的访问。proxy模式还提供了对对象的一些特有性质的一定程度上的间接访问,从而可以限制、增强或修改这些性质。Flyweight(享元)模式运用共享技术有效地支持大量细粒度的对象,为了共享对象定义了一个结构。至少有两个原因要求对象共享:效率和一致性。Flyweight的对象共享机制主要强调对象的空间效率。使用很多对象的应用必须考虑每一个对象的开销。使用对象共享而不是进行对象复制,可以节省大量的空间资源。但是,仅当这些对象没有定义与上下文相关的状态时,它们才可以被共享。Flyweight的对象没有这样的状态。任何执行任务时需要的其他一些信息仅当需要时才传递过去。由于不存在与上下文相关的状态,因此Flyweight对象可以被自由地共享。
                      Facade(外观)模式为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加容易使用。该模式描述了如何用单个对象表示整个子系统。模式中的facade用来表示一组对象,facade的职责是将消息转发给它所表示的对象。Bridge(桥接)模式将对象的抽象和其实现分离,从而可以独立地改变它们。
                      Decorator(装饰)模式描述了如何动态地为对象添加一些额外的职责。该模式采用递归方式组合对象,从而允许添加任意多的对象职责。例如,一个包含用户界面组件的Decorator对象可以将边框或阴影这样的装饰添加到该组件中,或者它可以将窗口滚动和缩放这样的功能添加到组件中。可以将一个Decorator对象嵌套在另外一个对象中,就可以很简单地增加两个装饰,添加其他的装饰也是如此。因此,每个Decorator对象必须与其组件的接口兼容并且保证将消息传递给它。Decorator模式在转发一条信息之前或之后都可以完成它的工作(例如绘制组件的边框)。许多结构型模式在某种程度上具有相关性。
               行为型设计模式
               行为模式对类或对象怎样交互和怎样分配职责进行描述,涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。
               行为类模式使用继承机制在类间分派行为。本章包括两个这样的模式,其中Template Method(模板方法)较为简单和常用。Template Method是一个算法的抽象定义,它逐步地定义该算法,每一步调用一个抽象操作或一个原语操作,子类定义抽象操作以具体实现该算法。另一种行为类模式是Interpreter(解释器)模式,它将一个文法表示为一个类层次,并实现一个解释器作为这些类的实例上的一个操作。
               行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。这里一个重要的问题是对等的对象。
               如何互相了解对方。对等对象可以保持显式的对对方的引用,但那会增加它们的耦合度。在极端情况下,每一个对象都要了解所有其他的对象。Mediator(中介者)模式用一个中介对象来封装一系列的对象交互,在对等对象间引入一个mediator对象以避免这种情况的出现。mediator提供了松耦合所需的间接性。
               Chain of Responsibility(责任链)使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。Chain of Responsibility模式提供更松的耦合,让用户通过一条候选对象链隐式地向一个对象发送请求。根据运行时刻情况任一候选者都可以响应相应的请求。候选者的数目是任意的,可以在运行时刻决定哪些候选者参与到链中。
               Observer(观察者)模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。典型的Observer的例子是Smalltalk中的模型/视图/控制器,其中一旦模型的状态发生变化,模型的所有视图都会得到通知。
               其他的行为对象模式常将行为封装在一个对象中并将请求指派给它。Strategy(策略)模式将算法封装在对象中,这样可以方便地指定和改变一个对象所使用的算法。Command(命令)模式将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。Memento(备忘录)模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在以后可将该对象恢复到原先保存的状态。State(状态)模式封装一个对象的状态,使得对象在其内部状态改变时可改变它的行为,对象看起来似乎修改了它的类。Visitor(访问者)模式表示一个作用于某对象结构中的各元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操作。Visitor模式封装分布于多个类之间的行为。Iterator(迭代器)模式提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。Iterator模式抽象了访问和遍历一个集合中的对象的方式。
               下面以中介者模式和观察者模式为例进行说明。
                      Mediator(中介者)
                      (1)意图。用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
                      (2)结构。中介者模式的结构图如下图所示。
                      
                      中介者模式结构图
                      其中:
                      .Mediator(中介者)定义一个接口用于各同事(Colleague)对象通信。
                      .ConcreteMediator(具体中介者)通过协调各同事对象实现协作行为;了解并维护它的各个同事。
                      .Colleague class(同事类)知道它的中介者对象;每一个同事类对象在需要与其他同事通信的时候与它的中介者通信。
                      (3)适用性。Mediator模式适用于:
                      .一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
                      .一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
                      .想定制一个分布在多个类中的行为,而又不想生成太多的子类。
                      Observer(观察者)
                      (1)意图。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
                      (2)结构。观察者模式的结构图如下图所示。
                      
                      观察者模式结构图
                      其中:
                      .Subject(目标)知道它的观察者,可以有任意多个观察者观察同一个目标;提供注册和删除观察者对象的接口。
                      .Observer(观察者)为那些在目标发生改变时需获得通知的对象定义一个更新接口。
                      .ConcreteSubject(具体目标)将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。
                      .ConcreteObserver(具体观察者)维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与目标的状态保持一致;实现Observer的更新接口,以使自身状态与目标的状态保持一致。
                      (3)适用性。Observer模式适用于:
                      .当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
                      .当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。
                      .当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即不希望这些对象是紧耦合的。
 
       文件管理
        文件系统是操作系统中负责存取和管理信息的模块,它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护,并为用户提供一整套方便有效的文件使用和操作方法。对于用户来说,可按自己的愿望并遵循文件系统的规则来定义文件信息的逻辑结构,由文件系统提供“按名存取”来实现对用户文件信息的存储和检索。可见,使用者在处理他的信息时,只需关心所执行的文件操作及文件的逻辑结构,而不必涉及存储结构。
               文件与文件系统
                      文件的基本概念
                      文件是由文件名字标识的一组相关信息的集合。文件名是字母或数字组成的字母数字串,它的格式和长度因系统而异。
                      组成文件的信息可以是各式各样的:一个源程序、一批数据、各类语言的编译程序都可以各自组成一个文件。文件可以按各种方法进行分类,如按用途可分成:系统文件、库文件和用户文件;按保护级别可分成:只读文件、读写文件和不保护文件;按信息流向可分成:输入文件、输出文件和输入输出文件等。
                      文件的命名
                      文件是一个抽象机制,它提供了一种把文件保存在磁盘上而且便于以后读取的方法,用户不必了解信息存储的方法、位置以及存储设备实际运作方式等细节。在这一抽象机制中最重要的是文件命名,当一个进程创建一个文件时必须给出文件名字,以后这个文件将独立于进程存在直到它被显式地删除;当其他进程要使用这一文件时必须显式地指出该文件名字;操作系统也将根据该文件名字对文件进行保护。
                      文件类型
                      在现代操作系统中,对于文件乃至设备的访问都是基于文件进行的,例如,打印一批数据就是向打印机设备文件写数据,从键盘接收一批数据就是从键盘设备文件读数据。操作系统一般支持以下几种不同类型的文件:
                      (1)普通文件:即前面所讨论的存储在外存储设备上的数据文件。
                      (2)目录文件:管理和实现文件系统的系统文件。
                      (3)块设备文件:用于磁盘、光盘或磁带等块设备的I/O。
                      (4)字符设备文件:用于终端、打印机等字符设备的I/O。
                      一般来说,普通文件包括ASCII文件或者二进制文件,ASCII文件由多行正文组成,在DOS、Windows等系统中每一行以回车换行结束,整个文件以CTRL+Z结束;在Unix等系统中每一行以换行结束,整个文件以CTRL+D结束。ASCII文件的最大优点是可以原样显示和打印,也可以用通常的文本编辑器进行编辑。另一种正规文件是二进制文件,它往往有一定的内部结构,组织成字节的流,如可执行文件是指令和数据的流,记录式文件是逻辑记录的流。
                      文件系统
                      对文件系统本身来说,必须采用特定的数据结构和有效算法,实现文件的逻辑结构到存储结构的映射,实现对文件存储空间和用户信息的管理,提供多种存取方法。
                      所以,文件系统面向用户的功能是:
                      (1)文件的按名存取。
                      (2)文件目录建立和维护。
                      (3)实现从逻辑文件到物理文件的转换。
                      (4)文件存储空间的分配和管理。
                      (5)提供合适的文件存取方法。
                      (6)实现文件的共享、保护和保密。
                      (7)提供一组可供用户使用的文件操作。
                      为了实现这些功能,操作系统必须考虑文件目录的建立和维护、存储空间的分配和回收、数据的保密和监护、监督用户存取和修改文件的权限、在不同存储介质上信息的表示方式、信息的编址方法、信息的存储次序、以及怎样检索用户信息等问题。
                      文件的存取
                      从用户使用观点来看,关心的是数据的逻辑结构,即记录及其逻辑关系,数据独立于物理环境;从系统实现观点来看,数据则被文件系统按照某种规则排列和存放到物理存储介质上。那么,输入的数据如何存储?处理的数据如何检索?数据的逻辑结构和数据物理结构之间怎样接口?谁来完成数据的成组和分解操作?这些都是存取方法的任务。存取方法是操作系统为用户程序提供的使用文件的技术和手段。
                      (1)顺序存取。
                      按记录顺序进行读/写操作的存取方法称为顺序存取。固定长记录的顺序存取是十分简单的。读操作总是读出下一次要读出的文件的下一个记录,同时,自动让文件记录读指针推进,以指向下一次要读出的记录位置。如果文件是可读可写的。再设置一个文件记录指针,它总指向下一次要写入记录的存放位置,执行写操作时,将一个记录写到文件未端。允许对这种文件进行前跳或后退N(整数)个记录的操作。顺序存取主要用于磁带文件,但也适用于磁盘上的顺序文件。
                      (2)直接存取。
                      很多应用场合要求以任意次序直接读写某个记录,例如,航空订票系统,把特定航班的所有信息用航班号作标识,存放在某物理块中,用户预订某航班时,需要直接将该航班的信息取出。直接存取方法便适合于这类应用,它通常用于磁盘文件。
                      (3)索引存取。
                      第三种类型的存取是基于索引文件的索引存取方法。由于文件中的记录不按它在文件中的位置,而按它的记录键来编址,所以,用户提供给操作系统记录键后就可查找到所需记录。通常记录按记录键的某种顺序存放,例如,按代表健的字母先后次序来排序。对于这种文件,除可采用按键存取外,也可以采用顺序存取或直接存取的方法。信息块的地址都可以通过查找记录键而换算出来。实际的系统中,大都采用多级索引,以加速记录查找过程。
               文件目录
                      文件目录的概念
                      文件系统怎样实现文件的“按名存取”?如何查找文件存储器中的指定文件?如何有效地管理用户文件和系统文件?文件目录便是用于这些操作的重要手段。文件系统的基本功能之一就是负责文件目录的建立、维护和检索,要求编排的目录便于查找、防止冲突,目录的检索方便迅速。
                      有了文件目录后,就可实现文件的“按名存取”。每一个文件在文件目录中登记一项。文件目录项一般应该包括以下内容:
                      (1)有关文件存取控制的信息。如文件名、用户名、授权者存取权限:文件类型和文件属性,如读写文件、执行文件、只读文件等。
                      (2)有关文件结构的信息。文件的逻辑结构,如记录类型、记录个数、记录长度、成组因子数等。文件的物理结构,如记录存放相对位置或文件第一块的物理块号,也可指出文件索引的所在位置。
                      (3)有关文件管理的信息。如文件建立日期、文件最近修改日期、访问日期、文件保留期限、记账信息等。
                      有了文件目录后,就可实现文件的“按名存取”。当用户要求存取某个文件时,系统查找目录项并比较文件名就可找到所寻文件的目录项。然后,通过目录项指出的文件名就可找到所寻文件的目录项,然后通过目录项指出文件的文件信息相对位置或文件信息首块物理位置等就能依次存取文件信息。
                      一级目录结构
                      如下图所示,最简单的文件目录是一级目录结构,在操作系统中构造一张线性表,与每个文件有关的属性占用一个目录项就成了一级目录结构。单用户微型机操作系统CP/M的软盘文件便采用这一结构,每个磁盘上设置一张一级文件目录表,不同磁盘驱动器上的文件目录互不相关。文件目录表由长度为32字节的目录项组成,目录项0称目录头,记录有关文件目录表的信息,其他每个目录项又称文件控制块。文件目录中列出了盘上全部文件的有关信息。CP/M操作系统中文件目录项包括:盘号、文件名、扩展名、文件范围、记录数、存放位置等。
                      
                      一级目录结构示意图
                      一级文件目录结构存在若干缺点:一是重名问题,它要求文件名和文件之间有一一对应关系,但要在多用户的系统中,由于都使用同一文件目录,一旦文件名用重,就会出现混淆而无法实现按名存取。如果人为地限制文件名命名规则,对用户来说又极不方便;二是难以实现文件共享,如果允许不同用户使用不同文件名来共享同一个文件,这在一级目录中是很难实现的,为了解决上述问题,操作系统往往采用二级目录结构,使得每个用户有各自独立的文件目录。
                      二级目录结构
                      在二级目录中,第一级为主文件目录,它用于管理所有用户文件目录,它的目录项登记了系统接受的用户的名字及该用户文件目录的地址。第二级为用户文件目录,它为该用户的每个文件保存一登记栏,其内容与一级目录的目录项相同。每一用户只允许查看自己的文件目录。下图是二级文件目录结构示意。当一个新用户作业进入系统执行时,系统为其在主文件目录中开辟一个区域的地址填入主文件目录中的该用户名所在项。当用户需要访问某个文件时系统根据用户名从主文件目录中找出该用户的文件目录的物理位置,其余的工作与一级文件目录类似。
                      
                      二级目录结构示意图
                      采用二级目录管理文件时,因为任何文件的存取都通过主文件目录,于是可以检查访问文件者的存取权限,避免一个用户未经授权就存取另一个用户的文件,使用户文件的私有性得到保证,实现了对文件的保密和保护。
                      树型目录结构
                      二级目录的推广形成了多级目录。每一级目录可以是下一级目录的说明,也可以是文件的说明,从而,形成了层次关系。多级目录结构通常采用树型结构,它是一棵倒立的有根的树,树根是根目录;从根向下,每一个树枝是一个子目录;而树叶是文件。树型多级目录有许多优点:较好地反映现实世界中具有层次关系的数据集合和较确切地反映系统内部文件的分支结构;不同文件可以重名,只要它们不在同一末端的子目录中,易于规定不同层次或子树中文件的不同存取权限,便于文件的保护、保密和共享等。
               文件的结构和组织
               文件的组织是指文件中信息的配置和构造方式,通常应该从文件的逻辑结构和组织及文件的物理结构和组织两方面加以考虑。文件的逻辑结构和组织是从用户观点出发,研究用户概念中的抽象的信息组织方式,这是用户能观察到的,可加以处理的数据集合。由于数据可独立于物理环境加以构造,所以称为逻辑结构。文件的物理结构和组织是指逻辑文件在物理存储空间中的存放方法和组织关系。这时,文件被看作物理文件,即相关物理块的集合。文件的存储结构涉及块的划分、记录的排列、索引的组织、信息的搜索等许多问题。
                      文件的逻辑结构
                      文件的逻辑结构分两种形式:一种是流式文件,另一种是记录式文件。
                      (1)流式文件。
                      流式文件指文件内的数据不再组成记录,只是依次的一串信息集合,也可以看成是只有一个记录的记录式文件。这种文件常常按长度来读取所需信息,也可以用插入的特殊字符作为分界。为了简化系统,大多数现代操作系统对用户仅仅提供流式文件,记录式文件往往由高级语言或简单的数据库管理系统提供。
                      (2)记录式文件。
                      记录式文件内包含若干逻辑记录,逻辑记录是文件中按信息在逻辑上的独立含意划分的一个信息单位,记录在文件中的排列可能有顺序关系,但除此以外,记录与记录之间不存在其他关系。在这一点上,文件有别于数据库。根据记录的长度可分为定长和不定长两类:定长记录(格式F)指一个记录式文件中所有的逻辑记录都具有相同的长度,同时所有数据项的相对位置也是固定的。定长记录由于处理方便、控制容易,在传统的数据处理中普遍采用。定长记录可以成组或不成组,成组时除最末一块外,每块中的逻辑记录数为一常数。
                      变长记录(格式V)指一个记录式文件中,逻辑记录的长度不相等,但每个逻辑记录的长度处理之前能预先确定。有两种情况会造成变长记录:包含一个或多个可变的长度的数据项;包含了可变数目的定长数据项。
                      文件的物理结构
                      文件系统往往根据存储设备类型、存取要求、记录使用频度和存储空间容量等因素提供若干种文件存储结构。用户看到的是逻辑文件,处理的是逻辑记录,按照逻辑文件形式去存储,检索和加工有关的文件信息,也就是说数据的逻辑结构和组织是面向应用程序的。然而,这种逻辑上的文件总得以不同方式保存到物理存储设备的存储介质上去,所以,文件的物理结构和组织是指逻辑文件在物理存储空间中存放方法和组织关系。
                      (1)顺序文件。
                      将一个文件中逻辑上连续的信息存放到存储介质的依次相邻的块上便形成顺序结构,这类文件叫顺序文件,又称连续文件。显然,这是一种逻辑记录顺序和物理记录顺序完全一致的文件,通常,记录按出现的次序被读出或修改。
                      顺序文件的基本优点是:顺序存取记录时速度较快。顺序文件的主要缺点是:建立文件前需要能预先确定文件长度,以便分配存储空间;修改、插入和增加文件记录有困难;对直接存储器作连续分配,会造成少量空闲块的浪费。
                      (2)连接文件。
                      连接结构的特点是使用连接字,又叫指针来表示文件中各个记录之间的关系。如下图所示,第一块文件信息的物理地址由文件目录给出,而每一块的连接字指出了文件的下一个物理块。通常,连接字内容为0时,表示文件至本块结束。这种文件叫连接文件,又称串联文件。
                      
                      连接文件结构示意图
                      指向其他数据的连接表示是计算机程序设计的一种重要手段,是表示复杂数据关系的一种重要方法,使用指针可以将文件的逻辑记录顺序与它所在存储空间联系起来。
                      (3)索引结构。
                      索引结构是实现非连续存储的另一种方法,适用于数据记录保存有随机存取存储设备上的文件。如下图所示,它使用了一张索引表,其中每个表目包含一个记录的键及其记录数据的存储地址,存储地址可以是记录的物理地址,也可以是记录的符号地址,这种类型的文件称为索引文件。通常,索引表的地址可由文件目录指出,查阅索引表先找到的相应记录键,然后获得数据存储地址。
                      
                      索引文件结构示意图
                      索引文件在文件存储器上分两个区:索引区和数据区。访问索引文件需两步操作:第一步查找文件索引,第二步以相应键登记项内容作为物理或符号地址而获得记录数据。这样,至少需要两次访问辅助存储器,但若文件索引已预先调入主存储器,那么就可减少一次内外存信息交换。
                      索引结构是连接结构的一种扩展,除了具备连接文件的优点外,还克服了它只能作顺序存取的缺点,具有直接读写任意一个记录的能力,便于文件的增加、删除和修改。索引文件的缺点是:增加了索引表的空间开销和查找时间,索引表的信息量甚至可能远远超过文件记录本身的信息量。
               文件的共享和保护
                      文件的保护
                      文件保护是指防止文件被破坏,它包括两个方面:一是防止系统崩溃所造成的文件破坏;二是防止其他用户的非法操作所造成的文件破坏。
                      为防止系统崩溃造成文件破坏,定时转储是一种经常采用的方法,系统的管理员每隔一段时间,或一日、或一周、或一月、或一个期间,把需要保护的文件保存到另一个介质上,以备数据破坏后恢复。如一个单位建立了信息系统,往往会准备多个磁带,以便数据库管理员每天下班前把数据库文件转储到磁带上,这样即使出现了数据库损坏,最多只会丢失一天的数据。由于需要备份的数据文件可能非常多,增量备份是必需的,为此操作系统专门为文件设置了档案属性,用以指明该文件是否被备份过。
                      至于要防止其他用户的非法操作所造成的文件破坏,这往往通过操作系统的安全性策略来实现,其基本思想是建立如下的三元组。
                      (用户、对象、存取权限)
                      其中:
                      (1)用户是指每一个操作系统使用者的标识。
                      (2)对象在操作系统中一般是文件,因为操作系统把对资源的统一到文件层次,如通过设备文件使用设备、通过socket关联文件使用进程通信等。
                      (3)存取权限定义了用户对文件的访问权,如读、写、删除、创建、执行等。一个安全性较高的系统权限划分得较多较细。
                      要实现这一机制必须建立一个如下图所示的存取控制矩阵,它包括两个维,一维列出所有用户名,另一维列出全部文件,矩阵元素的内容是一个用户对于一个文件的存取权限,如用户1对文件1有读权R,用户3对文件1既有读权R,又有写权W和执行权X。
                      
                      存取控制矩阵
                      文件的保密
                      文件保密的目的是防止文件被窃取。主要方法有设置密码和使用密码。
                      密码分成两种:文件密码是用户为每个文件规定一个密码,它可写在文件目录中并隐蔽起来,只有提供的密码与文件目录中的密码一致时,才能使用这个文件。另一种是终端密码,由系统分配或用户预先设定一个密码,仅当回答的密码相符时才能使用该终端。但是它有一个明显的缺点,当要回收某个用户的使用权时,必须更改密码,而更改后的新密码又必须通知其他的授权用户,这无疑是不方便的。
                      使用密码是一种更加有效的文件保密方法,它将文件中的信息翻译成密码形式,使用时再解密。在网络上进行数据传输时,为保证安全性,经常采用密码技术;进一步还可以对在网络上传输的数字或模拟信号采用脉码调制技术,进行硬加密。
   题号导航      2019年下半年 软件设计师 下午试卷 案例   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
 
第5题    在手机中做本题