节能监管服务软件
软件可靠性与安全性设计准则
1 范围 3
1.1主
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
内容 3
1.1适用范围 4
2 一般要求 4
3 详细要求 4
3.1计算机系统设计 4
3.1.1硬件与软件功能的分配原则 4
3.1.2硬件与软件可靠性的分配原则 4
3.1.3安全关键功能的人工确认 4
3.1.4安全性内核 4
3.1.5自动记录系统故障 5
3.1.6禁止回避检测出的不且安全状态 5
3.1.7保密性设计 5
3.1.8容错设计 5
3.1.9 安全关键软件的标识原则 5
3.2软件需求分析 5
3.3软件危险分析 5
3.3 安全关键功能的设计 6
3.4 接口设计 6
3.4.1硬件接口的软件设计 6
3.4.2人机界面设计 6
3.4.3报警设计 6
3.4.4软件接口设计 6
3.5 软件健壮性设计 7
3.5.1监控定时器的设计 7
3.5.2异常保护设计 7
3.6 简化设计 7
3.6.1模块的单入口和单出口 7
3.6.2模块的独立性 7
3.6.3模块的扇入与扇出 8
3.6.4模块的耦合方式 8
3.6.5模块的内聚方式 8
3.7 防错程序设计 8
3.7.1参数化 8
3.7.2公共数据和公共变量 8
3.7.3标志 9
3.7.4标志 9
3.7.5非授权存储的限制 9
3.7.6无意指令跳转的处理 9
3.7.7程序检测点得设置 9
3.8 编程要求 9
3.8.1语言要求 9
3.8.2高级语言的限制 10
3.8.3软件单元规模 10
3.8.4命名要求 10
3.8.5程序格式要求 10
3.8.6程序注释要求与方法 10
3.8.7程序设计风格 11
4 数据库设计要求 12
3.9.1数据库表的建立 12
3.9.2数据库表的命名 13
3.9.3数据库编程规范 13
3.9.4数据查询优化 14
1 范围
1.1主题内容
本指导内容给出了计算机软件可靠性和安全性设计的准则和要求
1.1适用范围
本文主要适用于软件的需求分析、设计和实现。
2 一般要求
开发可靠软件首先必须采用软件工程方法,搞好软件开发工程化。应特别注意以下几点:
1. 软件开发规范化。图形符号、程序构造都应该有一致的约定。
2. 尽可能采用先进、适用的软件开发工具
3. 加强软件检查和测试。应该尽早展开软件测试,采取措施(如自检、互检、专检相结合的三检制,制定设计检查单等)使检查工作切实有效。
3 详细要求
3.1计算机系统设计
3.1.1硬件与软件功能的分配原则
对具有高可靠性和安全性要求的功能应权衡用硬件实现还是用软件实现的利弊,做出妥善的决策
3.1.2硬件与软件可靠性的分配原则
软件的可靠性指标应与硬件的可靠性指标大体相当,可根具体情况做出调整,但调整的幅度不易过大
3.1.3安全关键功能的人工确认
在系统控制回路中,安全关键功能的执行在可能时必须经操作人员确认或启动。
3.1.4安全性内核
在关键的计算机系统中,应该设计一个称为安全性内核的独立计算机程序,用来监视系统并防止系统进去不安全的状态。当出现潜在不安全的系统状态或有可能转到这种状态时,它将系统转移到指定的安全状态
3.1.5自动记录系统故障
必须采取措施自动记录检测出的所有系统故障及系统运行情况。
3.1.6禁止回避检测出的不且安全状态
在系统设计时考虑故障的自动检测,一旦检测出不安全的状态系统应作出正确响应,不得回避。
3.1.7保密性设计
系统设计应防止越权或意外的存取或修改软件
3.1.8容错设计
对可靠性要求很高的系统应同时考虑硬件和软件的容错设计,而不能只考虑硬件的容错设计。
3.1.9 安全关键软件的标识原则
1. 故障检测的优先级结构及安全性控制或校正逻辑、处理和响应故障的模块
2. 中断处理程序、中断优先级模式及允许或禁止中中断的例行程序。
3. 产生对硬件进行自主控制信号的软件。
4. 产生直接影响硬件部件运动或启动安全关键功能的型号的软件。
5. 其输出是显示安全关键硬件的状态的软件。
3.2软件需求分析
1. 软件需求分析必须确保软件需求规格
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
的无歧义性、完整性、可验证性、一致性、可修改性、可追踪性和易使用性。
2. 对有可靠性指标的软件,在确定了软件的功能性需求之后,应考虑软件的可靠性指标是否能够达到以及是否能够验证,还应与用户密切配合,确定软件使用的功能剖面,并制定软件可靠性测试
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
。
3. 对安全关键软件,必须列出可能的不期望事件,分析导致这些不期望事件的可能原因,提出相应软件的处理要求
3.3软件危险分析
应在开发的各个阶段进行软件危险分析
3.3 安全关键功能的设计
1. 安全关键功能必须至少受控于两个独立的功能
2. 安全关键的模块必须与其他模块隔离,安全关键的模块必须放在一起,以便对其进行保护。
3. 安全关键的模块必须具有强数据类型;不得使用一位的逻辑“0”或“1”来表示“安全”或“危险”的状态;其判定条件不得依赖于全“0”或全“1”的输入。
4. 安全关键的计时功能必需由计算机控制,使操作人员不能随意修改。
5. 在启动安全关键功能之前,必需对可测试的安全关键的单元进行实时检测。当检测到不安全的情况时,软件必需采取措施对其进行处理;如果软件无法控制,应保证将控制转换到硬件的安全子系统。
3.4 接口设计
3.4.1硬件接口的软件设计
1. 硬件接口的软件设计必须考虑检测外部输入或输入的设备失效,并在发生失效时恢复到某个安全状态。设计必须考虑所涉及硬件的潜在失效模式。
2. 在设计硬件接口的软件时,必须预先确定数据传输信息的格式和内容。每次传输都必须包含一个字或字符串来指明数据类型及信息内容。至少使用奇偶校验与检测来验证数据传输的正确性。
3. 在硬件接口的软件设计中必须考虑硬件接口中已知元件的失效模式。
4. 安全关键功能应使用专用IO端口。
3.4.2人机界面设计
1. 人机交互软件要便于操作员用单一行为处理当前事务,使系统退出潜在不安全的状态,并使其恢复到某一安全状态
2. 启动安全关键功能时,必须由两个或多个人员在“与”方式下操作。
3. 向操作员提供的显示信息、图标、及其它人机交互方式必须清晰、简明而且无二义性。
3.4.3报警设计
1. 必须向操作员提供声光报警声,声音预警信号必须超过预期的背景噪声,同时提供表明软件正在操作的实时指示。
2. 报警的设计必须事例行报警与安全关键的报警相区别,并使得没有采取纠正行为或没有执行所要求的后续行为以后完成该操作的情况下,操作员无法清除安全关键的报警。
3.4.4软件接口设计
在设计软件接口时必须确保:
1. 模块的参数个数与模块的接受的变元个数一致。
2. 模块的参数属性与模块的接受的输入变元属性一致。
3. 模块的参数单位与模块的接受的输入变元的单位一致。
4. 模块的参数次序与模块的接受的输入变元次序一致。
5. 传送给被调用模块的变元个数与该模块的参数个数相同。
6. 传送给被调用模块的变元属性与该模块的参数属性相同。
7. 传送给被调用模块的变元单位与该模块的参数单位相同。
8. 传送给被调用模块的变元次序与该模块的参数次序相同。
9. 调用内部函数时,变元的个数、单位、属性、次序必须一致。
10. 不会修改只作为输入值的变元。
11. 全程变量在素有引用它的模块中都有相同的定义。
12. 不从在把常数做为变量来传送的情况。
3.5 软件健壮性设计
3.5.1监控定时器的设计
1. 必须提供监控定时器或者类似的措施。
2. 监控定时器应力求采用独立的时钟源。
3. 与硬件状态变化有关的程序设计应考虑状态检测的次数或时间,无时间依据的情况下可用循环等待次数做为依据,超过一定次数,则做为超市处理。
3.5.2异常保护设计
必须仔细分析软件运行过程中各种可能的异常情况,设计相应的保护措施。特别当采用现成软件时,必须分析原有的异常保护措施对于现有的软件需求是否足够适用。异常处理措施必须使系统转入安全状态,并保持计算机初与运行状态。
3.6 简化设计
3.6.1模块的单入口和单出口
除中断情形外,模块应使用单入口和单出口的控制结构。
3.6.2模块的独立性
模块的独立性应以提高内聚,降低耦合度来实现:
3. 采用模块调用方式,而不采用直接访问模块内部的有关信息方式。
4. 适当限制模块间传递参数的个数。
5. 模块内的变量应该局部化。
6. 将一些可能发生变化的因素或需要经常修改的部分尽量放在少数的机构模块中。
3.6.3模块的扇入与扇出
在软件设计时,将模块在逻辑上构成分层次的结构,在不同的层次上可有不同的扇入和扇出数。模块的实际结构形态应满足下述准则:
1. 模块的扇出一般应该控制在7个以下。
2. 为避免某些重复代码的重复,可适当增加模块的扇入。
3. 应该使高层模块有较高的扇出,低层模块有较高的扇入。
3.6.4模块的耦合方式
模块间的耦合方式有五类,按其优先顺序排列如下:
1. 数据耦合。
2. 控制耦合。
3. 外部耦合。
4. 公共数据耦合。
5. 内容耦合。
3.6.5模块的内聚方式
模块元素内聚方式有六类,顺序如下:
1. 功能内聚。
2. 顺序内聚。
3. 通信内聚。
4. 时间内聚。
5. 逻辑内聚。
6. 偶然内聚。
3.7 防错程序设计
3.7.1参数化
在软件设计中,必须采用统一的符号来表示参数、常量和标志。
3.7.2公共数据和公共变量
必须指明由两个或多个模块公用的数据和公共变量,并尽量减少对公共变量的改变,以减少模块间的副作用。
3.7.3标志
所有标志必须进行严格的定义,并编制标志使用说明,说明的项目包括:
1. 名称和位定义。
2. 功能和作用。
3. 使用范围。
4. 生命周期。
5. 使用状况。
对于安全关键标识,在其被使用的软件单元里,必须唯一且用于单目的。
3.7.4标志
文件必须唯一,且用于单一的目的;文件在使用前必须成功的打开,在使用结束后必须安全的关闭;文件的属性应于其他使用相一致。
3.7.5非授权存储的限制
1. 必须防止对程序(源程序、汇编程序及目标代码)的非授权的或无意义的存取或修改,其中包括对代码的修改。
2. 必须防止对数据的非授权或无意义的存储或者修改;对安全关键功能的模块应设置调用密码。
3.7.6无意指令跳转的处理
1. 必须检测安全关键软件内或安全关键软件间的无意义的跳转;如果可行的话,进行故障诊断,并确定引起无意跳转的原因。
2. 必须提供无意指令跳转处进入故障安全状态的恢复措施。
3.7.7程序检测点得设置
1. 在安全关键软件的关键点上进行检测,在发现系统故障时,必要时使系统进入安全状态。
2. 在完成必要检测功能的前提下,安全检测点以少不宜多。
3. 测试特征量的流出通道应力求独立,使测试功能的失效不会影响到其它功能。
3.8 编程要求
3.8.1语言要求
1. 采用
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
化的程序设计语言进行编程。
2. 在同一系统中,应尽量减少编程语言的使用。应按照软件惯例,在实现同一类的软件时应只采用同一种版本的高级语言进行编程,必要时也可以采用一中汇编语言进行编程。
3. 应选用经过优选的编译程序或汇编程序,杜绝使用盗版软件。
3.8.2高级语言的限制
1. 原则上不得使用GOTO语句。在使用GOTO语句带来好处的地方,必须控制GOTO的方向,只需使用向前GOTO,不得使用向后GOTO。
2. 应选用便于测试的几种程序结构进行编制。
3.8.3软件单元规模
对于高级软件实现的软件单元,每个单元的源代码最多不能超过200行,一般不超过60行。
3.8.4命名要求
1. 必须以显示的符号来命名变量和语句符号。
2. 必须尽量避免混淆的标志符(如,R1和RI,D0和DO等)来表示不同的变量、文件名和语句标号。
3.8.5程序格式要求
在编辑源程序时,应将其编辑成反应结构化特色的缩进格式,使编码的逻辑关系与程序清单的位置相一致。
3.8.6程序注释要求与方法
3.8.6.1注释的一般要求
为提高可读性,在源程序中必须要有足够详细的注释。注释应该为功能性的而非指令的逐句说明。注释的行数一般不能少于源程序总行数的1/5。
3.8.6.2模块头注释的一般要求
每个模块的可执行代码之前,必须用一段文字注释来说明如下内容:
1. 输入输出注释:说明模块所使用的输入输出文件名,并指出每个文件是向模块输入还是向模块输出,或两者兼而有之;
2. 模块名注释:标志模块的名称、版本号、入口点、程序开发者姓名、单位及开发时间,如有修改,还应标明修改者的单位、姓名和修改时间。
3. 模块功能注释:说明模块的用途和功能。
4. 参数注释:说明模块所用的全部参数名称、数据类型、大小、物理单位及用途。
5. 调用注释:列出模块中调用的全部模块名,以及调用该模块的全部模块名。
6. 方法注释:说明该为实现该模块的功能所用的全部方法。
7. 外部环境及资源注释:说明该模块所用依赖的外部运行环境及所用资源。
3.8.6.3模块内注释般要求
在模块中,至少应对有条件改变值或执行顺序的语句进行注释,对这些语句的注释不扰乱模块的清晰性,这些注释也应符合程序的缩进格式。具体注释方法如下:
1. 分支转移语句:指出执行动作的理由。
2. 输入输出语句:指出所处理文件或记录的性质。
3. 循环语句:指出执行语句的理由以及出口条件。
4. 调用语句:说明调用语句的过程以及被调用哪个模块的功能。
3.8.6.4模块内注释般要求
在每个模块和软件单元中,对关键的语句标号和数据名还必须有准确的引用信息,并确定输入和输出值的允许和预期的范围;对计时器的值的注释必须包含计时功能的描述、其值及基本原理或所引用的解释计时器值的基本原理文档。
3.8.7程序设计风格
在编制程序时应采用下述设计风格。
3.8.7.1通用程序设计风格
通用的程序设计风格:
1. 程序要写清楚,不要过分灵巧。
2. 不要为了“效率”而牺牲清晰。
3. 简单而直接的说明意图。
4. 使用库函数。
5. 避免使用临时变量。
6. 把繁琐的工作交给计算机处理。
7. 使用语言中号的特征。
8. 选用能够使程序更简单的数据结构。
9. 不要修补不好的程序,应该重新编码。
10. 每个模块都只做一件事。
11. 在边界上检查程序。
12. 避免一个错误而造成中断。
13. 进行防错性程序设计。
14. 先保证正确,再提高速度。
15. 先保持清晰,再提高速度。
16. 先保持简单,再提高速度。
3.8.7.2结构类
与结构有关的程序设计风格:
1. 用调用一个公共函数的方式代替重复的表示。
2. 使用括号以避免二义性。
3. 避免不必要的分支。
4. 不要用分支条件去代替一个逻辑表达式。
5. 若逻辑表达式难于理解,则把它修改到易于理解为止。
6. 使程序自顶向下读。
7. 使用基本的控制流结构。
8. 使与判定相联系的动作尽可能地紧跟着判定。
9. 使用数组以避免重复的控制序列。
10. 要模块化,使用子程序。
11. 使模块间的耦合清晰可见。
12. 当心不要分支出两条等价的支路。
13. 避免从循环引出多个出口。
4 数据库设计要求
3.9.1数据库表的建立
3.9.1.1建表准则
建立数据库表必须通过DBA完成:
1. 每张表必须有一个主键。
2. 由设计人员提供建表的语句。
3. 由设计人员提供表名及字段的中文注释。
4. 由DBA与设计人员加入物理存储参数。
5. 由DBA确定数据表空间及索引表空间的分配。
6. 如果一个表的字段引用其它表的字段,必须加入外键约束。
7. DBA必须清楚每一个字段的含意。
是否有外键
是否可以为空null
3.9.1.1注意事项
1.索引
每一张表必须有一个主键 <表名>_pk
若干外键索引 <表名>_fk_<数字>
若干其它索引 <表名>_<数字>
2.数据类型
定义合适的数据类型,注意 例如:
amount number(9,2)表示一供可以存放9个数字,其中小数点后有2位。
3.9.2数据库表的命名
● 表名的长度最多20个字符(需然oracle允许最大30个字符)。
● 表名只能用字母数字及下划线。
● 表名的命名规则
TAB_ 业务表,一般会记录业务发生的信息。
TABF_ 值表,只有两个字段, 此类表不经常变化。用于应用程序的变量取值
TMP_ 临时表
日志表
日志表以_log结尾,一般志表可以有一段时间之后,进程备份,删除其中一些时间较长的数据。
周期备份表
TABY_字符串_YYMM:每年清空的周期表。YY建立年份,MM清除的月份。
TABM_字符串_MMDD:每月清空的周期表。MM建立月份,DD清除的日期。
TABW_字符串_MMWD:每周清空的周期表。MM建立月份,清除的周(1-4)及天(1-7)。
TABD_字符串_DDHH:每天清空的周期表。DD建立日期,清除的时间(01-24)。
字符串_BAK:数据备份表(应用程序不得使用)
3.9.3数据库编程规范
SELECT 语句示例
SELECT
User.Code,
User.Name,
Dept.DeptName,
Post.PostName
INTO
:Code
:Name
:DeptName,
:PostName
FROM
User,Dept,Post
WHERE
User.DeptCode = Dept.DeptCode AND
User.PostCode = Post.PostCode;
UPDATE语句示例
UPDATE User
SET
Code = :Code,
Name = :Name,
Age = :Age
WHERE
CODE = :Code;
INSERT语句示例
INSERT INTO User
(‘Code’,
‘Name’)
VALUES
(‘jonson’,
‘pippon’);
DELETE语句示例
DELETE
FROM USER
WHERE
Code = :Code;
3.9.4数据查询优化
由于公共节能监管服务软件设计到大规模的数据查询以及分析,程序开发人员必须尽可能的提高查询语句的执行效率。
改善用户查询计划的常用解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
有如下几点。
1.合理使用索引
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:
●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
●在频繁进行排序或分组的列上建立索引。
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
2.避免或简化排序
应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。
3.消除对大型表行数据的顺序存取
在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。还可以使用并集来避免顺序存取。
4.避免相关子查询
一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
5.避免困难的正规表达式
LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
6.使用临时表加速查询
把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。
7.尽量不要使用or
使用or会引起全表扫描,将大大降低查询效率。
8.字段提取要按照“需多少、提多少”的原则
避免“select *”,尽量使用“select 字段1,字段2,字段3........”。实践证明:每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断
数据库查询优化是一项综合性工作,受到各种各样因素的制约,有些要求往往是彼此矛盾的。因此设计者必须根据实际情况,综合应用上述技术,在基本合理的总体设计的基础上,对数据库查询做一些优化调整,力求最大限度地提高操作效率,减少异常等,满足用户各种各样的要求,实现数据库的查询优化设计。