软考

📝 11 篇文章
📅 最新: 2024/12/19

软考复习之信号量

# 信号量 信号量(Semaphore),有时被称为信号灯,是在[多线程](https://baike.baidu.com/item/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1190404?fromModule=lemma_inlink)环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被[并发](https://baike.baidu.com/item/%E5%B9%B6%E5%8F%91/11024806?fromModule=lemma_inlink)调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。 ## 信号量值的含义 - n>0:当前有可用资源,可用资源数量为n - n=0:资源都被占用,可用资源数量为0 - n<0:资源都被占用,并且还有n个进程正在排队 ## PV操作 PV操作是一种实现进程互斥与同步的有效方法。 PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。 **注意:** 1. P(S)和V(S)都是在同一个信号量S上操作 2. 约定P(S)和V(S)必须是两个不可被中断的过程 3. PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用 **P操作的主要动作是:** ①S减1; ②若S减1后仍大于或等于0,则进程继续执行; ③若S减1后小于0,则该进程被阻塞后放入等待该信号量的等待队列中,然后转进程调度。 **V操作的主要动作是:** ①S加1; ②若相加后结果大于0,则进程继续执行; ③若相加后结果小于或等于0,则从该信号的等待队列中释放一个等待进程,然后再返回原进程继续执行或转进程调度。 ~~如果再考到其他的点我再加吧~~

软考复习之编译原理

# 软考复习之编译原理 ## 语言处理程序 *语言处理程序是将高级语言或汇编语言编写的程序**翻译**成某种机器语言* ### 汇编语言 *汇编语言是为特定计算机设计的面向机器的符号化的设计语言* 汇编语言源程序是指用汇编语言编写的程序 #### 语句 ##### 指令语句 *指令语句又叫机器指令语句* 将其汇编后能产生相应的机器代码 基本指令有`ADD`.`SUB`,`AND`等 ##### 伪指令语句 *伪指令语句指示汇编程序在汇编源程序时完成的工作* 汇编后不产生相应的机器码 ##### 宏指令语句 *宏指令语句就是宏的引用* 宏的定义必须按照相应的规定进行,每个宏都有相应的宏名 #### 汇编程序 *汇编程序的功能是将用汇编语言写的源程序翻译成机器指令程序* 汇编程序一般需要两次扫描源程序才能完成翻译过程 **第一次扫描** - 创建记录汇编时遇到的符号的值的符号表ST - 一个固定的表MOT1记录每条机器指令的记忆码和指令长度 - 设立一个位置计数器或单元地址计数器LC来计算各汇编语句标点的地址,其初值一般是0 第二次扫描 - 使用符号指令表MOT2 - 设立一个伪指令表POT2 第二次扫描中,可执行的汇编语句应被翻译成对应的二进制代码机器指令 ### 编译程序 *编译程序的功能是把某高级语言书写的源程序翻译成与之等价的目标程序* #### 词法分析 *对源程序从前到后、从左到右的逐个字符扫描,从中识别出一个个“单词”符号* 词法规则用3型号文法或正规表达式描述,它产生的集合是语言基本字符集字母表上的字符串的一个子集叫做正规集 ##### 正规表达式与正规集 ![](../../../../assets/default.png) ![](../../../../assets/default.png) ##### 有限状态机 **确定有限状态机(DFA)** ![](../../../../assets/default.png) **不确定的有限状态机(NFA)** ![](../../../../assets/default.png) ##### NFA到DFA的转换 [NFA到DFA的转化_暗夜绿的博客](https://blog.csdn.net/weixin_48627356/article/details/121321357) ~~感觉不考~~ ##### DFA的最小化 [【编译原理】最小化 DFA_零碎@流年絮语的博客](https://blog.csdn.net/qq_44824148/article/details/115477583) ~~感觉也必考~~ ##### 正规式与有限自动机之间的转换 ~~感觉还是不考~~ ##### 词法分析器构造 1. 用正规表达式描述语言中的单词构成规则 2. 为每个正规式构造一个NFA,它识别正规式所表示的正规集 3. 将构造出的NFA转换成等价的DFA 4. 对DFA进行最小化处理 5. 从DFA构造词法分析器 #### 语法分析 *根据语言的语法规则将单词符号序列分解成各类语法单元,如果没有语法错误,语法分析后就能正确的构造出语法树,否则指出语法错误。* 语法分析的任务是根据语言的规则分析单词串中是否构成短语和句子 - ##### 文法和语言分析 *描述语言语法结构的规则成为<b>文法</b>* [【编译原理】文法的分类_Tuuua_的博客](https://blog.csdn.net/qq_42933533/article/details/109681369) [语法分析_Shanhj的博客](https://blog.csdn.net/Shanhj/article/details/124771451) #### 语义分析 *分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息。* 只有语法检查与语义检查都正确的源程序才能被翻译成正确的目标代码 #### 中间代码生成 *中间代码生成阶段的工作是根据语义分析的输出生成中间代码* - 中间代码是一种简单且含义明确的记号系统 - 可以有多种形式 - 特征是与具体机器无关 - 最常用的是三地址码,实现方式是四元式 **常用的中间代码形式:** - **后缀式**:[逆波兰式_百度百科 (baidu.com)](https://baike.baidu.com/item/%E9%80%86%E6%B3%A2%E5%85%B0%E5%BC%8F/128437?fromtitle=%E5%90%8E%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F&fromid=6160580&fr=aladdin) - 树形表示 - 三元表示 - 四元表示 **常用语法结构翻译** 布尔表达式和控制语句:[【编译原理系列】布尔表达式及控制语句翻译_槑!的博客](https://blog.csdn.net/weixin_43934607/article/details/113068312) 算数表达式和赋值语句:[【编译原理系列】算术表达式与数组元素翻译_槑!的博客](https://blog.csdn.net/weixin_43934607/article/details/113077357?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%AE%97%E6%95%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%BF%BB%E8%AF%91&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-113077357.142^v51^new_blog_pos_by_title,201^v3^add_ask&spm=1018.2226.3001.4187) **动态存储分配和过程调用的翻译** ~~没见考过~~ #### 代码优化 *代码优化生成高效的目标代码* 可以在中间代码生成阶段进行也可以在目标代码生成阶段进行 一般建立在对程序的控制流和数据流分析的基础上 #### 目标代码生成 *把中间代码变换成特定机器上的绝对指令代码、可重定向的指令代码或汇编指令代码* 和机器密切相关 是编译器工作的最后一个阶段 **代码生成所需要考虑的主要问题** - 中间代码形式 - 目标代码形式 - 寄存器的分配 - 计算时序的选择 #### 符号表管理 *记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成* #### 出错处理 *<b>动态错误</b>又成为语义错误,发生在程序运行时* *<b>静态错误</b>时指编译状态发现的程序错误* 编译时发现错误后,应该采用适当的策略修复他们,使得分析过程能够继续下去,以便能够在一次编译过程中尽可能多的找出程序中的错误 ### 解释程序 *解释程序与编译程序在词法、语法、语义分析方面与编译程序的工作原理基本相同,但是在运行用户程序时,它直接执行源程序或源程序的中间表达式* #### 基本结构 ##### 分析部分 - 词法分析 - 语法分析 - 语义分析 ##### 解释部分 ### 编译与解释的比较 - 效率:编译方式可能取得更高的效率 - 灵活性:解释方式更灵活 - 可移植性:解释方法更好

软考复习之设计模式

# 设计模式 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 ## 设计模式的六大原则 **1、开闭原则(Open Close Principle)** 开闭原则的意思是:**对扩展开放,对修改关闭**。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 **2、里氏代换原则(Liskov Substitution Principle)** 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。 **3、依赖倒转原则(Dependence Inversion Principle)** 这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。 **4、接口隔离原则(Interface Segregation Principle)** 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。 **5、迪米特法则,又称最少知道原则(Demeter Principle)** 最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。 **6、合成复用原则(Composite Reuse Principle)** 合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。 ## 分类 共有23种设计模式分为3大类 - 创建型模式 - 工厂模式(Factory Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 建造者模式(Builder Pattern) - 原型模式(Prototype Pattern) - 结构型模式 - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 过滤器模式(Filter、Criteria Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) - 行为型模式 - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 空对象模式(Null Object Pattern) - 策略模式(Strategy Pattern) - 模板模式(Template Pattern) - 访问者模式(Visitor Pattern) ![](cp/img1.jpg) ## 详细信息 [设计模式 | 菜鸟教程 (runoob.com)](https://www.runoob.com/design-pattern/design-pattern-tutorial.html)

软考复习之机械硬盘

# 机械硬盘管理 ## 硬盘结构 硬盘内部是由许许多多的圆形盘片、机械手臂、 磁头与主轴马达所组成的 实际的数据都是写在具有磁性物质的盘片上头,而读写主要是通过在机械手臂上的磁头(head)来达成。 实际运行时, 主轴马达让盘片转动,然后机械手臂可伸展让磁头在盘片上头进行读写的动作。 另外,由于单一盘片的容量有限,因此**有的硬盘内部会有两个以上的盘片** ![](disk/Disktructure.jpg) 磁盘上的数据都存放于磁道上。<mark>磁道就是磁盘上的一组同心圆</mark>,**其宽度与磁头的宽度相同**。为了避免减小干扰,**磁道与磁道之间要保持一定的间隔**(inter-track gap),<mark>沿磁盘半径方向,单位长度内磁道的数目称之为道密度</mark>(道/英寸,TPI),最外层为0道。 <mark>沿磁道方向,单位长度内存储二进制信息的个数叫位密度</mark>。为了简化电路设计,**每个磁道存储的位数都是相同的,所以其位密度也随着从外向内而增加**。磁盘的数据传输是以块为单位的,所以<mark>磁盘上的数据也以块的形式进行存放。这些块就称为扇区</mark>(sector),**每个磁道通常包括10~100个扇区。同样为了避免干扰,扇区之间也相互留有空隙**(inter–sector gap)。柱面是若干个磁盘组成的磁盘组,<mark>所有盘面上相同位置的磁道组称为一个柱面</mark>(每个柱面有n个磁道);若每个磁盘有m个磁道,则该磁盘组共有m个柱面。 通常数据的读写会由外圈开始往内写 ## 磁盘容量 **磁盘的非格式化容量为<mark>Cn=w×3.14×d×m×n</mark>,其中w为位密度,d为最内圈直径,m为记录面数,n为每面磁道数。** 磁盘格式化后能够存储有用信息的总量。**<mark>存储容量=n×t×s×b</mark>,其中:n为保存数据的总盘面 数;t为每面磁道数;s为每道的扇区数;b为每个扇区存储的字节数。** ## 磁盘读取时间 磁盘的存取时间包括寻道时间和等待时间。<mark>寻道时间(查找时间,Seek Time)为磁头移动到目标磁道所需的时间</mark>(movabe–head disk),对于固定磁头磁盘而言,无须移动磁头,只需选择目标磁道对应的磁头即可。<mark>等待时间为等待读写的扇区旋转到磁头下方所用的时间</mark>。一般选用磁道旋转一周所用时间的一半作为平均等待时间。寻道时间由磁盘机的性能决定 <mark>磁盘的数据传输速率是指磁头找到地址后,单位时间写入或读出的字节数</mark>。<mark>R=TB/T</mark>,其中:TB为一个磁道上记录的字节数,T为磁盘每转一圈所需的时间,R为数据传输速率。

软考复习之内存管理

## 内存管理 ## 存储管理的概念 存储管理主要是指对内存储器的管理,负责对内存的分配和回收、内存的保护和内存的扩充。存储管理的目的是尽量提高内存的使用效率。 ## 单一连续区管理 在单道程序系统中,内存区域的用户空间全部为一个作业或进程占用。单一连续分配方法主要用于早期单道批处理系统。单一连续分配方法主要采用静态分配方法,为降低成本和减少复杂度,通常不对内存进行保护,因而会引起冲突使系统瘫痪。 ## 分区存储管理 分区存储管理包括固定分区、可变分区,其基本思想是把内存划分成若干个连续区域,每个分区装入一个作业运行。要求作业一次性装入内存,且分区内部地址必须连续。 ### 固定分区存储管理 固定分区分配方法是把内存空间固定地划分为若干个大小不等的区域,划分的原则由系统决 定。系统使用分区表描述分区情况。分区一旦划分结束,在整个执行过程中每个分区的长度和内存的总分区个数保持不变。 ### 可变分区存储管理 可变分区分配方法是把内存空间按用户要求动态地划分成若干个分区。随着进程的执行,剩余的自由区域会变得更小,这时需要合并自由区和存储拼接技术。合并自由区是将相邻自由存储区合并为单一自由区的方法;存储拼接技术也称碎片收集,包括移动存储器的所有被占用区域到主存的某一端。可变分区克服了固定分区分配方法中的小作业占据大分区后产生碎片的浪费问题。 ### 存储分配算法 常使用的4种存储分配算法介绍如下。 **首次适应算法:** 把内存中的可用分区单独组成可用分区表或可用分区自由链,按起始地址递增的次序排列。每次按递增次序向后找,<mark>一旦找到大于或等于所要求内存长度的分区</mark>,则结束探索,从找到的分区中找出所要求的内存长度分配给用户,并把剩余的部分进行合并。 **循环适应算法:** 上述首次适应法经常利用的是低地址空间,后面经常是较大的空白区,为使内存所有线性地址空间尽可能轮流使用到,<mark>每重新分配一次,都在当前之后寻找。</mark> **最佳适应算法:** 最佳适应算法是<mark>将输入作业放入主存中与它所需大小最接近的空白区中</mark>,使剩下的未用空间最小,该法要求空白区大小按从小到大次序组成空白区可用表或自由链。在进行分配时总是从最小的一个开始查询,因而找到的一个能满足要求的空白区便是最佳的一个。 **最差适应算法:** 分配时把一个作业程序放入主存中最不适合它的空白区,即<mark>最大的空白区(空闲区)内</mark>。 ### 交换与覆盖技术 覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法。覆盖技术主要用在早期的操作系统中,而交换技术则在现代操作系统中得到了进一步发展。 覆盖技术是一种解决小内存运行大作业的方法。-个作业中若干程序段和数据段可以不同时使 用,这样它们就可以共享内存的某个区域,再根据需要分别调入该区域,这个区域就称为覆盖区。将程序执行时并不要求同时装入主存的覆盖组成一组,并称其为覆盖段,这个覆盖段分配到同一个覆盖区。交换技术可以将暂不需要的作业移到外存,让出内存空间以调入其他作业,交换到外存的作业也可以被再次调入。交换技术与覆盖技术相比不要求给出程序段之间的覆盖结构。交换主要是在作业之间进行的,而覆盖则主要是在同一个作业内进行的。 ## 页式存储管理 分页的基本思想是把程序的逻辑空间和内存的物理空间按照同样的大小划分成若干页面,以页面为单位进行分配。在页式存储管理中,系统中虚地址是一个有序对(页号,位移)。系统为每一个进程建立一个页表,其内容包括进程的逻辑页号与物理页号的对应关系、状态等。 ## 段式存储管理 段式存储管理与页式存储管理相似。分段的基本思想是把用户作业按逻辑意义上有完整意义的段来划分,以段为单位作为内、外存交换的空间尺度。一个作业是由若干个具有逻辑意义的段(如主程序、子程序、数据段等)组成的。在分段系统中,容许程序(作业)占据内存中许多分离的分区。每个分区存储一个程序分段。这样,每个作业需要几对界限地址寄存器,判定访问地址是否越界也困难了。在分段存储系统中常常利用存储保护键实现存储保护。分段系统中虚地址是一个有序对(段号,位移)。系统为每个作业建立一个段表,其内容包括段号、段长、内存起始地址和状态等。状态指出这个段是否已调入内存,即内存起始地址指出这个段,状态指出这个段的访问权限。 ## 段页式存储管理 段页式管理是段式和页式两种管理方法结合的产物,综合了段式组织与页式组织的特点,根据程序模块分段,段内再分页,内存被划分成定长的页。段页式系统中虚地址形式是(段号、页号、位移)。系统为每个进程建立一个段,为每个段建立一个页表。段页式管理采用段式分配、页式使用的方法,便于动态连接和存储的动态分配。这种存储管理能提高内存空间的利用率。段页式虚拟存储管理结合了段式和页式的优点,但增加了设置表格(段表、页表)和查表等开销,段页式虚拟存储器一般只在大型计算机系统中使用。 ## 页面调度 如果选择的页面被频繁地装入和调出,这种现象称为"抖动",应减少和避免抖动现象。常用的页面调度算法有以下几种。 **最优(OPT)算法**。<mark>选择不再使用或最远的将来才被使用的页</mark>,难以实现,常用于淘汰算法的 比较。 **随机(RAND)算法**。<mark>随机地选择被淘汰的页</mark>,开销小,但是可以选中立即就要访问的页。 先进先出(First in First out,FIFO)算法,又称轮转法(RR)。选择在内存驻留时间最长的 页,似乎合理,但可能淘汰掉频繁使用的页。另外,使用FIFO算法时,在未给予进程分配足够的页面数时,有时会出现给予进程的页面数增多,缺页次数反而增加的异常现象。FIFO算法简单,可采用队列实现。 **最近最少使用(Least Recently Used缩写为LRU)算法**。<mark>选择离当前时间最近的一段时间内使用得最少的页</mark>。这个算法的主要出发点是,如果某个页被访问了,则它可能马上就要被访问;反之,如果某个页长时间未被访问,则它在最近一段时间也不会被访问。 另外,还有最不经常使用的页面先淘汰(LFU,least frequent used)、最近没有使用的页面先淘汰(NUR)、最优淘汰算法(OPT,optimal replacement algorithm)等。

软考复习之其他知识点

# 其他 ## 数据结构 ### 强连通分量 有向非强连通图的<mark>极大</mark>强连通子图,称为强连通分量 ### 霍夫曼编码 [霍夫曼(Huffman)压缩(文件压缩机制)](https://blog.csdn.net/Charlesix59/article/details/119975011) ## 计算机组成原理 - 立即寻址:指令的地址字段指出的不是操作数的地址,而是操作数本身 - 直接寻址:指令中的形式地址部分即为有效地址 - 间接寻址:指令中的形式地址不是操作数的地址,而是 “操作数地址的地址” - 隐含寻址:指令中不直接给出操作数地址,操作数地址通常隐含在操作码或某个(约定)寄存器中 - 寄存器寻址:指令中的形式地址直接指出寄存器的编号,操作数存储于寄存器中 - 寄存器间接寻址:指令中的形式地址为寄存器的编号,寄存器的内容是操作数的有效地址 - 基址寻址:指令中的形式地址与基址寄存器内容之和为有效地址。 - 变址寻址:指令中的形式地址与变址寄存器内容之和为有效地址。 - 相对寻址:有效地址为程序计数器*PC*的值与形式地址之和。 - 堆栈寻址: - [寻址方式_百度百科 (baidu.com)](https://baike.baidu.com/item/%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F/3210621) ## 软件工程 ### McCabe算法 `V(G)=m−n+2p` 其中,V(G) 是有向图 G 中的环路数,m 是图 G 中弧的个数,n 是图 G 中的结点数,p 是图 G 中的强连通分量个数 ### SCI EMM - L1:CMMI一级,完成级。在完成级水平上,企业对项目的 目标与要做的努力很清晰。项目的目标得以实现。因此,任务是完成了。 但是由于任务的完成带有很大的偶然性,企业无法保证在实施同类项目的时候仍然能够完成任务。企业在一级上的项目实施对实施人员有很大的依赖性。 - L2:CMMI二级,管理级。在管理级水平上,企业在项目实施上能够遵守既定的计划与流程,有资源准备,权责到人,对相关的项目实施人员有相应的培训,对 整个流程有监测与控制,并与上级单位对项目与流程进行审查。企业在二级水平上体现了对项目的一系列的管理程序。这一系列的管理手段排除了企业在一级时完成 任务的随机性,保证了企业的所有项目实施都会得到成功。 - L3:CMMI三级,定义级。在定义级水平上,企业不仅仅能够对项目的实施有一整套的管理措施,并保障项目的完成;而且,企业能够根据自身的特殊情况以及 自己的标准流程,将这套管理体系与流程予以制度化。这样,企业不仅能够在同类的项目上得到成功的实施,在不同类的项目上一样能够得到成功的实施。科学的管 理成为企业的一种文化,企业的组织财富。 - L4:CMMI四级,量化管理级。在量化管理级水平上,企业的项目管理不仅仅形成了一种制度, 而且要实现数字化的管理。对管理流程要做到量化与数字化。通过量化技术来实现流程的稳定性,实现管理的精度,降低项目实施再质量上的波动。 - L5:CMMI五级,优化级。在优化级水品上, 企业的项目管理达到了最高的境界。企业仅仅能够通过信息手段与数字数手段来实现对项目的管理, 而且能够充分利用信息资料,对企业在项目实施的过程中可能出现的次品予以预防。能够主动地改善流程,运用新技术,实现流程的优化 CMMI是英文Capacity Maturity Model Integrated的简称。 中文的译意是能力成熟度集成模型。CMMI是CMM模型的最新版本。早期的能力成熟度模型是一种单一的模型其英文缩写为CMM,较多地用于软件工程。 ### 数据流图 [数据流图(DFD)_溢出的vector的博客-CSDN博客_数据流图](https://blog.csdn.net/weixin_46694417/article/details/120588235) #### 数据流图平衡 [【软件工程】数据流图 ( 数据字典 | 数据流图平衡原则 | 父图与子图平衡 | 子图内平衡 | 数据流图绘制原则 )_韩曙亮的博客](https://blog.csdn.net/shulianghan/article/details/109276722) ### 统一过程 (RUP) 统一过程有四个阶段,每个阶段又有多个任务。 ### 软件专利 这篇博客讲的还挺简单、详细的 [软考中级软件设计师---知识产权(自用)_嘟嘟的程序员铲屎官的博客](https://blog.csdn.net/weixin_42753193/article/details/124991506) ### 风险管理 **风险识别** 可以用不同的方法对风险进行分类。从宏观上来看,风险可以分为项目风险、技术风险和商业风险。<mark>项目风险识别潜在的预算、进度、个人、资源、用户和需求</mark>方面的问题。<mark>技术风包括识别潜在的设计、实现、接口、检验和维护</mark>方面的问题。而商业风险则主要来源于市场。 风险识别的重要工作就是将潜在的风险找到,文档化。 **风险估计** 风险估计使用两种方法来估计每一种风险。**一种方法是估计其发生的可能性;另一种方法是估计它可能带来的破坏性**。然后根据这样的结果对其进行排列优先级,对于那种可能性大、破坏力也大的风险就应该更加重视,拟定相应的解决方案才能够有效地防范。 **风险驾驭** 风险驾驭是指利用某种技术,如原型化、软件自动化、软件心理学、可靠性工程学,以及某些项目管理方法等设法避开或转移风险。 ### 内聚的分类 内聚的种类由紧到松(越紧越好)依次为: 1. **功能内聚**:指模块内的所有元素共同作用完成一个功能,缺一不可。 2. **顺序内聚**:指一个模块中的各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一个功能元素的输入。 3. **通信内聚**:指模块内所有处理元素都在同一个数据结构上。 4. **过程内聚**:指一个模块完成多个任务,这些任务必须按指定的过程执行。 5. **瞬时内聚**:把需要同时执行的任务或动作组合在一起(如初始化模块)。 6. **逻辑内聚**:模块完成逻辑上相关的一组任务。 7. **偶然内聚**:指一个模块内的各处理元素之间没有任何联系或有松散的联系。 ### 耦合的分类 耦合的种类从高到低(越低越好)依次为: 1. **内容耦合**:一个模块直接使用另一个模块的内部数据,或通过非正常入口转入另一个模块内部时,这种耦合关系就是内容耦合。 2. **公共耦合**:指一组模块访问一个公共数据环境,如全局数据结构。 3. **外部耦合**:指一组模块访问一个公共变量,这里指基本数据类型而不是数据结构(或者说对象)。 4. **控制耦合**:指一个模块调用另一个模块时,传递的是控制变量,被调用模块通过该控制变量的值选择执行模块内某一功能。那么也就是说,被调用的模块应具有多个功能。 5. **标记耦合**:耦合模块之间以数据结构传递(比如在 java 程序中,传递的就是一个对象)。 6. **数据耦合**:耦合模块之间有调用关系,传递的是简单数据类型的值(比如在 java 程序中,传递的就是一个基本数据类型的值)。 7. **无直接耦合**:指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。 ### 软件体系结构风格 ~~考得不多,但不是不考~~ [13种常见软件体系结构风格定义分析、结构图、优缺点_Jayphone17的博客](https://blog.csdn.net/Jayphone17/article/details/103651076) ## 操作系统 ### 进程分配图 [ 资源分配图化简法_coding1994的博客-CSDN博客](https://blog.csdn.net/coding1994/article/details/52474731) ### 硬盘位视图 [位示图_百度百科 (baidu.com)](https://baike.baidu.com/item/%E4%BD%8D%E7%A4%BA%E5%9B%BE/2475925?fr=aladdin) 一bit代表一个硬盘块 ### Flynn算法 [Flynn分类法 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/413778318) ### 实时系统 实时操作系统是保证在一定时间限制内完成特定功能的操作系统。 #### 分类 实时操作系统有硬实时和软实时之分,**硬实时要求在规定的时间内必须完成操作**,这是在操作系统设计时保证的;**软实时则只要按照任务的优先级,尽可能快地完成操作即可**。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。 #### 要求 - 多任务 - 处理能被区分优先次序的进程线 - 一个中断水平的充分数量 #### 特征 - 高精度计时系统 - 多级中断机制 - 实时调度机制 ## 计网 ### 实现IPv4到IPv6的通信 #### 双栈协议 在IPv6实现之前,使一部分主机装有双协议栈:一个IPv4和一个IPv6。经过IPv4网络时将IPv6报文头转化为IPv4报文头 #### 隧道技术 在IPv6报文将要进入IPv4网络的时候将IPv6数据报封装在IPv4数据报里面

软考复习之安全性措施

# 安全性措施 ## 加密算法 ### 术语 - [明文](https://baike.baidu.com/item/%E6%98%8E%E6%96%87?fromModule=lemma_inlink),即原始的或未加密的[数据](https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE?fromModule=lemma_inlink)。通过[加密算法](https://baike.baidu.com/item/%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95?fromModule=lemma_inlink)对其进行加密 - 密文,明文加密后的格式,是加密算法的输出信息。密文不应为无[密钥](https://baike.baidu.com/item/%E5%AF%86%E9%92%A5?fromModule=lemma_inlink)的用户理解,用于数据的存储以及传输; - 加密,把明文转换为密文的过程; - 加密算法,加密所采用的变换方法,[加密算法](https://baike.baidu.com/item/%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95?fromModule=lemma_inlink)的输入信息为明文和[密钥](https://baike.baidu.com/item/%E5%AF%86%E9%92%A5?fromModule=lemma_inlink); - 密钥,是由数字、字母或特殊符号组成的字符串,用它控制数据加密、解密的过程;加密算法是公开的,[密钥](https://baike.baidu.com/item/%E5%AF%86%E9%92%A5?fromModule=lemma_inlink)则是不公开的 - 解密,对密文实施与加密相逆的变换,从而获得明文的过程; - 解密算法,解密所采用的变换方法。 ### 简介 数据加密是对明文按照某种加密算法进行处理,形成密文。这样一来,密文即使被截获,截获方也无法或难以解码,从而防止泄露信息。 - 秘密密钥加密体制K1=K2:加密和解密采用相同的密钥,因而又称为对称密码体制。因为加密速度快,通常用来加密大批量的数据。 - 公开密钥加密体制K1≠K2:又称不对称密码体制,其加密和解密使用不同的密钥;其中一个密钥是公开的,另一个密钥则是保密的。由于加密速度较慢,所以往往用在数据量较小的通信业务中。 ### 目的 - 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改; - 应具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握; - 密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础; - 实现经济,运行有效,并且适用于多种完全不同的应用。 ### 具体算法 #### DES算法 **简介**: DES全称为Data Encryption Standard,即数据加密标准,是一种使用[密钥加密](https://baike.baidu.com/item/%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86/5928903?fromModule=lemma_inlink)的块算法 **参数:** DES算法的入口参数有三个:**Key、Data、Mode**。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 **历史沿革**: 一般DES算法的密钥长度为56位,为了加速DES算法和RSA算法的执行过程,可以用硬件电路来实现加密和解密。针对DES密钥短的问题,科学家又研制了80位的密钥,以及在DES的基础上采用三重DES和双密钥加密的方法。即用两个56位的密钥K1、K2,发送方用K1加密,K2解密,再使用K1加密。接收方则使用K1解密,K2加密,再使用K1解密,其效果相当于将密钥长度加倍。 #### RSA算法 **简介** 在公开密钥密码体制中,**加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的**。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK **过程** 先生成一对RSA密钥,**其中之一是保密密钥,由用户保存**;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与[公开密钥加密](https://baike.baidu.com/item/%E5%85%AC%E5%BC%80%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86/8090774?fromModule=lemma_inlink)方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要 **算法** 略,可参考[RSA算法_百度百科](https://baike.baidu.com/item/RSA%E7%AE%97%E6%B3%95) #### 其他算法 - 国际数据加密算法(IDEA)在1990年正式公布。这种算法是在DES算法的基础上发展起来的,类似于三重DES.发展IDEA也是因为感到DES具有密钥太短等缺点,IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。 - 1993年4月16日,美国政府推出了cipper密码芯片,该芯片采用美国国家安全局设计的Skipjack加密算法。采用Cipper的加密体制能为信息传输提供高等级的安全和保密,该体制是以防篡改硬件器件(Cipper芯片)和密钥Escrow(第三方托管)系统为基础的。 - 1994年2月14日,美国政府宣布了Escrow加密标准,其加密算法使用Skipjack.该算法采用80位密钥和合法强制访问字段(aw Enforcement Access Fied,EAF),以便在防篡改芯片和硬件上实现。由于使用了80位的密钥,Skipjack算法具有较高的强度。 | 名称 | 对称性 | 特点 | 密钥长度(通常) | |------|-----|--------------|----------| | DES | 对称 | 不够安全 | 56 | | RSA | 不对称 | 安全性高,速度慢 | 512 | | IDEA | 对称 | 速度快,密钥管理复杂困难 | 128 | ## 身份认证技术 数字签名用来保证信息传输过程中信息的完整和提供信息发送者的身份认证和不可抵赖性,该技术利用公开密钥算法对于电子信息进行数学变换,通过这一过程,数字签名存在于文档之中,不能被复制 ### 哈希签名 Hash签名不属于强计算密集型算法,应用较广泛。Hash的主要局限是接收方必须持有用户密钥的副本以检验签名,因为双方都知道生成签名的密钥,较容易攻破,存在伪造签名的可能。 #### MD5 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的[密码散列函数](https://baike.baidu.com/item/%E5%AF%86%E7%A0%81%E6%95%A3%E5%88%97%E5%87%BD%E6%95%B0/14937715?fromModule=lemma_inlink),**可以产生出一个128位(16[字节](https://baike.baidu.com/item/%E5%AD%97%E8%8A%82/1096318?fromModule=lemma_inlink))的散列值(hash value)**,用于确保信息传输完整一致。 ### RSA签名 RSA既可以用来加密数据,也可以用于身份认证。 RSA算法中数字签名技术实际上是通过一个Hash函数来实现的。数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。不同的文件将得到不同的数字签名。 ### DSS算法 对数字签名和公开密钥加密技术来说,都会面临公开密钥的分发问题,即如何把一个用户的公钥以一种安全可靠的方式发送给需要的另一方。这就要求管理这些公钥的系统必须是值得信赖的。 所以,必须有一项技术来解决公钥与合法拥有者身份的绑定问题。假设有一个人自称某一个公钥是自己的,必须有一定的措施和技术来对其进行验证。 **数字证书**是解决这一问题的有效方法。它通常是一个签名文档,标记特定对象的公开密钥。**数字证书由一个认证中心(CA)签发**,认证中心类似于现实生活中公证人的角色,它具有权威性,是一个普遍可信的第三方。当通信双方都信任同一个CA时,两者就可以得到对方的公开密钥,从而能进行秘密通信、签名和检验。 #### 数字证书的基本工作原理: 第一,发送方在发送信息前,需先与接收方联系,同时利用公钥加密信息,信息在进行传输的过程当中一直是处于[密文](https://baike.baidu.com/item/%E5%AF%86%E6%96%87/9684333?fromModule=lemma_inlink)状态,包括接收方接收后也是加密的,确保了信息传输的[单一性](https://baike.baidu.com/item/%E5%8D%95%E4%B8%80%E6%80%A7/6153534?fromModule=lemma_inlink),若信息被窃取或截取,也必须利用接收方的[私钥](https://baike.baidu.com/item/%E7%A7%81%E9%92%A5/8973452?fromModule=lemma_inlink)才可解读数据,而无法更改数据,这也有利保障信息的完整性和安全性。 [3] 第二,数字证书的数据[签名](https://baike.baidu.com/item/%E7%AD%BE%E5%90%8D/2890277?fromModule=lemma_inlink)类似于[加密](https://baike.baidu.com/item/%E5%8A%A0%E5%AF%86/752748?fromModule=lemma_inlink)过程,数据在实施加密后,只有接收方才可打开或更改数据信息,并加上自己的[签名](https://baike.baidu.com/item/%E7%AD%BE%E5%90%8D/2890277?fromModule=lemma_inlink)后再传输至发送方,而接收方的[私钥](https://baike.baidu.com/item/%E7%A7%81%E9%92%A5/8973452?fromModule=lemma_inlink)具唯一性和[私密性](https://baike.baidu.com/item/%E7%A7%81%E5%AF%86%E6%80%A7/7896067?fromModule=lemma_inlink),这也保证了签名的[真实性](https://baike.baidu.com/item/%E7%9C%9F%E5%AE%9E%E6%80%A7/6345696?fromModule=lemma_inlink)和[可靠性](https://baike.baidu.com/item/%E5%8F%AF%E9%9D%A0%E6%80%A7/512935?fromModule=lemma_inlink),进而保障信息的安全性。 简单来说,发送方用**公钥**加密信息,接收方收到后用**接收方的私钥**解密

软考复习之软件需求

# 软件需求 软件需求是 (1)用户解决问题或达到目标所需条件或权能(Capability)。 (2)系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或权能。 (3)一种反映上面(1)或(2)所述条件或权能的文档说明。 它包括功能性需求及非功能性需求,非功能性需求对设计和实现提出了限制,比如性能要求,质量标准,或者设计限制。 ## 类型 - 业务需求(Business Requirments):组织或者客户高层次的目标,从宏观上描述开发系统的必要性、意义和目标,具有以业务为想到、可度量、合理、可行的特点。BR的核心部分是业务建模,对当前企业当前业务流程进行评估,并对新开发系统的业务处理流程进行展望。 - 用户需求(User Requirements):用户要求系统必须要完成的任务,即用户要系统做什么,产生什么业务价值。 - 系统需求(System Requirments):整个系统的顶级需求,由系统分析人员对UR进行分析、提炼、整理,从而生成指导开发的、更准确地软件需求。完整的表达了软件项目的预期特征,为接下来的软件设计和测试提供了依据和基础。 - 功能需求(Functional Requirements):规定开发人员必须在产品中要实现的软件功能 ### 非功能性需求 - 产品必须遵从的规范、标准和合约 - 外部界面的具体细节 - 性能需求 - 设计或实现的约束条件及质量属性 ## 过程标准 清楚(Clear)、完整(Complete)、一致(Consistent)、可测试(Testable)。 此外还有其他的概念,如可跟踪的、可修改的等等

软考复习之KMP算法

# KMP算法 KMP算法我曾今写过一篇[博客](https://blog.csdn.net/Charlesix59/article/details/119875803)讲过,但是我当时觉得这个算法好烂,就没细讲,后来发现他们还挺喜欢考这个算法的,于是我再开帖讲一下 ## 自然语言描述 自然语言描述是我根据《algorithm》的内容以及我自己的理解写出来的,,一般来说是正确的计算next[]与解释KMP的算法,这个方法比较考验悟性,但是原理确实是这样😂 ![](kmp/1.png) ## 考研教材解释 我们还是拿`pat=abcac`举例子,我们从a开始取字串,然后找前缀与后缀的最长相等长度 - ”a“最长相等长度为0 - "ab"最长相等长度0 - "abc"最长相等长度0 - "abca"最长相等长度1 - "abcac"最长相等长度0 所以我们可以得到PM={0,0,0,1,0} 但是我们有公式`右移位数=已匹配的字符数-对应的部分匹配值` 然后 <mark>对应的部分匹配值 是 j 前一个值</mark>,于是为了方便我们把PM整体右移一位,并用-1作为next[0]的值,得到`next[]={-1,0,0,0,1}` 所以我们有公式: `Move=(j-1)-next[j]` 这就相当于我们将J回退到: `j回退到的位置=j-Move=j-((j-1)-next[j])=next[j]+1` 所以我们就可以都得到next[]的新的形式: `next[]={0,1,1,1,2}` <mark>这里next[]的含义是在j处匹配失败后,j回退到的位置</mark> ## 拓展:更底层的匹配方法 实际上,KMP算法应该生成一个有限状态自动机(DFA),然后通过DFA去匹配字串 继续按照`pat=abcac`为例,画出的DFA如下: ![](kmp/2.jpg) 生成DFA的算法如下 ```cpp /*KMP字符串查找*/ class KMP { private: std::string pat; const static int r = 256; int *dfa[r]; //建立一个二维数组 public: KMP(std::string pat) { this->pat = pat; int m = pat.length(); for (int i = 0; i < r; i++) { dfa[i] = new int[m]; std::fill(dfa[i], dfa[i] + m, 0); } dfa[pat[0]][0] = 1; for (int x = 0, j = 1; j < m; j++) { for (int c = 0; c < r; c++) { dfa[c][j] = dfa[c][x]; //复制匹配失败情况下的值 } dfa[pat[j]][j] = j + 1; //设置匹配成功情况下的值 x = dfa[pat[j]][x]; //更新重启状态 } } int seatch(std::string txt) { int i, j, n = txt.length(), m = pat.length(); for (i = 0, j = 0; i < n&&j < m; i++) { j = dfa[txt[i]][j]; } if (j == m) return i - m; //找到匹配 else return n; //未找到匹配 } }; ```