软件设计师备考笔记(文末复习资料分享)

软考学习笔记

一、数据的表示

  • R进制转十进制使用按权展开法
  • 二进制符号位:0代表正数,1代表负数
  • 二进制转八进制:按三位划分计算
  • 二进制转十六进制:按四位划分计算
  • 正数的原码、反码、补码相同
  • 负数的反码:在原码的基础上除符号位全部取反
  • 负数的补码:在反码的基础上+1
  • 负数的补码转原码:除符号位全部取反 +1
  • 移码:在补码的基础上将符号位取反
  • 减法运算:使用两个数的补码相加

二、数值表示范围

  • 定点整数

    • 原码 -(2^n-1-1) ~ +(2^n-1-1)
    • 反码 -(2^n-1-1) ~ +(2^n-1-1)
    • 补码 -2^n-1 ~ +(2^n-1-1)
    • 移码 -2^n-1 ~ +(2^n-1-1)
  • 定点小数

    • 原码 -(1-2^-(n-1)) ~ +(1-2^-(n-1))
    • 反码 -(1-2^-(n-1)) ~ +(1-2^-(n-1))
    • 补码 -1 ~ +(1-2^-(n-1))
    • 移码 -1 ~ +(1-2^-(n-1))

三、浮点的运算

  • 浮点数表示:N = 尾数 * 基数^指数
  • 运算过程:对阶 》 尾数运算 》 结果格式化
  • 特点
    • 一般尾数用补码,阶码用移码
    • 阶码的尾数决定数的表示范围,位数越多范围越大
    • 尾数的尾数决定数的有效精度,位数越多精度越高
    • 对阶时,小数向大数看齐
    • 对阶是通过较小数的尾数右移实现的
  • 浮点数存储方式: 阶符 | 阶码 | 尾符 | 尾码

四、计算机结构

  • 外设
    • 输入设备
    • 存储器 辅助存储器
    • 输出设备
  • 主机
    • 主存储器
    • CPU
      • 运算器
        1. 算数逻辑单元ALU:数据的算数运算和逻辑运算
        2. 累加寄存器AC:通用寄存器,为ALU提供一个工作区,用在暂存数据
        3. 数据缓冲寄存器DR:写内存时,暂存指令或数据
        4. 状态条件寄存器PSW:存状态标志与控制标志(争议:也有将其归为控制器的)
      • 控制器
        1. 程序计数器PC :存储下一条要执行指令地址
        2. 指令寄存器IR:存储即将执行的指令
        3. 指令译码器 ID:对指令中的操作码字段进行分析解释
        4. 时序部件:提供时序控制信号
        5. 地址寄存器DR: 记录当前指令地址

五、计算机体系结构分类-Flynn

  • 单指令流单数据流SISD
    • 控制部分 处理器 主存模块 均一个
    • 代表:单处理器系统
  • 单指令流多数据流SIMD
    • 处理器和主存模块多个
    • 关键特性:个处理器以异步的形式执行同一条指令
    • 代表:并行处理机,阵列处理机,超级向量处理机
  • 多指令流单数据流MISD
    • 控制器和主存模块多个
    • 被证明不可能,至少是不实际
    • 目前咩有,有文献称流水线计算机为此类
  • 多指令流多数据流MIMD
    • 控制部分,处理器,主存模块均为多个
    • 能够实现作业,任务,指令等各级全面并行
    • 多处理机系统,多计算机

六、指令的基本概念

  • 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式: 操作代码字段|地址码字段
  • 操作码部分指出了计算机要执行什么性质的操作,如加法、减法、取数、存数等。地址码字段需要包含各操作结果的存放地址等,从其地址结构的角度可以分为三地址指令、二地址指令、一地址指令和零地址指令。

七、寻址方式

  • 立即寻址方式
    • 操作数直接在指令中,速度快,灵活性差
  • 直接寻址方式
    • 指令中存放的是操作数的地址
  • 间接寻址方式
    • 指令中存放了一个地址,这个地址对应的内容是操作数的地址
  • 寄存器寻址方式
    • 寄存器存放操作数
  • 寄存器间接寻址方式
    • 寄存器内存放的是操作数的地址

八、CISC与RISC

  • CISC(复杂)
    • 数量多,使用频率差别大,可变长格式
    • 寻址方式支持多种
    • 实现方式:微程序控制技术(微码)
    • 研制周期长
  • RISC(精简)
    • 数量少,使用频率接近,定长格式,大部分为单周期指令,操作寄存器,只有Load/Store操作内存
    • 寻址方式支持方式少
    • 实现方式:增加了通用寄存器;硬布线逻辑控制为主适合采用流水线
    • 优化编译,有效支持高级语言
  • CISC与RISC比较维度:指令数量,指令使用频率,寻址方式,寄存器,流水线支持,高级语言支持
    • CISC:复杂,指令数量多,频率差别大,多寻址
    • RISC:精简,指令数量少,操作寄存器,单周期,少寻址,多通用寄存器,流水线

九、流水线

  • 指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的,她们可同时为多条指令的不同部分进行工作,以提高各部件的利用率和指令的平均执行速度。

  • 流水线周期为执行时间最长的一段

  • 流水线计算公式为:1条指令执行时间 + (指令条数-1)*流水线周期

    • 理论公式:(t1+t2+...tk)+(n-1)*△t
    • 实践公式:k*△t+(n-1)*△t
    • △t指的就是流水线执行周期 ,K为步骤数量

    一条指令的执行过程可以分解为取值、分析和执行三步,在取指时间t取指=3△t、分析时间t分析=2△t、执行时间t执行=4△t的情况下,若按串行方式执行,则10条指令全部执行完需要(90)△t,若按流水线的方式执行,流水线周期为(4)△t,则10条指令全部执行完需要(45)△t。

  • 超标量流水线

    • 度:有几条流水线就是几度
  • 流水线吞吐率计算

    • 流水线吞吐率 TP 是指单位时间内流水线所完成的任务数量或输出的结果数量。计算流水线吞吐率的最基本的公式:

      TP = 指令条数 / 流水线执行时间

      上题吞吐率为:10 / 45△t

    • 流水线最大吞吐率

      TPmax = Lim n->∞*n / (k+n-1)△t = 1 / △t

      上题最大吞吐率: 1 / 4△t

十、层次化存储结构

  • CPU 寄存器 最快,但容量小,成本高
  • Cache 按内容存取
  • 内存(主存) 分两类:随机存储器(RAM) 只读存储器(ROM)
  • 外存(辅存)硬盘,光盘,U盘等

十一、Cache

  • 概念

    • 在计算机的存储系统体系中,Cache是访问速度最快的层次(若有寄存器,则寄存器最快)

    • 使用Cache改善系统性能的依据是程序的局部性原理

    • 如果以h代表对Cache的访问命中率,t1表示Cache的周期时间,t2表示主存储器周期的时间,以读操作为例,使用“Cache + 主存储器”的系统的平均周期为t3,则:

      t3 = h * t1 + (1-h) * t2

      其中,(1-h)又称为失效率(未命中率)

  • 映像

    • 直接相联映像:硬件电路较简单,但冲突率很高
    • 全相联映像:电路难于设计和实现,只适合小容量的cache,冲突率较低
    • 组相联映像:直接相联与全相联的折中
    • 地址映像是将主存与Cache的存储空间划分为若干大小相同的页(称为块)
      • 例如,某机的主存容量为1GB,划分为2048页,每页512KB;Cache容量为8MB,划分为16页,每页512KB.

十二、主存-编址与计算

  • 存储单元

  • 按字编址:存储体的存储单元是字存储单元,即最小寻址单位是一个字

  • 按字节编址:存储体的存储单元是字节存储单元,即最小寻址单位是一个字节 1 byte = 8 bit

  • 根据存储器所要求的容量和选定的存储芯片的容量,就可以计算出所需芯片总数,即:

    • 总片数 = 总容量 / 每片的容量
  • 例:若内存地址区间为4000H~43FFH,每个存储单元可存储16位二进制数,该内存区域用4片存储器芯片构成,则构成该内存所用的存储器芯片的容量是多少?

    43FFH - 4000H +1 = 4400H - 4000H = 400H

    十六进制一位代表4位二进制,400H = 0100 0000 0000

    2 的10次方 * 16bit / 4 = 256 * 16bit

十三、总线

  • 一条总线同一时刻仅允许一个设备发送,但允许多个设备接收。
  • 总线的分类:
    • 数据总线(Data Bus):在CPU与RAM之间来回传送需要处理或是需要存储的数据。
    • 地址总线(Address Bus):用来指定在RAM(Random Access Memory)之中存储的数据的地址。
    • 控制总线(Control Bus):将微处理器控制单元(Control Unit)信号传送到周边设备,一般常见的为USB Bus和1394 Bus。

十四、串联系统与并联系统

  • 可靠性计算公式:
    • 串联型:R = R1 * R2 * ... * Rn
    • 并联型:R = 1 - (1-R1)*(1-R2)*...*(1-Rn)

十五、N模混合系统

十六、校验码

  • 基础知识
    • 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制数就称为数据校验码的码距。
    • 例如,用4位二进制表示16种状态,则有16个不同的码字,此时码距为1,如0000与0001。
  • 奇偶效验
    • 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(效验位)组成校验码。
    • 奇校验:整个校验码(有效信息和校验位)中“1”的个数为奇数。
    • 偶校验:整个校验码(有效信息和校验位)中“1”的个数为偶数。
    • 奇偶校验,可检查1位的错误,不可纠错。
  • 循环校验码CRC
    • CRC校验,可检错,不可纠错。
  • 海明校验码
    • 海明校验,可检错,也可纠错
    • 在有效信息位中加入几个校验位形成海明码,是码距比较均匀的拉大,并把海明码的每个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的一个校验位的值发生变化,这不但可以发现错误,还能指出错误的位置,为自动纠错提供了依据。
    • 2 ^r >= m + r + 1
    • 编码集的海明码距为d+1,那么可以检测出d位的错误
    • 编码集的海明码距为2d+1,那么可以纠正d位错误

十八、存储管理

  • 页式存储组织

    • 将程序与内存划分为同样大小的快,以页为单位将程序调入内存。

    • 优点:利用率高,碎片小,分配及管理简单

    • 缺点:增加了系统开销;可能产生抖动现象

    • 逻辑地址 = 页号 + 内存地址

    • 物理地址 = 页侦号 + 页内地址

    • 例如,页式存储系统中,每个页的大小为4k,将逻辑地址转换为对应的物理地址:

      逻辑地址:10 1100 1101 1110

      从题目我们可以知道每页大小为4k,也就是10的12次方,所以后面的十二位二进制为页内地址,不需要变化。由前面的二位二进制10可以得出页号为2,从图中可以看到页号2对应的页侦号为6。

      所以对应的物理地址为:110 1100 1101 1110

  • 段式存储

    • 段长表示该段能够存储的长度,基址代表起始位置。0段长度不能超过30k。

    • 优点:多道程序共享内存,各段程序修改互不影响

    • 缺点:内存利用率低,内存碎片浪费大

  • 段页式存储

    • 优点:空间浪费小、存储共享容易、存储保护容易、能动态连接

    • 缺点:由于管理软件增加,复杂性和开销也随之增加,需要的硬件以及占用的内容也有所增加,使得执行速度大大下降。

  • 页面置换算法

  • 磁盘管理

    • 磁道
    • 扇区
    • 存取时间 = 寻道时间 + 等待时间,寻道时间是指磁头移动到磁道需要的时间,等待的时间为等待读写的扇区转到磁头下方所用的时间。
  • 磁盘调度算法

    • 先来先服务 FCFS
    • 最短寻道时间优先 SSTF
    • 扫描算法 SCAN
    • 循环扫描 CSCAN 算法
  • 读取磁盘数据时间计算

    • 读取磁盘数据的时间应包括以下三个部分:

      1. 找磁道的时间
      2. 找块(扇区)的时间,即旋转延迟时间
      3. 传输时间

      某磁盘磁头从一个磁道移至另一个磁道需要10ms,文件在磁盘上非连续存放,逻辑上相邻数据块的平均移动距离为10个磁道,每块的旋转延迟时间及传输的时间分别为100ms和2ms,则读取一个100块的文件需要多少ms时间?

      ((10 * 10)+ 100 + 2)* 100 = 20200

十九、作业管理

  • 作业调度算法
    • 先来先服务法
    • 时间片轮转法
    • 短作业优先法
    • 最高优先权优先法
    • 高响应比优先法

十四、文件管理-索引文件结构

十五、文件管理-树型目录结构

  • 考察相对路径和绝对路径
  • 相对路径在本身目录下面找,不要包括本身目录
  • 绝对路径从根目录开始找

十六、文件管理-空闲存储空间的管理

十七、设备管理-数据传输控制方式

  • 程序控制(查询)方式:分为无条件传送和程序查询方式两种。方法简单,硬件开销小,但I/O能力不高,严重影响CPU的利用率。
  • 程序中断方式:与程序控制方式相比,中断方式因为CPU无需等待而提高了传输请求的响应速度。
  • DMA方式:DMA方式是为了在主存与外设之间实现高速、批量数据交换而设置的。DMA方式比程序控制方式与中断方式都高效。
  • 通道方式
  • I/0处理机
  • 以上方式从上往下效率越来越高

十八、设备管理-虚设备与SPOOLING技术

  • SPOOLing是关于慢速字符设备如何与计算机交换信息的一种技术,通常称为“假脱机技术”。SPOOLing技术通过磁盘实现。
  • 采用队列的方式处理等待数据

十九、数据库系统

一、三级模式-两层映射

二、数据库设计过程

三、E-R模型

  • 矩形框代表实体
  • 椭圆代表属性
  • 菱形代表联系
  • 矩形有两竖线代表弱实体,弱实体是某一实体的特殊化,使用一个圈两边线连接

1、1:1联系

2、1:n联系

3、m:n联系

  • 一个实体型转换为一个关系模式
  • 联系转关系模式:
    • 1:1联系:可将联系合并至任意一端的实体关系模式中
    • 1:n联系:可以将联系合并至n端实体关系模式中
    • m:n:联系必须单独转成关系模式
  • 三个以上实体间的一个多元联系

4、关系代数

  • 笛卡尔积

  • 投影

  • 选择

  • 联接

5、规范化理论-候选码

  • 通过题目可以画出右边所示关系图,寻找0入度节点,然后看这个节点能否走完全程。

  • 通过题目可以画出右边所示关系图,寻找0入度的节点,这道题候选码为ABDC

  • 通过题目可以画出右边所示关系图,寻找0入度的节点,这道题有进有出的节点有A和B,这两个节点都可以遍历全图,所以答案为A和B

5、规范化理论-主属性

  • 从关系中可以看出,(ST,City)可以推倒出zip为候选键,(ST,Zip)中,Zip可以推导出City,(ST,City)又可以推导出Zip。所以在这个例题中都是主属性。

5、规范化理论-范式

  • 在系名称高级职称人数可以分为教授和副教授,不符合原子性,所以不满足1NF,如果要满足1NF则需要将教授和副教授拆分出来。

  • 第二范式(2NF):当且仅当关系模式R是第一范式(1NF),且每一个非主属性完全依赖候选键(没有不完全依赖)时,则称关系模式R是第二范式。

  • 第三范式(3NF):当且仅当关系模式R是第二范式(2NF),且R中没有非主属性传递依赖于候选键时,则关系模式R是第三范式。

  • BC范式(BCNF):设R是一个关系模式,F是它的依赖集,R属于BCNF当且仅当其F中每个依赖决定因素必定包含R的某个候选码。

6、规范化理论-模式分解

无损分解(公式法)

7、SQL

  • 建表语句(掌握创建语句写法,主键,外键,关联等单词)

  • 删除与修改

  • 查询

8、并发控制

  • 事务:原子性,一致性,隔离性,持续性
  • 并发产生的问题:丢失更新,不可重复问题,读“脏”数据
  • 解决方案:
    • 封锁协议:S封锁,X封锁,两段锁协议
    • 死锁:预防,死锁的解除

9、数据库完整性约束

  • 实体完整性约束(主键:非空,唯一)

  • 参照完整性约束(外键)

  • 用户自定义完整性约束

    √ 触发器

二十、计算机网络与信息安全

一、OSI/RM七层模型

TCP传输可靠性比较高的数据

ARP:地址解析协议

RARP:反向地址解析协议

ICMP:英特网控制协议

IGMP:组播协议,网关信息协议

二、TCP/IP协议族

110、80等是端口地址

三、IP地址

  • 五类IP地址(32位二进制)
    • A类:起始位0,网络号7位,主机号24位 范围:0-127
    • B类:起始位 1 0,网络号共16位,主机号16位 范围:128-191
    • C类:起始位 1 1 0,网络号共24位,主机号8位 范围:192-223
  • 可分配主机地址个数为2的主机号位数次方减2

四、子网划分

  1. 子网掩码

  2. 将一个网络划分为多个子网(取部分主机号当子网号)

  3. 将多个网络合并成一个大的网络(取部分网络号当主机号)

  4. 该题要划分27个子网,需要2的5次方,所以需要从主机位借5位当网络为,网络为全为1计算得出子网掩码。

    由题意每个子网内有主机700台可以得出,2的10次方可满足需求,也就是说只需要10个主机位即可,多余6个主机位可以借给网络位。

五、网络规划与设计

  • 需求分析
    • 网络功能要求
    • 网络的性能要求
    • 网络运行环境要求
    • 网络的可扩充性和可维护性要求
  • 网络规则原则
    • 实用性原则
    • 开发性原则
    • 先进性原则
  • 网络设计与实施原则
    • 可靠性原则
    • 安全性原则
    • 高效性原则
    • 可扩展性原则
  • 层次化网络设计
    • 核心层 核心交换机
    • 汇聚层 汇聚交换机
    • 接口层 接入交换机

六、计算机网络分类

  • 按分布范围分
    • 局域网 LAN 10公里内
    • 城域网 MAN
    • 广域网 WAN
    • 因特网
  • 按拓扑结构分
    • 总线型
    • 星型
    • 环型

七、网络接入技术

八、HTML

九、对称加密技术

  • 特点:

    • 加密强度不高,但效率高
    • 密钥分法困难
  • 常用对称密钥加密算法:DES、3DES、RC-5 、IDEA算法

十、非对称加密技术

  • 密钥必须成对使用(公钥加密,相对应私钥解密)

  • 特点:加密速度慢,但强度高

  • 常见非对称密钥加密算法:RSA、ECC

十一、数字签名

十二、消息摘要

常用的消息摘要算法:MD5,SHA等,市场上广泛使用的MD5,SHA算法的散列值分别为128和160位,由于SHA通常采用的密钥长度较长,因此安全性高于MD5。

十三、PKI公钥体系

十四、网络安全-各个网络层次的安全保障

  • 物理层
    • 隔离
    • 屏蔽
  • 数据链路层
    • 链路加密
    • PPTP
    • L2TP
  • 网络层
    • 防火墙
    • IPSec
  • 传输层
    • TLS TLS是基于SSL的3.0协议
    • SET
  • 应用、表示、会话层
    • PGP 加密邮件协议
    • Https 网页访问

十五、主动攻击与被动攻击

  • 被动攻击
    • 监听(保密性)
      • 消息内容获取
      • 业务流分析
  • 主动攻击
    • 中断(可用性)
    • 篡改(完整性)
    • 伪造(真实性)

十六、Dos(拒绝服务)与DDos

黑客利用傀儡机对某服务器不断进行请求,导致服务器崩溃无法处理真实请求。

十七、木马与病毒

  • 木马是窃取信息,将信息传输到黑客可以接收到的位置
  • 病毒是直接破坏计算机

二十一、系统开发基础

一、软件开发模型

  • 瀑布模型

    适用于需求比较明确的项目,要很少发生需求变更。一开始需求要明确,否则发生需求变更将导致延期甚至无法完成。瀑布模型的每个阶段都有产出,可行性分析文档,需求分析文档,系统概要设计文档,详细设计文档等。

    软件计划-需求分析-软件设计-程序编码-软件测试-运行维护

  • V模型

    需求分析-概要设计-详细设计-编码-v模型-单元测试-集成测试-系统测试-验收测试

    单元测试测试的是编码,以详细设计为依据

    集成测试测试详细设计,以概要设计为依据

    系统测试测试概要设计,以需求分析为依据

    验收测试是以用户为主导的测试。

    和瀑布模型一样,同样把测试放在了编码完成以后,一旦测试不通过,编码出现问题,则需要推倒重来,产生维护成本高。

  • 喷泉模型

    面对对象开发模型,每个阶段没有明确的界限,可以几个阶段并行,一定程度上提高开发效率,节约成本。在管理方面更加严格。

    分析-设计-实现-测试-维护-演化

  • 原型化模型

    通过与用户沟通产生原型

    • 探索模型
    • 实验模型
    • 演化模型
  • 螺旋模型

    螺旋模型综合了瀑布模型和原型的优点,强调的是有风险的分析,原型模型适合开发高风险项目。缺点在于风险分析阶段成本会增加。

  • 统一过程 RUP

    用例驱动,以架构为中心,迭代和增量

    初始-细化-构建-交付

    • 初始

      确定项目范围和边界,识别系统的关键用例,展示系统的候选架构,估计项目费用和时间,评估项目风险

    • 细化

      分析系统问题领域,建立软件架构基础

    • 构建

      开发剩余的构建,构建组装

    • 交付

      进行验收测试,制作发布版本,用户文档定稿,确认新系统,培训、调整产品

  • 敏捷方法

    • XP 极限编程

      在一些对费用控制严格的公司中使用,被证明非常有效

    • Cockburn水晶系列方法

      用最少的纪律约束而仍能成功的方法,从而在产出效率与易于运作上达到一种平衡

    • 开发式源码

      程序开发人员在地域上分布很广

    • SCRUM 并列争求法

      明确定义了可重复的方法过程,为明确定义了的可重复的人员所用,去解决明确定义了的可重复的问题。

    • Coad的功用驱动开发用法

    • ASD方法

      自适应软件开发方法,核心是三个非线性的,重叠的开发阶段:猜测、合作与学习。

二、软件开发方法

  • 结构化方法(面向数据流的方法)

    用户至上

    严格区分工作阶段,每阶段有任务和结果

    强调系统开发过程的整体性和全局性

    系统开发过程工程化,文档资料标准化

    自顶向下,逐步分解(求精)

    不适用与开发大型复杂的项目

  • 原型法

  • 面向对象方法(喷泉模型)

    更好的复用性

    关键在于建立一个全面、合理、统一的模型

    分析、设计、实现三个阶段,界限不明确

  • 面向服务的方法 SOA

三、需求分析

  • 需求的任务

  • 需求的过程

    问题识别

    分析与综合

    编制需求分析文档

    需求分析与评审

  • 需求的分类

    功能需求

    非功能需求

    设计约束

  • 应用的工具

    数据流图(DFD)

    数据字典(DD)

    判定表

    判定树(决策树)

四、软件设计

  • 高内聚,低耦合
  • 应用工具
    • IPO图
    • PDL
    • PAD
    • 程序流程图
    • N/S盒图
  • 内聚由高到低(考察排序或通过描述选择内聚类型):
    • 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可
    • 顺序内聚:处理元素先关,而且必须顺序执行
    • 通信内聚:所有处理元素集中在一个数据结构的区域上
    • 过程内聚:处理元素相关,而且必须按特定的次序执行
    • 瞬时内聚(时间内聚):所包含的任务必须在同一时间间隔内执行
    • 逻辑内聚:完成逻辑上相关的一组任务
    • 偶然内聚(巧合内聚):完成一组没有关系或松散关系的任务
  • 耦合类型由低到高:
    • 非直接耦合:两个模块之间没有直接关系,他们之间的联系完全是通过主模块的控制和调用来实现的
    • 数据耦合:一组模块借助参数表传递简单数据
    • 标记耦合:一组模块通过参数表传递记录信息(数据结构)
    • 控制耦合:模块之间传递的信息中包含用于控制模块内部逻辑的信息
    • 外部耦合:一组模块都访问同一全局简单变量,而且不是通过参数表传递该全局变量的信息
    • 公共耦合:多个模块都访问同一个公共数据环境
    • 内容耦合:一个模块直接访问另一个模块的内部数据;一个模块不通过正常入口转到另一个模块的内部;两个模块有一部分程代码重叠;一个模块有多个入口

二十二、软件设计师复习资料分享

  • 关注微信公众号“励码万言”回复“软考”获取2021复习资料,都是我软考复习期间收集的资料,非常全面,希望能帮到大家~
原文地址:https://www.cnblogs.com/hzpeng/p/14827524.html