免费智能真题库 > 历年试卷 > 程序员 > 2011年上半年 程序员 上午试卷 综合知识
  第53题      
  知识点:   软件结构优化准则   软件设计的基本原理   聚类   模块设计   内聚   信号
  关键词:   模块   内聚类型   信号        章/节:   系统分析和设计基础知识       

 
在程序中有一个错误处理模块,它接收出错信号,对不同类型的错误打印出不同的出错信息,则该模块设计时内聚类型为(53)。
 
 
  A.  逻辑内聚
 
  B.  信息内聚
 
  C.  功能内聚
 
  D.  过程内聚
 
 
 

 
  第57题    2009年下半年  
   35%
用户使用软件时难免会出现一些操作错误。在设计用户界面时必须考虑出错处理,使用户不必为避免操作错误而提心吊胆。(57)不是合适..
  第54题    2009年下半年  
   73%
衡量软件设计模块独立性的一个标准是耦合性,其中两个模块之间传递数据结构的情况属于(54)。
  第51题    2012年下半年  
   30%
若某模块的所有语句都与存款功能相关,则该模块的内聚是(51)。
   知识点讲解    
   · 软件结构优化准则    · 软件设计的基本原理    · 聚类    · 模块设计    · 内聚    · 信号
 
       软件结构优化准则
               软件结构图
               软件结构表示软件系统的模块层次结构,反映整个系统的功能实现。软件结构一般用树状或网状结构的图来表示,结构图的主要内容有:模块,用矩形表示;模块间的控制关系,用单向箭头表示;模块间的信息传递,用带注释的短箭头表示;两个附加符号,表示有选择地调用(菱形符号表示)和循环调用(弧形箭头表示)。
               结构图的形态特征如下。
               (1)深度:结构图模块的层数。
               (2)宽度:指一层中最大的模块个数。
               (3)扇出:指一个模块的直接下属模块的个数。
               (4)扇入:指一个模块的直接上属模块的个数。
               软件结构优化设计原则
               软件结构优化设计原则如下。
               (1)划分模块时,尽量做到高内聚低耦合。
               (2)一个模块的作用范围要在其控制范围内。
               (3)软件结构的深度、宽度、扇出、扇入要适当。
               (4)模块的大小要适中。
 
       软件设计的基本原理
               模块化
               模块是程序中数据说明、可执行语句等程序对象的集合,模块化是指在解决问题时把项目划分成若干模块的过程。
               抽象
               抽象即对事物共同特性的提炼。
               信息隐蔽
               使每个模块的内部信息对于不相关的模块来说是隐蔽的。
               块独立性
               块独立性要求每个模块要完成独立的子功能与其他模块的联系少而接口简单。衡量独立性的标准有耦合性和内聚性。
               耦合性也称为块间联系,按耦合性从低到高的顺序,模块的耦合性有:无直接耦合、数据耦合、标记耦合、控制耦合、公共耦合和内容耦合。内聚性指的是块内联系,按内聚性从低到高的顺序,模块的内聚性有:偶然内聚、逻辑内聚、时间内聚、通信内聚、顺序内聚和功能内聚。
 
       聚类
        聚类是一种无监督学习过程。根据数据的特征,将相似的数据对象归为一类,不相似的数对象归到不同的类中,这就是聚类,每个聚类也称为簇。“物以类聚,人以群分”就是聚类的典型描述。
        聚类的典型算法有:基于划分的方法、基于层次的方法、基于密度的方法、基于网格的方法和基于统计模型的方法。基于划分的方法将单个数据对象划分为k个不相交的集合,每个集合称为一个簇。典型的算法有k-均值、k-中心点算法等。基于层次的方法将数据对象集进行层次的分解。根据其是自底向上还是自顶向下分解,可以分为凝聚的方法和分裂的方法,而前者的典型算法是AGNES,后者的典型算法是DIANA。基于密度的方法基于数据对象的邻域来进行聚类分析,因此可以识别各种形状的簇,以及一个数据对象可以属于多个不同的簇,DBSCAN、OPTICS和DENCLUE是其中的典型算法。基于网格的方法把对象空间量化为有限个单元,形成一个网格结构。所有的聚类操作在该网格上进行,STING和CLIQUE是其中的两个算法。基于统计模型的算法将数据对象集看作多个服从不同分布的数据集构成,聚类的目的是识别出这些不同的分布的数据对象,EM算法是其中的一个典型算法。
 
       模块设计
        模块设计阶段中,在系统内部划分成各个基础部分——模块结构,确定系统的总体结构。总体结构与各个分层模块结构的关系是程序实施的重要依据。模块结构采用模块结构图来表示。模块结构图是采用HIPO图形式绘制而成的框图。
        .名称,列出系统中各主要功能的结构图名称和它们之间的关系。
        .功能,用文字简单说明主要模块结构应具有的功能。
        .功能说明,说明是用伪码形式还是用结构化语言形式,或者其他自然语言形式描述模块结构图的。
        .评价。
        .验收,指设计人员验收的决定和处理情况。
 
       内聚
        内聚是指模块内部各元素之间联系的紧密程度,例如一个完成多个功能的模块的内聚度就比完成单一功能的模块的内聚度低。内聚度越低,模块的独立性越差。内聚性有以下几种类型:
        (1)偶然内聚:指一个模块内的各个处理元素之间没有任何联系。
        (2)逻辑内聚:指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
        (3)时间内聚:把需要同时执行的动作组合在一起形成的模块为时间内聚模块。
        (4)通信内聚:指模块内所有处理元素都在同一个数据结构上操作,或者指各处理使用相同的输入数据或者产生相同的输出数据。
        (5)顺序内聚:指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入。
        (6)功能内聚:这是最强的内聚,指模块内所有元素共同完成一个功能,缺一不可。
        耦合性和内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚、低耦合,提高模块的独立性。
 
       信号
        任务间同步的另一种方式是异步信号。在两个任务之间,可以通过相互发送信号的方式,来协调它们之间的运行步调。
        所谓的信号,指的是系统给任务的一个指示,表明某个异步事件已经发生了。该事件可能来自于外部(如其他的任务、硬件或定时器),也可能来自于内部(如执行指令出错)。异步信号管理允许任务定义一个异步信号服务例程ASR(Asynchronous Signal Routine),与中断服务程序不同的是,ASR是与特定的任务相对应的。当一个任务正在运行的时候,如果它收到了一个信号,将暂停执行当前的指令,转而切换到相应的信号服务例程去运行。不过这种切换不是任务之间的切换,因为信号服务例程通常还是在当前任务的上下文环境中运行的。
        信号机制与中断处理机制非常相似,但又各有不同。它们的相同点是:
        .都具有中断性:在处理中断和异步信号时,都要暂时地中断当前任务的运行;
        .都有相应的服务程序;
        .都可以屏蔽响应:外部硬件中断可以通过相应的寄存器操作来屏蔽,任务也能够选择不对异步信号进行响应。
        信号机制与中断机制的不同点是:
        .中断是由硬件或特定的指令产生,而信号是由系统调用产生;
        .中断触发后,硬件会根据中断向量找到相应的处理程序去执行;而信号则通过发送信号的系统调用来触发,但系统不一定马上对它进行处理;
        .中断处理程序是在系统内核的上下文中运行,是全局的;而信号处理程序是在相关任务的上下文中运行,是任务的一个组成部分。
        实时系统中不同的任务经常需要互斥地访问共享资源。当任务试图访问资源时被正使用该资源的其他任务阻塞,可能出现优先级反转的现象,即当高优先级任务企图访问已被某低优先级任务占有的共享资源时,高优先级任务必须等待直到低优先级任务释放它占有的资源。如果该低优先级任务又被一个或多个中等优先级任务阻塞,问题就更加严重。由于低优先级任务得不到执行就不能访问资源、释放资源。于是低优先级任务就以一个不确定的时间阻塞高优先级的任务,导致系统的实时性没有保障。下图为是一个优先级反转的示例。
        
        一个优先级反转的示例
        如上图所示,系统存在任务1、任务2、任务3(优先级从高到低排列)和资源R。某时,任务1和任务2都被阻塞,任务3运行且占用资源R。一段时间后,任务1和任务2相继就绪,任务1抢占任务3运行,由于申请资源R失败任务1被挂起。由于任务2的优先级高于任务3,任务2运行。由于任务3不能运行和释放资源R,因此任务1一直被阻塞。极端情况下,任务1永远无法运行,处于饿死状态。
        解决优先级反转问题的常用算法有优先级继承和优先级天花板。
               优先级继承协议
               L. Sha、R. Rajkumar和J. P. Lehoczky针对资源访问控制提出了优先级继承协议(Priority Inheritance Protocol,PIP)。
               PIP协议能与任何优先级驱动的抢占式调度算法配合使用,而且不需要有关任务访问资源情况的先验知识。优先级继承协议的执行方式是:当低优先级任务正在使用资源,高优先级任务抢占执行后也要访问该资源时,低优先级任务将提升自身的优先级到高优先级任务的级别,保证低优先级任务继续使用当前资源,以尽快完成访问,尽快释放占用的资源。这样就使高优先级任务得以执行,从而减少高优先级任务被多个低优先级任务阻塞的时间。低优先级任务在运行中,继承了高优先级任务的优先级,所以该协议被称作优先级继承协议。
               由于只有高优先级任务访问正被低优先级任务使用的资源时,优先级继承才会发生,在此之前,高优先级任务能够抢占低优先级任务并执行,所以优先级继承协议不能防止死锁,而且阻塞是可以传递的,会形成链式阻塞。另外,优先级继承协议不能将任务所经历的阻塞时间减少到尽可能小的某个范围内。最坏情况下,一个需要μ个资源,并且与v个低优先级任务冲突的任务可能被阻塞min(μ,v)次。
               优先级冲顶协议
               J. B. Goodenough和L. Sha针对资源访问控制提出了优先级冲顶协议(Priority Ceiling Protocol,PCP)。
               PCP协议扩展了PIP协议,能防止死锁和减少高优先级任务经历的阻塞时间。该协议假设所有任务分配的优先级都是固定的,每个任务需要的资源在执行前就已确定。每个资源都具有优先级冲顶值,等于所有访问该资源的任务中具有的最高优先级。任一时刻,当前系统冲顶值(current priority ceiling)等于所有正被使用资源具有的最高冲顶值。如果当前没有资源被访问,则当前系统冲顶值等于一个不存在的最小优先级。当任务试图访问一个资源时,只有其优先级高于当前系统冲顶值,或其未释放资源的冲顶值等于当前系统冲顶值才能获得资源,否则会被阻塞。而造成阻塞的低优先级任务将继承该高优先级任务的优先级。
               已经证明,PCP协议的执行规则能防止死锁,但其代价是高优先级任务可能会经历优先级冲顶阻塞(Priority ceiling blocking)。即高优先级任务可能被一个正使用某资源的低优先级任务阻塞,而该资源并不是高优先级任务请求的。这种阻塞又被称作回避阻塞(avoidance blocking),意思是因为回避死锁而引起的阻塞。即使如此,在PCP协议下,每个高优先级任务至多被低优先级任务阻塞一次。使用PCP协议后,能静态分析和确定任务之间的资源竞争,计算出任务可能经历的最大阻塞时间,从而能分析任务集合的可调度性。在PCP协议下,高优先级任务被阻塞时会放弃处理器,因此,访问共享资源的任务可能会产生4次现场切换。
   题号导航      2011年上半年 程序员 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第53题    在手机中做本题