├── .nojekyll ├── 18总结及复习.pptx ├── LICENSE ├── Linux开发环境及应用.md ├── README.md ├── _navbar.md ├── assets └── favicon.png ├── index.html ├── 极限复习.assets ├── image-20210619221424589.png ├── image-20210619234402936.png └── image-20210619234536567.png ├── 极限复习eXtremeReviewing.assets ├── image-20210622104631834.png ├── image-20210622111104060.png ├── image-20210622111204633.png ├── image-20210622111424215.png ├── image-20210622111711074.png ├── image-20210622111823427.png ├── image-20210622112350690.png ├── image-20210622112410658.png ├── image-20210622112608057.png ├── image-20210622112621773.png ├── image-20210622140232571.png ├── image-20210622152317173.png ├── image-20210622163157344.png ├── image-20210622164057390.png ├── image-20210622164129242.png ├── image-20210622170318808.png ├── image-20210622170611122.png ├── image-20210622171002155.png ├── image-20210622171013893.png ├── image-20210622171018522.png ├── image-20210622174646591.png ├── image-20210622174744736.png ├── image-20210622180944979.png ├── image-20210622182351234.png ├── image-20210622182650180.png └── image-20210622183711516.png ├── 极限复习eXtremeReviewing.md ├── 计算机系统结构.assets ├── 608a5e682f19f.jpg ├── image-20210615211604807.png ├── image-20210616154958511.png ├── image-20210616155129119.png ├── image-20210621175746367.png ├── image-20210621200740644.png ├── image-20210621200752388.png ├── image-20210621201952952.png ├── image-20210621202833308.png ├── image-20210621202935476.png ├── image-20210621203758873.png ├── image-20210621204809703.png ├── image-20210621210007044.png ├── image-20210621210238347.png ├── image-20210623163654677.png ├── image-20210623181547578.png ├── image-20210623181606770.png ├── image-20210623181701508.png ├── image-20210624105654796.png ├── image-20210624110451057.png ├── image-20210624110558544.png ├── image-20210624112351189.png ├── image-20210624114159863.png ├── image-20210624114242660.png ├── image-20210624150128094.png ├── image-20210624151105872.png ├── image-20210624152309862.png ├── image-20210624170444635.png ├── image-20210624170500516.png ├── image-20210624173632498.png ├── image-20210624173656148.png ├── image-20210624175006428.png ├── image-20210624175021573.png └── image-20210624175119253.png └── 计算机系统结构.md /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/.nojekyll -------------------------------------------------------------------------------- /18总结及复习.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/18总结及复习.pptx -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 BakaNetwork 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Linux开发环境及应用.md: -------------------------------------------------------------------------------- 1 | # Linux开发环境及应用 2 | 3 | - 0为stdin,1为stdout,2为stderr 4 | 5 | - 选项`--`以显式方式说明选项结束。例:删除名为-f的文件:`rm -- -f`或者`rm ./-f` 6 | - gcc编译:`gcc ./xxx.c -o xxx`或者`make xxx` 7 | - 使用重定向默认只会重定向stdout,若要打印错误日志需要`xxx 2>&1 | yyy` 8 | - select系统调用的的用途是:在一段指定的时间内,监听用户感兴趣的文件描述符上可读、可写和异常等事件(非阻塞)。用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。 9 | - 僵尸进程会占用系统进程表表项,过多导致无法启动新的进程。 10 | - 目录的x权限:控制是否能访问该目录下的文件。 11 | - gzip属于“无损”压缩,对于有损压缩算法压缩过的文件没有什么效果。 12 | - 当发出信号中断的进程正处于“用户态”执行时,SIGINT信号表现如同执行中断服务程序一样。但是当信号中断的进程处于阻塞态的系统调用时,系统调用将被打断返回-1,而不是恢复阻塞状态继续执行。 13 | - UNIX系统非常健壮,由于采用虚拟内存保护技术,数组越界等问题只会导致当前进程中止,不会导致系统崩溃。但如果信号量、管道等系统调用时设计不当,也可能产生死锁导致系统资源用尽崩溃。 14 | - fork后由于copy-on-write技术存在,父子进程共享同一物理内存(包括代码段、数据段、堆栈段),内存占用增加不多。 15 | - UDP:可能因为接收发送方速率不同导致数据包被丢弃。但是编程时socket收到的UDP报文不会产生误码等错误(有链路层校验)。 16 | - socket的read系统调用返回值为0表示tcp连接关闭。 17 | - Windows文本文件结尾:CRLF(回车换行),Linux:LF(换行)。 18 | - 策略与机制分离:实现简单、灵活性高。例:使用管道和重定向方式组合多个命令完成复杂功能。SUID权限。B-Shell中的四则运算。条件判断。 19 | - Linux系统PATH不含当前目录原因:安全考虑,防止恶意程序伪装成常用命令运行。如果PATH里有当前目录./,会导致系统命令被当前目录下同名程序重载,造成危险。 20 | - C语言中longjmp和goto区别: 21 | - 范围不同:goto子程序内跳转,longjmp全局范围跳转。 22 | - 语义不同:goto仅程序执行流程跳转,longjmp恢复实现记录下来的堆栈现场,从那个地方重新开始执行。 23 | 24 | ## 正则 25 | 26 | | 元字符 | 含义 | 27 | | --------- | ---------------------------- | 28 | | ^ | 以.\*开头 | 29 | | \$ | 以.\*结尾 | 30 | | . | 匹配任一字符 | 31 | | \* | 匹配0个或多个 | 32 | | [ ] | 匹配集合中的 | 33 | | [x-y] | 匹配集合范围内的 | 34 | | [^ ] | 匹配非集合中的 | 35 | | \ | 转义 | 36 | | | | 37 | | \\< | 以.\*开头 | 38 | | \\> | 以.\*结尾 | 39 | | \\(...\\) | 标签匹配,用\\1\,\2引导标签 | 40 | 41 | ### 搭配sed 42 | 43 | ``` 44 | sed 's/book/books/' file 45 | ``` 46 | 47 | 一行内全部替换: 48 | 49 | ``` 50 | sed 's/book/books/g' file 51 | ``` 52 | 53 | - 将日-月-年替换为年.月.日:`s/\([0-9][0-9]*\)-\([0-9][0-9]*\)-\([0-9][0-9]*\)/\3.\2.1/` 54 | 55 | ## find 56 | 57 | ```shell 58 | find path -option [ -print ] [ -exec -ok command ] {} \; 59 | ``` 60 | 61 | `{}` means "the output of `find`". As in, "whatever `find` found". `find` returns the path of the file you're looking for, right? So `{}` replaces it; it's a placeholder for each file that the `find` command locates (taken from [here](http://kb.iu.edu/data/admm.html)). 62 | 63 | find命令可以在指定目录树中查找满足某个条件的文件或目录,并对查找到的对象执行一个动作。 64 | 65 | 按名称查找:-name 66 | 67 | - 例:检索目录src及其子孙目录的所有后缀.c和.h文件,查找哪些文件中含有字符串TPDU,列出行号:`find ./src -name "*.[ch]" -exec grep -n TPDU {} /dev/null \;` 68 | 69 | 常用: 70 | 71 | - -name<范本样式>:指定字符串作为寻找文件或目录的范本样式; 72 | - -type<文件类型>:只寻找符合指定的文件类型的文件; 73 | - -user<拥有者名称>:查找符和指定的拥有者名称的文件或目录; 74 | - -ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出; 75 | 76 | ``` 77 | -amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算; 78 | -anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录; 79 | -atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算; 80 | -cmin<分钟>:查找在指定时间之时被更改过的文件或目录; 81 | -cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; 82 | -ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算; 83 | -daystart:从本日开始计算时间; 84 | -depth:从指定目录下最深层的子目录开始查找; 85 | -empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录; 86 | -exec<执行指令>:假设find指令的回传值为True,就执行该指令; 87 | -false:将find指令的回传值皆设为False; 88 | -fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件; 89 | -follow:排除符号连接; 90 | -fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件; 91 | -fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件; 92 | -fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件; 93 | -fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录; 94 | -gid<群组识别码>:查找符合指定之群组识别码的文件或目录; 95 | -group<群组名称>:查找符合指定之群组名称的文件或目录; 96 | -help或——help:在线帮助; 97 | -ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别; 98 | -iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别; 99 | -inum:查找符合指定的inode编号的文件或目录; 100 | -ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别; 101 | -iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别; 102 | -links<连接数目>:查找符合指定的硬连接数目的文件或目录; 103 | -iname<范本样式>:指定字符串作为寻找符号连接的范本样式; 104 | -ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出; 105 | -maxdepth<目录层级>:设置最大目录层级; 106 | -mindepth<目录层级>:设置最小目录层级; 107 | -mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算; 108 | -mount:此参数的效果和指定“-xdev”相同; 109 | -mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算; 110 | -name<范本样式>:指定字符串作为寻找文件或目录的范本样式; 111 | -newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; 112 | -nogroup:找出不属于本地主机群组识别码的文件或目录; 113 | -noleaf:不去考虑目录至少需拥有两个硬连接存在; 114 | -nouser:找出不属于本地主机用户识别码的文件或目录; 115 | -ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令; 116 | -path<范本样式>:指定字符串作为寻找目录的范本样式; 117 | -perm<权限数值>:查找符合指定的权限数值的文件或目录; 118 | -print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串; 119 | -print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行; 120 | -printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定; 121 | -prune:不寻找字符串作为寻找文件或目录的范本样式; 122 | -regex<范本样式>:指定字符串作为寻找文件或目录的范本样式; 123 | -size<文件大小>:查找符合指定的文件大小的文件; 124 | -true:将find指令的回传值皆设为True; 125 | -type<文件类型>:只寻找符合指定的文件类型的文件; 126 | -uid<用户识别码>:查找符合指定的用户识别码的文件或目录; 127 | -used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算; 128 | -user<拥有者名称>:查找符和指定的拥有者名称的文件或目录; 129 | -version或——version:显示版本信息; 130 | -xdev:将范围局限在先行的文件系统中; 131 | -xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。 132 | ``` 133 | 134 | ## grep 135 | 136 | Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 137 | 138 | ```shell 139 | find path -option [ -print ] [ -exec -ok command ] {} \; 140 | ``` 141 | 142 | - grep去除文本中的空行:`grep -v '^ *$' list.txt > list_new.txt`。grep -v 使用正则对文本文件进行反向过滤。 143 | 144 | | 选项 | 描述 | 145 | | :--- | :----------------------------------------------------------- | 146 | | -i | 忽略大小写。不会区分大小写字符。也可用--ignore-case 来指定。 | 147 | | -v | 不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致 grep 程序 只会不包含匹配项的文本行。也可用--invert-match 来指定。 | 148 | | -c | 打印匹配的数量(或者是不匹配的数目,若指定了-v 选项),而不是文本行本身。 也可用--count 选项来指定。 | 149 | | -l | 打印包含匹配项的文件名,而不是文本行本身,也可用--files-with-matches 选项来指定。 | 150 | | -L | 相似于-l 选项,但是只是打印不包含匹配项的文件名。也可用--files-without-match 来指定。 | 151 | | -n | 在每个匹配行之前打印出其位于文件中的相应行号。也可用--line-number 选项来指定。 | 152 | | -h | 应用于多文件搜索,不输出文件名。也可用--no-filename 选项来指定。 | 153 | 154 | ## diff 155 | 156 | Linux diff命令用于比较文件的差异。 157 | 158 | diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但默认不会比较其中子目录。 159 | 160 | ```shell 161 | diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2] 162 | ``` 163 | 164 | ``` 165 | [root@localhost test3]# diff log2014.log log2013.log 166 | 3c3 167 | < 2014-03 168 | --- 169 | > 2013-03 170 | 8c8 171 | < 2013-07 172 | --- 173 | > 2013-08 174 | 11,12d10 175 | < 2013-11 176 | < 2013-12 177 | ``` 178 | 179 | 上面的"3c3"和"8c8"表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。 180 | 181 | 182 | 183 | ## md5sum 184 | 185 | ```shell 186 | 生成 187 | md5sum testfile > testfile.md5 188 | 检查 189 | md5sum testfile -c testfile.md5 190 | ``` 191 | 192 | 193 | 194 | ## cp 195 | 196 | ``` 197 | cp [options] source dest 198 | ``` 199 | 200 | ``` 201 | -a:此参数的效果和同时指定"-dpR"参数相同; 202 | -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录; 203 | -f:强行复制文件或目录,不论目标文件或目录是否已存在; 204 | -i:覆盖既有文件之前先询问用户; 205 | -l:对源文件建立硬连接,而非复制文件; 206 | -p:保留源文件或目录的属性; 207 | -R/r:递归处理,将指定目录下的所有文件与子目录一并处理; 208 | -s:对源文件建立符号连接,而非复制文件; 209 | -u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件; 210 | -S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀; 211 | -b:覆盖已存在的文件目标前将目标文件备份; 212 | -v:详细显示命令执行的操作。 213 | ``` 214 | 215 | - 增量备份:`cp -ur work.d work.bak` 216 | 217 | 218 | 219 | ## ps 220 | 221 | 222 | 223 | ## od 224 | 225 | 按字节列出文件内容。可以按照8进制或16进制列出文件各个字节内容,观察和分析二进制文件。 226 | 227 | 228 | 229 | ## tar 230 | 231 | 磁带归档命令。原来用于将一批文件或目录树与磁带进行导入导出。现在用于压缩或解压缩文件/目录树。 232 | 233 | 234 | 235 | 236 | 237 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 目录 2 | 3 | ![GitHub last commit](https://img.shields.io/github/last-commit/BakaNetwork/computerArchitecture) 4 | 5 | 不要停下来啊!!!! 6 | 7 | - 进军教育蓝海 8 | - [计算机系统结构](https://bakanetwork.github.io/ComputerArchitecture/#/计算机系统结构.md) 9 | - [软件工程](https://bakanetwork.github.io/ComputerArchitecture/#/极限复习eXtremeReviewing.md) 10 | -------------------------------------------------------------------------------- /_navbar.md: -------------------------------------------------------------------------------- 1 | - [README](./README.md) 2 | - [计算机系统结构](./计算机系统结构.md) 3 | - [软件工程](./极限复习eXtremeReviewing.md) 4 | 5 | -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/assets/favicon.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | BakaNetwork 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /极限复习.assets/image-20210619221424589.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习.assets/image-20210619221424589.png -------------------------------------------------------------------------------- /极限复习.assets/image-20210619234402936.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习.assets/image-20210619234402936.png -------------------------------------------------------------------------------- /极限复习.assets/image-20210619234536567.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习.assets/image-20210619234536567.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622104631834.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622104631834.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622111104060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622111104060.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622111204633.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622111204633.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622111424215.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622111424215.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622111711074.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622111711074.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622111823427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622111823427.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622112350690.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622112350690.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622112410658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622112410658.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622112608057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622112608057.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622112621773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622112621773.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622140232571.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622140232571.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622152317173.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622152317173.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622163157344.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622163157344.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622164057390.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622164057390.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622164129242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622164129242.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622170318808.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622170318808.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622170611122.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622170611122.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622171002155.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622171002155.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622171013893.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622171013893.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622171018522.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622171018522.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622174646591.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622174646591.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622174744736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622174744736.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622180944979.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622180944979.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622182351234.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622182351234.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622182650180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622182650180.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.assets/image-20210622183711516.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/极限复习eXtremeReviewing.assets/image-20210622183711516.png -------------------------------------------------------------------------------- /极限复习eXtremeReviewing.md: -------------------------------------------------------------------------------- 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 | 戴明环:PDCA——Plan,Do,Check,Action。 51 | 52 | 软件工程过程是为了获得软件产品,在软件工具的支持下由软件工程师完成的一系列软件工程活动。主要活动: 53 | 54 | - 软件规格说明:规定软件功能及其使用限制。 55 | - 软件开发:产生满足规格说明的软件。 56 | - 软件确认:通过有效性验证以保证软件能够满足客户要求。 57 | - 软件演进:为了满足客户变更要求,软件在使用过程中不断地改进。 58 | 59 | --- 60 | 61 | 软件生命周期概念:软件产品从考虑其概念开始,到该产品不再使用为止的整个时期。包括概念阶段、分析与设计阶段、构造阶段、移交和运行阶段等不同时期。 62 | 63 | 软件生命周期六个基本步骤:制定计划 P、需求分析 D、软件设计 D、程序编码 D、软件测试 C、运行维护 A。 64 | 65 | 软件过程模型:从一个特定角度提出的对软件过程的概括描述,是对软件开发过程的抽象,包括构成软件过程的各种活动、软件工件、参与角色等。 66 | 67 | **软件生命周期模型**:一个框架,描述整个软件生命周期内,软件开发、运行、维护所实施的全部过程、活动、任务。同时描述生命周期不同阶段产生的软件工件(Artifact),明确活动的执行角色等。 68 | 69 | ## 传统软件生命周期模型 70 | 71 | 传统模型种类:瀑布模型、演化模型、增量模型、喷泉模型、V&W 模型、螺旋模型、构件组装模型、快速应用开发模型、原型方法。 72 | 73 | 瀑布模型:**是所有其他软件生命周期模型的基础**。 74 | 75 | - 文档驱动,本阶段的工作对象来自于上一阶段活动的输出文档。 76 | - 优点: 77 | - 降低开发复杂度、提高透明性可管理性。 78 | - 推迟了软件实现,强调必须先分析和设计。 79 | - 以文档评审等手段指导整个开发过程。 80 | - 缺点: 81 | - 缺乏灵活性,无法解决需求不明或不准确的问题。 82 | - 风险控制能力较弱。 83 | - 文档过多时,增加工作量。文档并不能完全反映实际项目情况,导致错误结论。 84 | - 适用范围:为早期软件开发消除非结构化软件、降低复杂度、促进软件工程化有显著作用。(就是没什么用) 85 | 86 | 演化模型: 87 | 88 | - 提倡两次开发:第一次得到试验性的原型产品,探索可行性,明确需求。第二次在此基础上开发成品。 89 | - 优点: 90 | - 明确用户需求、提高系统质量、降低开发风险。 91 | - 缺点: 92 | - 难于管理、结构较差、技术不成熟。 93 | - 可能会抛弃瀑布模型的文档控制优点。 94 | - 缺乏设计,可能导致软件系统结构较差。 95 | - 适用范围:需求不清楚、小型系统、开发周期短。 96 | 97 | 增量模型 98 | 99 | - 首先对系统最核心或最清晰的需求进行分析、设计、实现、测试。再按优先级逐步对后续的需求进行上述开发工作。结合了瀑布模型和演化模型的优点。 100 | - 优点: 101 | - 第一次增量实现系统核心功能,增强客户使用系统的信心。 102 | - 先开发核心功能,项目总体失败风险较低。 103 | - 最高优先级的功能先开发,得到最多测试,保障可靠性。 104 | - 增量在同一体系指导下进行集成,提高稳定性和可维护性。 105 | - 缺点: 106 | - 难以选择增量粒度。 107 | - 难以确定所有需求。 108 | 109 | 喷泉模型(迭代模型): 110 | 111 | - 高情商:各个开发阶段没有特定次序要求,可以并行进行,可以随时补充遗漏的需求(低情商:想到什么做什么,瞎 JB 写)。 112 | - 优点:提高开发效率、缩短开发周期。 113 | - 缺点:难于管理。 114 | - 适用于:需求不明晰。 115 | 116 | V 和 W 模型: 117 | 118 | - 在瀑布模型基础上改进,把测试活动提前,使得模型能够驾驭风险。 119 | 120 | 螺旋模型: 121 | 122 | - 分为四个象限螺旋上升:制定计划、风险分析、实施工程、客户评价——进入下一回路。 123 | - 适用于:开发周期长、风险高的大型软件。 124 | 125 | 构件组装模型: 126 | 127 | - 模块化思想,使用复用构件库的组件搭建系统。 128 | 129 | - 优点: 130 | - 软件复用、提高效率。 131 | - 允许多项目同时开发,降低费用、提高可维护性。 132 | - 缺点: 133 | - 缺乏通用构建组装标准风险较大。 134 | - 构建可重用性与系统高效性不易协调。 135 | - 过分依赖构件,构件质量影响产品质量。 136 | 137 | 快速应用开发模型(RAD): 138 | 139 | - 开发周期 60-90 天,分小组同步进行软件各部分开发。 140 | - 缺点:时间短,需要强沟通配合。不适合所有应用。 141 | - 适用于:信息管理系统的开发。 142 | 143 | 原型方法:和增量好像也没什么区别。 144 | 145 | - 主要用于明确需求。 146 | 147 | ## 新型软件生命周期模型 148 | 149 | RUP 模型:基于瀑布模型演化而来。 150 | 151 | - 软件生命周期分解为 4 各阶段:初始阶段、细化阶段、构造阶段、移交阶段。每个阶段结束于一个重要的里程碑。在阶段结尾评估是否满足阶段目标,评估通过允许项目进入下一阶段。 152 | - 初始阶段:软件目标里程碑。细化阶段:体系结构里程碑。构造阶段:运行能力里程碑。移交阶段:产品发布里程碑。 153 | - 特点:用例驱动,软件体系结构为核心,应用迭代及增量。 154 | 155 | XP 极限编程:基于敏捷建模思想,也是瀑布模型演化而来。 156 | 157 | - 强调用户满意,开发人员可以对需求的变化作出快速反应。 158 | 159 | # 三 软件需求分析 160 | 161 | > 需求分析的对象、任务、目标 162 | > 163 | > 数据、功能、行为建模 164 | > 165 | > 需求类别 166 | 167 | ## 需求分析的对象、任务、目标 168 | 169 | 需求分析的必要性:允许开发人员对问题细化并构建分析模型: 170 | 171 | - 数据模型:哪些数据进出系统、哪些数据需要存储? 172 | - 功能模型:对数据进行处理的功能有哪些? 173 | - 行为模型:数据进出系统和被系统功能处理的场景。 174 | 175 | 需求分析的对象:用户要求。 176 | 177 | 需求分析的任务:准确地定义新系统的目标,回答系统“做什么”的问题,**编写需求规格说明书**(结果)。 178 | 179 | 需求分析的目标:导出目标系统的逻辑模型,解决目标系统“做什么”的问题。 180 | 181 | 需求分析的操作性原则: 182 | 183 | - 表示和理解问题的**信息域**(数据)。 184 | - 定义软件**功能**。 185 | - 表示软件**行为**。 186 | 187 | 用户需求说明书与软件需求规格说明书的区别:前者主要采用自然语言来表达用户需求,后者采用规范的建模语言表示。后者是前者的细化,更多地采用计算机语言和图形符号来刻画需求。软件需求规格说明书是软件系统设计的直接依据。 188 | 189 | 需求规格说明书的内容:需求分析模型。(描述系统需要做什么,而非如何做系统) 190 | 191 | - 给出**当前系统及目标系统**的逻辑视图,以及**当前系统**的物理视图。 192 | - 逻辑模型给出软件要达到的功能和处理数据之间的关系,而非实现细节。 193 | - 物理模型给出业务环境中的业务实体和业务处理流程,是抽象出当前系统逻辑模型的基础。 194 | 195 | ~~常用的建模分析方法有:SA(面向数据流的结构化分析方法)、JSD(面向数据结构的 Jackson 方法)、OOA(面向对象的分析方法)等。~~ 196 | 197 | ## 数据、功能、行为建模 198 | 199 | 数据模型:信息和内容关系、信息流、信息结构。 200 | 201 | 功能模型:对进入软件的信息和数据进行变换的模块,必须至少完成“输入、处理、输出”三个功能。 202 | 203 | 行为模型:大多数软件对来自外界的事件做出反应。行为模型创建了软件状态的表示,以及导致软件状态变化的事件的表示(状态机)。 204 | 205 | ## 需求类别 206 | 207 | **功能需求**:列举出所开发软甲你在功能上应做什么(最主要需求)。 208 | 209 | **性能需求**:给出所开发软件的技术性能指标。系统的实时性和其他时间要求(响应时间、处理时间、消息传送时间等)、资源配置要求、精确度、数据处理量等其他要求。 210 | 211 | **环境需求**:软件系统运行时所处环境的要求。① 硬件方面,采用什么机型、有什么外部设备、数据通信接口等。② 软件方面,采用什么支操作系统、数据库管理系统等。③ 使用方面,需要使用部门在制度上、人员技术水平上具备什么样的条件等。 212 | 213 | 其他需求类别: 214 | 215 | - 可靠性需求:软件的有效性和数据完整性。 216 | - 安全保密需求。 217 | - 用户界面需求。 218 | - 资源使用需求:指所开发软件运行时所需的数据、软件、内存空间等各项资源。以及软件开发时的人力物力需求。 219 | - 软件成本消耗与开发进度需求:软件项目立项之后,根据合同规定,对软件开发的进度和步骤费用提出要求,作为开发管理依据。 220 | - 预估将来系统可能达到的目标:在开发过程中对系统将来可能的扩充与修改做准备。 221 | 222 | # 四 面向对象分析 223 | 224 | > 领域建模 225 | > 226 | > 用例建模 227 | 228 | 面向对象的需求分析建模:领域模型和用例模型。 229 | 230 | - 领域模型表示需求分析阶段“当前系统”逻辑模型的静态结构及业务流程。 231 | - 用例模型是“目标系统”的逻辑模型,定义了目标系统“做什么”的需求。由用例图、用例说明、系统顺序图 SSD、操作契约 Operation Contract 四部分组成。 232 | 233 | image-20210622104631834 234 | 235 | ## UML 概念及画法 236 | 237 | UML:面向对象的统一建模语言。是一种建模语言规格说明,是一种表示的标准。不是过程也不是方法,但允许任何一种过程和方法使用它。 238 | 239 | 4+1 视图:从不同视角为系统架构建模,形成系统的不同视图。分别为: 240 | 241 | - 用例视图(用户模型视图、场景视图):强调从用户角度看到的或需要的系统功能。 242 | - 逻辑视图(结构模型视图、静态视图):展现系统的静态或结构组成及特征。 243 | - 进程试图(行为模型视图、过程视图、协作视图、动态视图):描述设计的并发和同步等特性,关注系统非功能性需求。 244 | - 构件视图(实现模型视图、开发视图):关注代码的静态组织与管理。 245 | - 部署视图(环境模型视图、物理视图):描述硬件的拓扑结构以及软件和硬件的映射问题,关注系统非功能性需求(性能、可靠性等)。 246 | 247 | image-20210619221424589 248 | 249 | UML 的 9 个基本图: 250 | 251 | - 用例图 Use Case Diagram:从用户的角度描述系统的功能。 252 | - 类图 Class Diagram:描述系统的静态结构(类及其相互关系)。 253 | - 对象图:描述系统在某个时刻的静态结构(对象及其相互关系)。 254 | - 顺序图 Sequence Diagram:按时间顺序描述系统元素间的交互。 255 | - 协作图 Collaboration Diagram:按照时间空间的顺序描述系统元素间的交互和他们之间的关系。 256 | - 状态图:描述系统元素(对象)的状态条件和响应。 257 | - 活动图:描述了系统元素之间的活动。 258 | - 构件图:描述了实现系统的元素(类或包)组织。 259 | - 部署图:描述了环境元素的配置并把实现系统的元素映射到配置上。 260 | 261 | UML 视图与图的关系: 262 | 263 | - 用例视图——用例图。 264 | - 逻辑视图——类图、对象图、顺序图/协作图。 265 | - 进程试图——状态图、活动图。 266 | - 构件视图——构件图。 267 | - 部署视图——部署图。 268 | 269 | UML 图的画法: 270 | 271 | - 类的基本结构:类名+属性+操作()。 272 | - 构建领域模型时,不需要操作()。 273 | 274 | image-20210619234536567 275 | 276 | - 类之间的关系: 277 | 278 | image-20210619234402936 279 | 280 | ![image-20210622111204633](极限复习eXtremeReviewing.assets/image-20210622111204633.png) 281 | 282 | ![image-20210622111711074](极限复习eXtremeReviewing.assets/image-20210622111711074.png) 283 | 284 | ## 领域模型 285 | 286 | 领域模型:领域内**概念类**或**对象**的抽象可视化表示(将客观世界中的事物可视化抽象化)。主要用于概括地描述**业务背景**和重要的**业务流程**,通过类图和活动图展示。 287 | 288 | - 业务背景:描述概念类之间的关系,表示成能够代表业务知识结构的类图。 289 | - 业务流程:由角色及其执行的活动构成。由活动图描述。 290 | 291 | 创建领域模型的步骤: 292 | 293 | 1. 找出当前需求中的候选概念类。 294 | 2. 在领域模型中描述这些概念类。用问题域中的词汇对概念类命名,将与当前需求无关的概念类排除。 295 | 3. 在概念类之间添加必要的关联来记录关系。用关联、继承、组合/聚合表示。 296 | 4. 在概念类中添加用来实现需求必要的属性。 297 | 298 | 识别概念类或属性: 299 | 300 | - 属性一般是可以赋值的(如数字、文本),而概念类不可以。 301 | - 如果对一个名词是概念类还是属性不确定,将其作为概念类处理。 302 | - 不存在名词到类的映射机制,因为自然语言具有二义性。 303 | 304 | 领域模型示例: 305 | 306 | ![image-20210622111104060](极限复习eXtremeReviewing.assets/image-20210622111104060.png) 307 | 308 | ## 用例模型 309 | 310 | 用例模型是“目标系统”的逻辑模型,定义了目标系统“做什么”的需求。由四部分组成: 311 | 312 | - 用例图 313 | - 用例说明 314 | - 系统顺序图 SSD 315 | - 操作契约 Operation Contract 316 | 317 | --- 318 | 319 | 用例图:由三个基本元素组成。 320 | 321 | - Actor:称为角色或参与者,使用系统的对象(不一定是人)。 322 | - Usecase:用例,描述角色如何使用系统功能实现需求目标一组成功场景和一系列失败场景的集合。 323 | - Association:角色和用例之间的关系、用例和子用例之间的关系。 324 | 325 | 用例图示例: 326 | 327 | image-20210622111424215 328 | 329 | image-20210622111823427 330 | 331 | --- 332 | 333 | 系统顺序图 SSD:确定角色与系统之间的交互关系,以代码风格命名。包含: 334 | 335 | - 角色。 336 | - 代表软件系统的对象,一般使用 system 或系统命名。 337 | - 角色与 system 之间的交互信息,简称消息或操作。 338 | 339 | SSD 示例: 340 | 341 | ![image-20210622112350690](极限复习eXtremeReviewing.assets/image-20210622112350690.png) 342 | 343 | ![image-20210622112410658](极限复习eXtremeReviewing.assets/image-20210622112410658.png) 344 | 345 | --- 346 | 347 | 操作契约:为系统操作定义。领域模型中业务对象接收到系统事件后,执行必须的业务处理时各业务对象的状态以及系统操作执行的结果。 348 | 349 | ![image-20210622112621773](极限复习eXtremeReviewing.assets/image-20210622112621773.png) 350 | 351 | 操作契约示例: 352 | 353 | ![image-20210622112608057](极限复习eXtremeReviewing.assets/image-20210622112608057.png) 354 | 355 | # 五 结构化需求分析方法 356 | 357 | > 数据建模 358 | > 359 | > 功能建模 360 | > 361 | > 行为建模 362 | 363 | 数据建模: 364 | 365 | - 概念性数据模型基于实体-关系(ER)法,也称为实体关系模型。描述了从用户角度看到的数据,反映用户现实环境,但与软件系统中的实现方法无关。 366 | 367 | - 数据对象描述:描述了数据对象实体的名称及其所有属性。 368 | 369 | - 数据对象的基数:一对一、一对多、多对多。 370 | 371 | ## 数据流图 372 | 373 | 功能建模:当数据或信息流过计算机系统时被系统功能所处理、加工、变换后再从系统输出处理后的数据,表现为**数据流图**。 374 | 375 | 数据流图的结构:由加工、外部实体、数据流、数据存储组成。 376 | 377 | 分层数据流图: 378 | 379 | - 顶层数据流图:顶层流图仅包含一个加工,它代表被开发系统,其作用在于表明被开发系统的范围,以及它和周围环境的数据交换关系。 380 | - 中间层数据流图:表示对其上层父图的细化。它的每一加工可以继续细化,形成子图。中间层次的多少视系统的复杂程度而定。 381 | - 底层数据流图:是指加工不须再做分解的数据流图,称为“原子加工”。 382 | 383 | ![image-20210622140232571](极限复习eXtremeReviewing.assets/image-20210622140232571.png) 384 | 385 | 数据词典:对于数据流图中出现的所有被命名的图形元素加以定义,使得每一个图形元素的名字都有一个确切的解释。其定义应是严密的、精确的,不可有半点含混并消除二义性,它由以下内容组成: 386 | 387 | - 数据流词条:唯一标识数据流的名称,简要介绍数据流作用。 388 | - 数据元素词条:唯一标识数据元素的名称或编号,简要描述该数据元素的作用,以及位于哪个数据结构内。 389 | - 数据文件词条:唯一标识数据文件的名称,简要描述改文件存放什么数据。 390 | - 加工逻辑词条:唯一标识加工的名称,描述加工逻辑和规则,简述功能。 391 | - 外部实体词条:唯一标识外部实体的名称,指明该实体的性质及与系统的关系。 392 | 393 | --- 394 | 395 | 行为建模:从特定视角出发描述系统行为,采用动态分析的方法。 396 | 397 | 常用的结构化动态分析方法:状态迁移图、时序图、Petri 网等。 398 | 399 | # 六 软件设计的概念及原则 400 | 401 | > 软件设计过程:概要设计、详细设计 402 | > 403 | > 软件设计模型 404 | > 405 | > 模块,模块的独立性 406 | > 407 | > 面向对象的设计原则 408 | > 409 | > 软件体系结构风格 410 | 411 | 一堆概念。 412 | 413 | ## 软件设计(概要设计、详细设计、设计模型) 414 | 415 | 软件概要设计: 416 | 417 | - 制定设计规范。 418 | - 软件系统结构的总体设计。 419 | - 处理方式设计(性能设计)。 420 | - 数据结构设计。 421 | - 可靠性设计(质量设计)。 422 | - 界面设计(需求的直接表达方式)。 423 | - 编写软件概要设计说明书。 424 | - 概要设计评审。 425 | 426 | 软件详细设计: 427 | 428 | - 确定软件各个功能模块内的算法以及各功能模块的内部数据组织。 429 | - 描述各种算法。 430 | - 编写软件详细设计说明书。 431 | - 详细设计评审。 432 | 433 | 软件模型设计: 434 | 435 | - 动态结构设计:以某种方式表示功能相应客户请求时处理数据的过程或条件。进一步解释各功能之间如何协调工作。 436 | - 静态结构设计:包括软件的功能结构和数据结构。展示软件系统能满足所有需求的框架结构。 437 | 438 | 软件的设计活动: 439 | 440 | - 系统结构设计、数据结构设计。 441 | - 接口设计、过程设计。 442 | - 界面设计、组件设计、优化设计等。 443 | 444 | ## 软件的模块化 445 | 446 | 模块(module)定义:这个软件可被划分成若干个**可单独命名且可编址组成部分**,这些部分称为模块。模块具有三个基本属性: 447 | 448 | - 功能:做什么。 449 | - 逻辑:怎么做。 450 | - 状态:模块使用时的环境和条件。 451 | 452 | 模块的表示: 453 | 454 | - 模块的外部特性:模块的名字、参数表、功能(对程序其他环境造成的影响)。 455 | - 模块的内部特性:完成其功能的代码和内部数据。 456 | 457 | 模块的内聚性:内聚性越高,模块功能独立性越强。 458 | 459 | | 内聚类型 | 描述 | 460 | | -------- | --------------------------------------------------------------------------------------------------- | 461 | | 巧合内聚 | 内聚程度最低。模块内凑巧有一些程序段代码相同,又没有明确表现出独立的功能,应当抽象为一个新的模块。 | 462 | | 逻辑内聚 | 把几种相关的功能组合在一起,每次调用由模块根据参数确定执行那一部分功能。(if-else) | 463 | | 时间内聚 | 又称经典内聚。一般为多功能模块,各个功能的执行与时间有关。例如初始化模块、终止模块。 | 464 | | 过程内聚 | 把流程图中的一部分划出组成模块。例如,把一个流程中的循环部分、判定部分、计算部分分成三个模块。 | 465 | | 通信内聚 | 一个模块完成多个功能,各功能都在同一个数据结构上操作,每个功能有唯一入口。例如对某数据结构的 CRUD。 | 466 | | 功能内聚 | 内聚程度最高。一个模块中各个部分都是完成某一具体功能必不可少的组成部分,紧密联系,不可分割。 | 467 | 468 | 模块的耦合性:耦合性越高,模块间联系越紧密,独立性越弱。应当避免高耦合。 469 | 470 | | 耦合类型 | 描述 | 471 | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------ | 472 | | 非直接耦合 | 耦合性最低。两个模块之间没有直接关系,通过父级模块控制和调用各自实现功能。 | 473 | | 数据耦合 | 一组模块通过参数表简单变量交换信息。 | 474 | | 标记耦合 | 一组模块通过参数表传递记录信息。这个记录是某一数据结构的子结构,不是简单变量。(违反了通信内聚原则) | 475 | | 控制耦合 | 一个模块通过传送开关、标志、名字等控制信息明显地控制另一模块的功能。 | 476 | | 外部耦合 | 一组模块都访问同一全局简单变量(而非数据结构),并且不通过参数表传递该变量信息。 | 477 | | 公共耦合 | 一组模块访问同一个公共数据环境。如全局数据结构、共享通信区、内存公共覆盖区等。 | 478 | | 内容耦合 | 耦合性最高。一个模块直接访问另一模块内部数据、不通过正常入口转到另一模块内部、两模块有部分代码重叠、一个模块有多个入口。(垃圾代码) | 479 | 480 | ## 面向对象的设计原则 481 | 482 | 原则: 483 | 484 | - 单一职责原则:引起一个类变化的原因(职责)应该只有一个。 485 | - 开闭原则:类、模块、函数可以扩展,但不能修改原有代码(Open for extension,Closed for modification)。 486 | - 里氏替换原则:子类应当可以替换父类,并出现在父类能够出现的任何地方。 487 | - 依赖倒置原则: 488 | - 高层模块不应依赖于底层模块,二者都应依赖于抽象。抽象不应依赖于细节,细节应该依赖于抽象。 489 | - 程序中所有依赖关系都应终止于抽象类或接口。 490 | - 接口隔离原则:若一个服务类为多个客户类提供不同服务,则服务类针对每个不同服务都应该有一个接口。 491 | - 组合/聚合复用原则:在一个新对象里面使用一些已有对象,使之成为新对象的一部分。新对象通过向已有对象委托(delegate)一部分职责而达到复用已有对象的目的。(不要继承,要组合/聚合) 492 | - 迪米特法则:最少知识原则。一个对象应当尽可能少地了解其他对象。(对象只与 this、本对象方法中的参量、当前对象实例直接引用的对象、对象实例聚集中的其他元素、当前对象创建的对象通信) 493 | 494 | ## 软件体系结构风格 495 | 496 | 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式(设计模式): 497 | 498 | - 管道和过滤器风格:参考 Unix/Linux。通过过滤器进行数据处理、通过管道进行信息流传递。 499 | 500 | - 调用和返回风格:大型软件开发主流体系结构 501 | 502 | - 主程序/子程序风格:将程序化分为若干小片段,封装为子程序。主程序单线程控制。 503 | - 对象风格:数据的表示方法和相应操作封装在抽象数据类型或对象中。对象通过函数和过程调用交互。 504 | - 分层风格:将系统组织称一个结构,通过接口,每一层为上层提供服务,并作为下层的客户端。 505 | 506 | - 基于事件的风格:构件不直接调用过程,而是声明或广播事件。其他构件通过向系统注册监听事件,完成相应操作。 507 | 508 | - 客户端/服务器风格:应用程序的数据和处理分布在一定范围内的多个构件上,构件之间通过网络连接。 509 | 510 | - MVC 风格:模型(数据与状态)与视图(显示)分离,通过控制器(封装若干接口)控制。 511 | 512 | image-20210622152317173 513 | 514 | - 黑板风格:通常用于松散的构件访问共享数据的应用程序。(略?) 515 | 516 | # 七 面向对象设计方法 517 | 518 | > 面向对象设计步骤 519 | > 520 | > 模型层次化 521 | > 522 | > 面向对象的设计模式 523 | 524 | 面向对象的设计与 UML 525 | 526 | 面向对象的设计:以需求分析阶段的**用例模型**和**领域模型**为基础,运用 UML 构建软件系统结构,通过一系列设计模型说明用例的实现过程。 527 | 528 | 主要设计活动:选择架构——通过**UML 交互图**描述每个用例的实现——通过**UML 类图**给出满足所有用例的系统静态结构——根据系统设计原则进行优化。(存疑) 529 | 530 | --- 531 | 532 | 软件概要设计步骤: 533 | 534 | - 选择合适的软件架构。(单机?CS 或 BS?云服务?) 535 | - 系统的**动态结构设计**: 536 | - 针对用例 SSD 中的每个系统事件,使用 Sequence diagram/ Collaboration diagram 给出符合该系统事件操作契约的内容。 537 | - 如果软件对象具有多种不同职责,需要使用 State machines diagram 进行状态迁移设计。 538 | - 系统的**静态结构设计**: 539 | - 对所有用例或子系统级别的用例交互图归纳,使用 Class diagram 给出系统的静态结构。 540 | 541 | * 软件详细设计: 542 | 543 | - 针对系统静态结构中的每个方法,使用 Activity diagram 进行逻辑结构的设计。 544 | 545 | * 软件架构: 546 | - 三种基础架构:单机、CS 和 BS、云服务。 547 | - 服务器端的分层:控制器层+应用逻辑层(必须)+基础架构层+持久化层+DB(必须) 548 | 549 | --- 550 | 551 | 模型层次化:层次化设计模型符合面向对象设计原则,并使系统易于扩展和维护。 552 | 553 | - 用户界面层:尽量与业务分离,专门处理交互。 554 | - 控制器层:专职接收 SSD 中的系统事件,进行 validation,并转发给应用逻辑层对象处理。 555 | - 业务逻辑层:实现系统核心功能。 556 | - 持久化层:负责 CRUD 经过业务逻辑层处理后的需要持久化(将对象状态永久保存到物理介质)的数据。与业务逻辑层功能分离,与数据库保持同步。持久化层将对数据库的操作类封装起来,向业务/领域对象提供持久化服务,是数据库变化对业务领域影响的范围局部化。 557 | - 系统层:为应用封装操作系统相关的功能。 558 | 559 | --- 560 | 561 | 面向对象设计的关键步骤:在确定软件框架结构的基础上,进行如下内容设计: 562 | 563 | - 发现对象(发现软件类):根据需求和选择的架构和模式确定系统由哪些对象构成。 564 | 565 | - 确定对象属性:明确对象特征属性。 566 | - 确定对象行为:明确对象功能职责。 567 | - 确定对象之间的关系:根据 SSD 和操作契约、选择的架构和模式,明确系统如何相互协作完成功能需求的交互过程。 568 | 569 | --- 570 | 571 | ## 面向对象的设计模式 572 | 573 | - 对象的职责通过调用对象的方法来实现。 574 | - 面向对象设计最关键的活动是正确地给对象分配职责。 575 | - 模式定义了一组相互协作的设计类,包括类的职责、类之间的交互方式。 576 | 577 | 如何确定设计类并分配职责?类职责分配模式、控制器模式、建造者模式、信息专家模式。 578 | 579 | 类职责分配(Grasp)模式: 580 | 581 | - 设计类的来源有两部分: 582 | 583 | - 核心逻辑由领域模型中的**概念类**转换而来。 584 | - 另一部分是为了实现新增的类,如负责对象持久化的类、负责通信的类。 585 | 586 | - 每个设计类都有明确的职责,分为两种类型: 587 | 588 | - 了解型(knowing)职责(自己干自己的事): 589 | 590 | - 对象了解自己私有的数据。 591 | - 对象了解相关联的对象。 592 | - 对象了解能够派生或计算的事物。 593 | 594 | - 行为型(doing)职责(自己干自己能干的事): 595 | 596 | - 对象自身能执行一些行为,如创建一个对象或者进行计算。 597 | - 对象要能启动其他对象中的动作。 598 | - 对象要能控制或协调其他对象中的活动。 599 | 600 | 职责的内聚(自己只干自己的事):减少不必要的关联,提高内聚性。 601 | 602 | 控制器(Controller)模式:把处理和接收系统事件的职责分配给位于控制器层的对象。提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。 603 | 604 | - 外观(facade)控制器:代表整个系统。 605 | - 用例控制器或会话控制器:代表一个发生系统事件的用例场景。这个类通常命名为`<用例名>控制器`。 606 | - 在相同的用例场景中使用同一个控制器类处理所有的系统事件。 607 | - 一次会话是与一个参与者进行交谈的一个实例。 608 | 609 | 建造者(Creator)模式:用于操作契约中对象实例的创建。体现低耦合设计思想,是迪米特法则的具体运用。 610 | 611 | - 若以下条件满足一个或多个: 612 | 613 | - B 聚合或包含 A,B 记录对象 A,B 密切使用对象 A,B 拥有创建对象 A 所需要的初始化数据。 614 | 615 | 则可将创建类 A 实例的职责分配给类 B。 616 | 617 | 信息专家(Information Expert)模式: 618 | 619 | - 这是给对象分配职责的通用原则:职责分配给拥有履行职责所必需信息的类(信息专家)完成。 620 | 621 | --- 622 | 623 | 创建交互图:根据选择的系统架构,使用 UML 的交互图,为该用例的每一个**系统事件**确定对应的软件对象,并根据操作契约确定对象之间的关系。 624 | 625 | ![image-20210622163157344](极限复习eXtremeReviewing.assets/image-20210622163157344.png) 626 | 627 | --- 628 | 629 | ## 创建设计类图 630 | 631 | 设计类图定义类、类的属性和操作,但不定义实现操作的算法。 632 | 633 | - 扫描所有交互图以及领域模型中涉及的类,识别软件类。 634 | - 将领域模型中已经识别出来的部分属性添加到类中。 635 | - 根据交互图为软件类添加方法。忽略构造函数和 getter/setter。 636 | - 添加更多类型信息。包括属性类型、方法参数类型、返回类型。 637 | - 添加关联和导航。定义 A 到 B 带导航关联修饰的常见情况:A 发送一个消息到 B、A 创建一个 B 的实例、A 需要维护到 B 的一个连接。 638 | - (可选)类成员的细节表示。如属性可见性、方法体的描述等。 639 | 640 | 例: 641 | 642 | ![image-20210622164057390](极限复习eXtremeReviewing.assets/image-20210622164057390.png) 643 | 644 | image-20210622164129242 645 | 646 | # 八 结构化设计方法 647 | 648 | > 功能结构图基本结构 649 | > 650 | > 变换型映射 651 | > 652 | > 事务型映射 653 | 654 | 功能结构图的基本结构:四种基本类型模块 655 | 656 | - 传入模块:从下属模块取得数据,经过处理,将其传送给上级模块。 657 | - 传出模块:从上级模块获得数据,经过处理,将其传送给下属模块。 658 | - 变换模块:即加工模块。从上级模块获得数据,进行处理,再传送回上级模块。 659 | - 协调模块:对所有下属模块进行协调和管理的模块。 660 | 661 | ![image-20210622170318808](极限复习eXtremeReviewing.assets/image-20210622170318808.png) 662 | 663 | 系统功能结构图(根据数据流图中加工特性)分为以下两种结构: 664 | 665 | - 变换处理型 666 | - 事务处理型(并发处理型) 667 | 668 | ## 变换型映射 669 | 670 | 变换型结构工作过程大致三步:取得数据、变换数据、给出数据。 671 | 672 | ![image-20210622170611122](极限复习eXtremeReviewing.assets/image-20210622170611122.png) 673 | 674 | 变换型映射:会画就行。 675 | 676 | ![image-20210622174646591](极限复习eXtremeReviewing.assets/image-20210622174646591.png) 677 | 678 | ## 事务型映射 679 | 680 | 事务型结构:存在某一个数据流节点,引发一个或多个相同的处理,并将处理结果返回给该节点,则该数据流就叫做事务,该节点称为事务处理中心。事务是最小的工作单元,无论成功与否都作为一个整体进行工作。 681 | 682 | ![image-20210622171013893](极限复习eXtremeReviewing.assets/image-20210622171013893.png) 683 | 684 | ![image-20210622171018522](极限复习eXtremeReviewing.assets/image-20210622171018522.png) 685 | 686 | 事务型映射: 687 | 688 | image-20210622174744736 689 | 690 | # 九 程序实现 691 | 692 | > 源程序文档化 693 | 694 | 源程序除了质量要求之外,为了后期代码的维护和修改,还必须提高可阅读性,达到源程序文档化。 695 | 696 | - 标识符命名:模块名(类名及方法名),变量/常量名 697 | - 名称需标示清楚具体含义,采用前缀后缀增加可阅读性。 698 | - 使用专业术语(业务词汇),避免与编码语言关键字冲突。 699 | - 注意大小写及长度。 700 | - 源程序布局: 701 | - 编码之前定义统一的编码规范。 702 | - 规定合理的注释、缩进、空格、空行等方式。 703 | - 程序注释: 704 | - 序言性注释:位于代码之前,说明该模块(类及方法)具体作用。包括: 705 | - 程序标题:模块名称。 706 | - 模块描述:该模块的功能和目的说明。 707 | - 主要算法(可选):说明采用的算法结构。 708 | - 接口说明:说明该模块与其他模块的调用关系。 709 | - 开发简历:创建者、创建时间。修改者、修改时间、修改内容。版本。 710 | - 功能性注释:对于程序体中复杂难于理解的程序结构进行局部说明。 711 | 712 | # 十 软件测试 713 | 714 | > 白盒测试 715 | > 716 | > 黑盒测试 717 | > 718 | > 测试基本类型 719 | 720 | 测试用例由测试输入数据和预期的输出结果两部分组成。 721 | 722 | ![image-20210622180944979](极限复习eXtremeReviewing.assets/image-20210622180944979.png) 723 | 724 | 白盒测试:将测试对象看作一个透明的盒子,允许利用程序内部逻辑结构以及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。又称为结构测试或逻辑驱动测试。 725 | 726 | 黑盒测试:完全不考虑程序内部的逻辑结构和特性,只依据程序的需求规格说明书和概要设计说明,检查程序的功能是否符合它的功能说明。又称为功能测试或数据驱动测试。 727 | 728 | ## 白盒测试方法 729 | 730 | 白盒测试主要应用于单元测试,是检查程序逻辑错误的主要方法。 731 | 732 | 进行如下检查: 733 | 734 | - 程序模块所有独立执行路径至少测试一次。 735 | - 对所有的逻辑判定,true 和 false 的情况都至少测试一次。 736 | - 在循环的便捷和运行界限内执行循环体。 737 | - 测试内部数据结构的有效性,等。 738 | 739 | 逻辑覆盖:逻辑覆盖是一程序内部的逻辑结构为基础设计的测试用例技术。 740 | 741 | - 语句覆盖:使得每一个可执行语句至少执行一次。语句覆盖发现不了判断中逻辑运算中出现的错误,是最弱的逻辑覆盖准则。 742 | - 判定覆盖:使得程序中每个判断的取真分支和取假分支至少经历一次,又称为分支覆盖。判定覆盖还不能保证一定查出在判断的条件中存在的错误,因此需要更强的逻辑覆盖准则检验判断内部条件。 743 | - 条件覆盖:使得程序中每个判断的每个条件的可能取值至少执行一次。 744 | - 判定+条件覆盖:使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果取值至少执行一次。采用判定-条件覆盖,逻辑表达式中的错误不一定能够查得出来。 745 | - 条件组合覆盖:使得每个判断的所有可能的条件取值组合至少执行一次。需要将多重条件判断分解成有多个基本判断组成的流程图。 746 | - 路径覆盖:设计足够的测试用例,覆盖程序中所有可能的路径。这种测试仍然无法满足条件组合覆盖某些条件,也并非是完善的测试方法。在实际的测试用例设计过程中需要综合以上 6 种测试方法去设计测试用例。以路径覆盖为主,辅助其他 5 种方法。 747 | 748 | --- 749 | 750 | 基本路径测试:对于具有循环结构的程序,路径过多,做到路径覆盖有难度。基本路径测试基于**程序控制流图**对程序进行简化,得到程序的控制结构,进而分析控制结构的环路复杂性,导出基本可执行路径集合,设计测试用例。 751 | 752 | ![image-20210622182351234](极限复习eXtremeReviewing.assets/image-20210622182351234.png) 753 | 754 | 控制流图的转换: 755 | 756 | - 顺序结构的多个结点可以合并为一个结点。 757 | - 在选择或多分支结构中,分支的汇聚处应有一个虚拟汇聚结点。 758 | - 边和结点圈定的范围叫做区域,当对区域计数时,图形外的范围也应记为一个区域。 759 | - 如果判断中的条件表达式是由一个或多个逻辑运算符连接的复合条件表达式,则需要改为一系列只有单个条件的嵌套的判断。 760 | 761 | image-20210622182650180 762 | 763 | 控制流图的环路复杂度计算: 764 | 765 | - 控制流图的环路复杂度(McCabe 复杂度)确定程序中独立路径的上界,以此为依据可找出程序中全部独立路径。 766 | - 环路复杂度三种计算方法: 767 | - 等于控制流图中的区域数,包括封闭区域和开放区域。 768 | - 设 E 为控制流图的边数,N 为图的结点数,则环路复杂度定义为$V(G)=E-N+2$。 769 | - 设 P 为控制流图中的判定结点数,则有$V(G) = P+1$。 770 | - 基本路径集:指程序控制流图中,从入口到出口的至少经历一个从未走过的边的不同路径的集合。 771 | - 给定控制流图,基本路径集不是唯一的。 772 | - 最大基本路径条数就是环路复杂度。 773 | 774 | 导出测试用例: 775 | 776 | - 根据控制流图的基本路径导出测试用例,确保基本路径集中每一条路径执行。 777 | - 根据判断结点给出条件,选择适当数据保证每一条路径可被测试到(使用逻辑覆盖)。 778 | - 每个测试用例执行后与预期结果比较,若所有测试用例执行完毕,则确信程序中所有可执行语句至少被执行一次。 779 | 780 | ![image-20210622183711516](极限复习eXtremeReviewing.assets/image-20210622183711516.png) 781 | 782 | ## 黑盒测试方法 783 | 784 | 黑盒测试方法一般用于集成测试、系统测试、验收测试。 785 | 786 | 常用方法: 787 | 788 | - 等价类划分:按区间、数值集合、布尔值等规则将输入空间划分为有效等价类与无效等价类,使用等价类的一个或几个代表值进行测试。 789 | - 边界值分析:对等价类划分的补充。使用对于等价类而言稍高于其边界值或低于其边界值的一些特殊情况进行测试。 790 | - 因果图:自己看吧。 791 | 792 | 黑盒测试方法用于测试程序接口: 793 | 794 | - 是否有不正确或遗漏的功能? 795 | - 是否能正确接受输入、输出正确结果? 796 | - 是否有数据结构错误或外部信息访问错误? 797 | - 性能是否满足要求? 798 | - 是否有初始化或终止性错误? 799 | 800 | ## 五个软件测试的基本类型 801 | 802 | 单元测试:编码阶段运用白盒测试方法,对已实现的最小单位代码进行正确性检查。 803 | 804 | 集成测试:编码阶段在单元测试的基础上,运用黑盒测试方法检查被测单元的接口问题,并检查代码集成后各功能的完整性。 805 | 806 | 确认测试:开发后期,针对系统级的软件,验证实现的功能和性能是否与用户的要求一致。 807 | 808 | 系统测试:在开发环境或实际运行环境中,以系统需求分析规格说明书作为验收标准,对软硬件系统进行的一系列集成和确认测试。 809 | 810 | 验收测试:在实际运行环境中,试运行一段时间后,确认系统功能和性能符合生产要求。验收通过后交付用户使用。 811 | 812 | ``` 813 | :) 814 | ``` 815 | -------------------------------------------------------------------------------- /计算机系统结构.assets/608a5e682f19f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/608a5e682f19f.jpg -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210615211604807.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210615211604807.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210616154958511.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210616154958511.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210616155129119.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210616155129119.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621175746367.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621175746367.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621200740644.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621200740644.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621200752388.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621200752388.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621201952952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621201952952.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621202833308.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621202833308.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621202935476.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621202935476.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621203758873.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621203758873.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621204809703.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621204809703.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621210007044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621210007044.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210621210238347.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210621210238347.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210623163654677.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210623163654677.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210623181547578.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210623181547578.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210623181606770.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210623181606770.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210623181701508.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210623181701508.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624105654796.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624105654796.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624110451057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624110451057.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624110558544.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624110558544.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624112351189.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624112351189.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624114159863.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624114159863.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624114242660.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624114242660.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624150128094.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624150128094.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624151105872.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624151105872.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624152309862.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624152309862.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624170444635.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624170444635.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624170500516.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624170500516.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624173632498.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624173632498.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624173656148.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624173656148.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624175006428.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624175006428.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624175021573.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624175021573.png -------------------------------------------------------------------------------- /计算机系统结构.assets/image-20210624175119253.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BakaNetwork/ComputerArchitecture/26aea87944833043132902403f9d5ef83a9c2bba/计算机系统结构.assets/image-20210624175119253.png -------------------------------------------------------------------------------- /计算机系统结构.md: -------------------------------------------------------------------------------- 1 |

计算机系统结构

2 | 3 | # 第一章基础知识 4 | 5 | > 系统结构的相关概念 6 | > 7 | > - 计算机系统层次结构 8 | > - 计算机系统结构基本概念(广义机器、透明性、编译) 9 | > - 计算机系统结构、组织、实现的定义 10 | > - 计算机系统分类方法/Flynn 分类法 11 | > 12 | > 基本原理和性能公式 13 | > 14 | > - 大概率事件优先 15 | > - Amdahl 定律 16 | > - 程序的局部性原理 17 | > - CPU 性能计算 18 | > - 加速比公式应用 19 | > 20 | > 性能评价标准 21 | > 22 | > - 性能指标(CPU 时间、CPI、MIPS、MFLOPS) 23 | 24 | ## 计算机系统结构相关概念(分类法) 25 | 26 | 计算机系统的层次结构:计算机是由硬件、软件、固件(固化的微程序)组成的复杂系统,按机器语言功能划分为多级层次结构。 27 | 28 | 下面两级(微程序级、传统机器语言机器级)使用硬件/固件实现,称为物理机。上面四级由软件实现,称为虚拟机。第二级(传统机器语言级)是软硬件界面。 29 | 30 | | 层数 | 语言 | 实现 | 31 | | ---- | ---------------- | ------------------------------------------------------ | 32 | | 0 | 布尔语言(硬件) | | 33 | | 1 | 微程序指令 | 用微指令集编写微程序,固件、硬件来解释 | 34 | | 2 | 传统机器语言 | 传统机器语言程序有 L1 级微程序或 L0 级硬联逻辑进行解释 | 35 | | 3 | 操作系统 | 包括传统机器及操作系统级指令,由微程序解释 | 36 | | 4 | 汇编语言 | 翻译成 L3 和 L2 级语言执行 | 37 | | 5 | 高级语言 | 通过编译程序翻译到 L4 或 L3 级,或通过解释方法实现 | 38 | | 6 | 应用语言 | 由应用程序包翻译到 L5 | 39 | 40 | 翻译和解释:一般情况,上述六级层次的 L1-L3 用解释实现,而 L4-L6 用翻译实现。 41 | 42 | - 翻译:用转换程序把高一级机器上的程序转换为低一级机器上的等效程序,然后再在这低一级机器上运行。速度快、占用空间大。 43 | - 解释:对于高一级机器上程序中的每一条语句或指令,转换为低级语言的一段等效程序执行,执行完后再去高一级机器取下一条语句或指令。速度慢、占用空间小。 44 | 45 | 计算机系统结构的定义: 46 | 47 | - 计算机系统结构是指传统机器程序员所看到的计算机属性,即概念性结构功能特性。 48 | - 计算机系统结构的实质:确定计算机系统中软硬件的界面,界面之上是软件实现的功能,界面之下是硬件和固件实现的功能。 49 | - 透明性:一种本来存在的事物或属性,从某种角度看好像不存在或看不到。低层机器的属性对高层机器程序员来说通常是透明的。 50 | - 广义系统结构定义:包括指令系统结构、组成、硬件。 51 | 52 | 软件是促使计算机系统结构发展最重要的因素,应用是促使计算机系统结构发展最根本的动力,器件是粗使计算机系统结构发展最活跃的因素。 53 | 54 | 计算机系统结构、组成、实现: 55 | 56 | - 计算机体系结构:数据表示、寻址规则、寄存器定义、指令集、终端系统、机器工作状态的定义和切换、存储体系、信息保护、I/O 结构等。 57 | 58 | - 计算机组成:计算机系统结构的逻辑实现,包含物理机器级中的数据流和控制流的组成以及逻辑设计等。着眼于:物理机器级内各事件的排序方式与控制方式、各部件的功能以及各部件之间的联系。具有相同系统结构的计算机可以采用不同的计算机组成。 59 | 60 | - 计算机实现:计算机组成的物理实现。着眼于:器件技术、微组装技术。同一种计算机组成又可以采用多种不同的计算机实现。 61 | 62 | > 例: 63 | > 64 | > - 机器指令集的确定、主存容量与编址方式等属于计算机体系结构。 65 | > - 指令实现方式(取指令、去操作数、运算、送结果等的具体操作及排序方式)、主存速度与逻辑结构(多体交叉存储)等属于计算机组织(计算机组成)。 66 | > - 实现指令集中所有指令功能的具体电路、器件的设计、装配技术,存储器器件和逻辑电路的设计等属于计算机实现。 67 | 68 | 计算机系统分类方法/Flynn 分类法: 69 | 70 | - Flynn 分类法:按照指令流和数据流的多倍性分类。 71 | 72 | - 指令流:计算机执行的指令序列 73 | - 数据流:由指令流调用的数据序列 74 | - 多倍性:在系统**最受限**的部件上,同时处于统一执行阶段的指令或数据的最大数目 75 | 76 | 分为 SISD(传统顺序处理计算机)、SIMD(阵列处理机)、MISD(流水处理机,有争议)、MIMD(多处理机)系统。 77 | 78 | image-20210615211604807 79 | 80 | - Handler 分类法:把硬件结构分为三个层次,根据并行度和流水线分类。 81 | 82 | $T=$ 83 | 84 | k:控制器数目,k':控制器流水线中控制部件的数目 85 | 86 | d:PCU 控制的 ALU 或 PE 数目,d':指令流水线中 ALU 部件的数目 87 | 88 | w:ALU 或 PE 的字长,w':操作流水线中基本逻辑线路数目 89 | 90 | - 冯氏分类法:用最大并行度$P_m$(单位时间内能够处理的最大二进制位数)分类。 91 | 92 | - 字串位串 WSBS:纯串行处理机 93 | - 字串位并 WSBP:传统单处理机 94 | - 字并位串 WPBS:同时处理多个字的同一位 95 | - 字并位并 WPBP:同时处理多个字的多个位 96 | 97 | 平均并行度:$P_a = \frac{\sum_{i=1}^T P_i}{T}$ 98 | 99 | T 个周期内的平均利用率:$\mu = \frac{P_a}{P_m}$ 100 | 101 | > CRAY-1 计算机有 1 个 CPU,12 个相当于 ALU 或 PE 的处理部件,最多可以实现 8 级流水线。字长为 64 位,可以实现 1 ~ 14 位流水线处理。所以 CRAY-1 的体系结构可表示为: T(CRAY-1)=〈1×1,12×8,64×(1 ~ 14)〉。 102 | 103 | 系统结构的发展: 104 | 105 | - 冯诺依曼结构:输入设备、输出设备、控制器、运算器、存储器。指令与数据同等对待(一条总线)。 106 | - 哈佛结构:冯诺依曼基础上,指令与数据分离。现代计算机都是哈佛结构。 107 | 108 | ## 基本原理和性能公式 109 | 110 | 大概率事件优先原理: 优先加速使用频率高的部件。是**最重要和最广泛采用的计算机设计准则**。 111 | 112 | 程序的局部性原理: 113 | 114 | - 时间局部性:程序即将用到的信息很可能就是目前正在使用的信息。(经验规则:程序执行时间 90%都是在执行程序中 10%的代码) 115 | - 空间局部性:程序即将用到的信息很可能与正在使用的信息在空间上临近。 116 | 117 | Amdahl 定律:系统性能加速比与该部件在系统中的总执行时间有关。 118 | 119 | - $加速比S_n=\frac{改进后性能}{改进前性能}=\frac{改进前用时}{改进后用时}$ 120 | 121 | - $S_n = \frac{T_0}{T_n} = \frac{1}{(1-F_e)+\frac{F_e}{S_e}}$,$S_e$为部件加速比。 122 | 123 | > 某计算机系统采用浮点运算部件后,使浮点运算速度提高到原来的 25 倍,而系统运行某一程序的整体性能提高到原来的 4 倍,试计算该程序中浮点操作所占的比例。 124 | > 125 | > 由题可知: Se = 25 Sn = 4。根据加速比可得:$4=\frac{1}{(1-F_e)+\frac{F_e}{25}}$,得 Fe=78.1% 126 | 127 | CPU 性能公式: 128 | 129 | - CPU 时间:执行一个程序所需 CPU 时间。 130 | 131 | - $CPU_{时间}=IC \times CPI \times 时钟周期时间$。时钟周期时间$t = 1/f(系统时钟频率)$。 132 | - $CPU_{时间}=\sum\limits_{i=1}^n (CPI_i \times IC_i)$。 133 | 134 | - CPI:一条指令的平均时钟周期数,$CPI=执行程序所需的时钟周期数 \div IC(执行程序的指令条数)$ 135 | 136 | - MIPS:每秒百万条指令数 137 | 138 | - MFLOPS:每秒百万次浮点运算数 139 | 140 | - CPU 性能取决于三个参数: 141 | 142 | - t:取决于硬件实现技术和计算机组成 143 | - CPI:取决于计算机组成和指令系统的结构 144 | - IC:取决于指令系统的结构和编译技术 145 | 146 | > 假设 FP 指令的比例为 25%,其中,FPSQR 占全部指令的比例为 2%,FP 操作的 CPI 为 4,FPSQR 操作的 CPI 为 20 ,其他指令的平均 CPI 为 1.33。现有两种改进方案,第一种是把 FPSQR 操作的 CPI 减至 2,第二种是把所有的 FP 操作的 CPI 减至 2,比较两种方案对系统性能的提高程度。 147 | > 148 | > 解:改进前,指令的平均时钟周期 CPI 为: $4 \times 0.25 + 1.33 \times 0.75 = 2$ 149 | > 150 | > 第一种方案:CPI 改进了$(20-2) \times 0.02 = 0.36$ 151 | > 152 | > 第二种方案:CPI 改进了$(4-2) \times 0.25 = 0.5$ 153 | > 154 | > 第二种方案的改进较大。 155 | 156 | ## 性能评价标准 157 | 158 | 评价方法:CPU 时间、CPI、MIPS、MFLOPS。 159 | 160 | 比较若干测试程序在不同机器上的执行时间: 161 | 162 | - 平均执行时间:各程序执行时间的算术平均值。 163 | - 加权执行时间:各程序执行时间的加权平均值。 164 | - 调和平均值法:执行任务数量$\div$总耗时(速度不可简单相加)。$H_m = \frac{n}{\sum_{i=1}^n T_i}$ 165 | - 几何平均值法:执行速度的几何均值。$G_m = \sqrt[n]{\prod_{i=1}^n R_i}$ 166 | 167 | # 第三章流水线 168 | 169 | > 流水线的基本概念及分类:静、动态流水线;单、多流水线;线性、非线性流水线 170 | > 171 | > 流水线表示:时空图、连接图 172 | > 173 | > 流水线性能计算和分析:吞吐率、加速比、效率 174 | > 175 | > 多功能/静态动态流水线的时空图 176 | > 177 | > 流水线相关与冲突: 178 | > 179 | > - 经典五段流水线:各段完成的操作 180 | > 181 | > - 数据相关(真相关)、名相关、控制相关 182 | > - 结构冲突、数据冲突、控制冲突 183 | > - 数据冲突的各种形式(RAW、WAR、WAW 等) 184 | > 185 | > - 减少数据冲突的方法:延迟、定向、编译 186 | > 187 | > - 解决控制冲突的方法:排空、预测、延迟分支、编译 188 | 189 | ## 流水线基本概念及分类 190 | 191 | 流水线技术主要思想:把一个复杂任务分解为若干个子任务。每个子任务由专门功能部件完成,并使多个子任务并行执行。 192 | 193 | 流水线技术的核心部件功能专用化。(一件工作按功能分隔为若干相互联系的部分,每一部分指定给专门部件(段)完成,各部件(段)执行过程时间重叠(时间并行性,并发性),所有部件依次序分工完成工作。) 194 | 195 | 流水线的级:流水线中每个子过程及其功能部件,称为一个流水段。流水线的段数称为流水线深度(长度)。 196 | 197 | - 操作部件采用流水线,称为操作部件流水线。 198 | - 指令执行过程采用流水线,称为指令流水线。 199 | - 访问主存部件采用流水线,称为访存部件流水线。 200 | - 多计算机通过存储器连接构成流水线,称为宏流水线。 201 | 202 | 流水线的分类 1: 203 | 204 | - 部件级流水线(运算操作流水线):各类型的运算操作按流水方式进行。 205 | - 处理级流水线(指令流水线):把一条指令的执行过程分段,按流水方式执行。 206 | - 系统级流水线(宏流水线):把多台处理机串行连接起来,每个处理机完成整个任务中的一部分。 207 | 208 | 流水线的分类 2: 209 | 210 | - 单功能流水线:只能完成固定功能。 211 | - 多功能流水线:流水线的各段可以进行不同连接,实现不同功能。 212 | 213 | 流水线的分类 3: 214 | 215 | - 静态流水线:同一时间内,多功能流水线中的各段只能按同一种功能的连接方式进行工作。 216 | - 动态流水线:同一时间内,多功能流水线中的各段可以按照不同方式连接,同时执行多种功能。(而不需等到排空之后重新装入) 217 | 218 | 流水线的分类 4: 219 | 220 | - 线性流水线:流水线各段串行连接,每个段最多流过一次。 221 | - 非线性流水线:流水线中有反馈回路,每个段可以流过多次。 222 | 223 | 流水线的分类 5: 224 | 225 | - 顺序流水线:流水线输出的任务顺序与输入的任务顺序相同。 226 | - 乱序流水线:流水线输出的任务顺序与输入的顺序**可以不同**。(也称无序、错序、异步流水线) 227 | 228 | 典型的指令流水线: 229 | 230 | - 三段:取指、分析、执行 231 | - 四段:取指(访问主存取出指令并送到指令寄存器)、译码(形成操作数地址并读取操作数)、执行(完成指令的功能)、存结果(将运算结果写回寄存器或主存) 232 | 233 | 流水线通过时间和排空时间: 234 | 235 | - 通过时间:第一个任务**从**进入流水线**到**流出结果所需的时间,又称装入时间 236 | 237 | - 排空时间:最后一个任务从进入流水线到流出结果所需的时间 238 | 239 | 在装入和排空的过程中,流水线不满载。 240 | 241 | 指令通过流水线时间最长的段称为**流水线瓶颈**。 242 | 243 | 每段流水线后面有一个**缓冲寄存器**,称为**流水寄存器**。有**缓冲、隔离、同步**作用。 244 | 245 | ## 流水线性能计算和分析 246 | 247 | > 吞吐率、加速比、效率、最佳段数。 248 | 249 | 吞吐率 TP:单位时间内流水线完成的任务数量或输出结果的数量。$TP = \frac{n}{T}$ 250 | 251 | - 各段时间相等的流水线:理想的 k 段线性流水线完成 n 个连续任务的时间:$T_k = (k+n-1) \Delta t$ 252 | 253 | 实际吞吐率:$\frac{n}{(k+n-1) \Delta t}$ 254 | 255 | 最大吞吐率:$TP_{max}=\lim\limits_{n \to \infty} \frac{n}{(k+n-1) \Delta t} = \frac{1}{\Delta t}$ 256 | 257 | - 各段时间不等的流水线:时间最长段称为流水线的瓶颈$T_k = \sum\limits_{i=1}^k \Delta t_i + (n-1) \max (\Delta t_1,\Delta t_2,···,\Delta t_k)$ 258 | 259 | 加速比 S:完成同样任务,不使用流水线所用时间与使用流水线所用时间之比。$S=\frac{T_s}{T_k}$ 260 | 261 | - 各段时间相等的 k 段流水线:$S = \frac{n \times k \Delta t}{(k+n-1) \Delta t}$ 262 | 263 | 最大加速比:k 264 | 265 | - 各段时间不等的流水线:$S = \frac{n \sum\limits_{i=1}^k \Delta t_i}{\sum\limits_{i=1}^k \Delta t_i + (n-1) \max (\Delta t_1,\Delta t_2,···,\Delta t_k)}$ 266 | 267 | 效率 E:流水线中的设备实际使用时间与整个运行时间的比值,又称流水线设备利用率。 268 | 269 | - 连续完成 n 个任务,每段的效率计算:每段都执行了 n 个任务,用时$n \Delta t$,效率$e = \frac{n \Delta t}{(k+n-1) \Delta t}$ 270 | - 整条流水线的效率$E = \frac{e_1+e_2+...+e_k}{k}= \frac{n}{k+n-1}$ 271 | 272 | TP、S、E 关系: 273 | 274 | - $E=P \times \Delta t$、$E = \frac{S}{k}$ 275 | 276 | 解决流水线瓶颈的方法: 277 | 278 | - 重复设置瓶颈段:让多个瓶颈流水段并行工作。 279 | - 瓶颈段再细分:细分为多个子流水段(每个子流水段用时和非瓶颈段相同),形成超流水线。 280 | 281 | 流水线的最佳段数:流水线段数增加,吞吐率、加速比和价格均提高。 282 | 283 | - PCR 定义为单位价格的最大吞吐率。 284 | - $PCR = \frac{P_{max}}{C}$,其中$P_{max} = \frac{1}{\frac{t}{k}+d}$,$C = \frac{1}{a+b \times k}$。t 为非流水机器串行完成一个任务的时间,d 为锁存器延迟,a 为流水段本身价格,b 为锁存器价格。 285 | - 对 k 求导可得 PCR 极大值,以及对应的最佳段数$k_0$。$k_0 = \sqrt{\frac{t \times a}{d \times b}}$ 286 | - 大于等于 8 段的流水线称为超流水线。 287 | 288 | ## 流水线例题 289 | 290 | image-20210616154958511 291 | 292 | 解:是静态流水线,不能动态切换流水线功能。因此应算完全部加法再算乘法。 293 | 294 | image-20210616155129119 295 | 296 | ## 流水线相关与冲突(五段流水线) 297 | 298 | 经典五段流水线:分为 IF、ID、EX、MEM、WB 五个周期。 299 | 300 | - IF:以程序计数器 PC 中的内容作为地址,从存储器中取出指令并放入指令寄存器 IR。PC 指向顺序的下一条指令。 301 | - ID:指令译码,用 IR 中的寄存器地址去访问通用寄存器组,读出所需操作数。 302 | - EX: 303 | - load 和 store 指令:ALU 把指定寄存器的内容与偏移量相加,形成访存有效地址。 304 | - ALU 指令:ALU 对从通用寄存器组读出的数据进行运算。 305 | - 分支指令:ALU 把偏移量与 PC 值相加,形成转移目标的地址。同时,判断分支是否成功。 306 | - MEM: 307 | - load 和 store 指令:根据有效地址从存储器读出相应数据,或把指定数据写入有效地址指向的存储单元。 308 | - 分支指令:如果分支成功,就把在前一个周期中计算好的转移目标地址送入 PC。分支指令执行完成。否则,不进行任何操作。 309 | - ALU 指令此周期不进行操作。 310 | - WB:把结果写入通用寄存器组。对于 ALU 指令,结果来组 ALU。对于 load 指令,结果来自存储器。 311 | 312 | 相关与流水线冲突: 313 | 314 | - 相关:两条指令之间存在某种依赖关系,以至于他们可能无法在流水线中重叠执行,或只能部分重叠。 315 | 316 | 相关有三种类型:数据相关(真相关)、名相关、控制相关。 317 | 318 | - 数据相关:下述条件之一成立,则称指令之间数据相关。 319 | 320 | - 指令 a 使用指令 b 产生的结果。 321 | - 指令 a 与指令 b 数据相关,而指令 b 与指令 c 数据相关。 322 | 323 | 第二个条件表明数据相关具有传递性。 324 | 325 | - 名相关:名指指令访问的寄存器或存储器的名称。两条指令使用了相同的名,但并没有数据流动关系,则称为名相关。 326 | 327 | - 反相关:指令 b 写的名与指令 a 读的名相同。反相关指令之间的执行顺序必须严格遵守,保证 b 读的值是正确的。 328 | - 输出相关:指令 b 与指令 a 写的名相同。输出相关指令的执行顺序也必须严格遵守,保证最后的结果是指令 b 写进去的。 329 | 330 | 名相关的两条指令之间没有数据的传送,只是恰巧用了相同的名。可以通过**换名技术**(改变指令中操作数的名)消除名相关。对于寄存器操作数换名称为**寄存器换名**。寄存器换名既可以通过编译器静态实现,也可以硬件动态完成。 331 | 332 | - 控制相关:分支指令和其它会改变 PC 值的指令引起的相关。需要根据分支指令的执行结果来确定后面该执行哪个分支上的指令。 333 | 334 | - 流水线冲突:对于具体的流水线,由于相关的存在,指令流中的下一条指令不能在指定的时钟周期开始执行。有三种类型,结构冲突、数据冲突、控制冲突。约定:当一条指令被暂停时,在该指令之后流出的所有指令都要被暂停,而之前流出的指令仍继续进行。 335 | 336 | - 结构冲突:某种指令组合因为硬件资源冲突而不能正常执行,称具有结构冲突。功能部件不是完全流水或硬件资源份数不够时发生。解决方法:插入暂停周期,或增加 Cache 等硬件资源。 337 | 338 | - 数据冲突:相关的指令靠得足够近,他们在流水线中的重叠执行或重新排序会改变指令读/写操作数的顺序,使结果错误,谓数据冲突。 339 | 340 | - 写后读冲突(RAW、WR):对应真数据相关。 341 | - 写后写冲突(WAW、WW):对应输出相关。写后写冲突仅发生在“不止一个段可以进行写操作,或指令被重新排序”的流水线中。前述五段流水线不发生 WAW 冲突。 342 | - 读后写冲突(WAR、RW):对应反相关。读后写冲突仅发生在“有些指令的写结果操作被提前、有些指令的读操作被滞后,或指令被重新排序”的流水线中。前述五段流水线不发生 WAR 冲突。 343 | 344 | 使用定向技术(旁路技术)减少数据冲突引起的停顿:将计算结果从其产生的地方(ALU 出口)直接送到其他指令需要它的地方(ALU 的入口),可以避免停顿。 345 | 346 | 需要停顿的数据冲突:对于无法通过定向技术解决的数据冲突,需要设置一个“流水线互锁机制”的功能部件保证指令正确执行。其作用是检测和发现数据冲突,并使流水线停顿(stall)直至冲突消失。 347 | 348 | 依靠编译器解决数据冲突:在编译时让编译器重新组织指令顺序来消除冲突。称为**指令调度**或**流水线调度**。 349 | 350 | - 控制冲突:分支指令和其它会改变 PC 值的指令引起的冲突。处理分支指令最简单的方法是“冻结”“排空”流水线,在 ID 段检测到分支指令时,立即暂停流水线输入,进行 EX、MEM,确定是否分支成功并计算出新的 PC 值,这样带来 3 个时钟周期的延迟。だめ。 351 | 352 | 为了减少**分支延迟**,可以采取:① 尽早判断出(或猜测)分支转移是否成功。② 尽早计算出分支目标地址。通过编译器减少分支延迟的方法: 353 | 354 | - 预测分支失败:在检测到分支指令之后,沿分支失败的分支继续处理指令。当确定分支是失败时(预测分支失败成功),流水线正常流动。否则(预测分支失败失败),把在分支指令之后取出的指令转化为空操作,按分支目标地址重新取指执行。 355 | 356 | - 预测分支成功:没用。除非已知分支目标地址。 357 | 358 | - 延迟分支:把无论是否分支成功都必须执行的指令,紧接着分支指令执行(放入延迟槽),延迟槽中的指令替换了原本必须插入的暂停周期。绝大多数延迟槽仅容纳一条指令。 359 | 360 | 延迟槽指令的调度方法三种: 361 | 362 | - 从前调度:从分支指令之前找一条指令插入延迟槽。被调度的指令必须与分支无关,适合任何情况。 363 | - 从目标处调度:分支成功时起作用。分支成功概率高时采用。 364 | - 从失败处调度:分支失败时起作用。不能从前调度时可用。 365 | 366 | > 条件转移分支指令通常要在 MEM 段末尾才会使 PC 内容发生改变。对于 k 级流水线,需停顿 k-1 个时钟,直到 PC 中生成新地址后,才能取出下一条指令。 367 | > 368 | > 最坏情况:分支指令占比为 p,预测分支失败,分支转移成功的概率为 q。k 段流水线执行 n 条指令,最坏需要多停顿$pqn(k-1) \Delta t$时间。流水线最大吞吐率为$\lim\limits_{n \to \infty} \frac{n}{(k+n-1) \Delta t + pqn(k-1) \Delta t}= \frac{1}{[1+pq(k-1)] \Delta t}$。(若没有分支指令最大吞吐率为$\frac{1}{\Delta t}$) 369 | 370 | # 第五章指令级并行及其开发 371 | 372 | > 指令集并行基础概念 373 | > 374 | > 指令的动态调度技术(硬件方法): 375 | > 376 | > - 乱序执行调度的概念 377 | > - 记分牌算法 378 | > - Tomasulo 算法 379 | > - 基于硬件的前瞻执行 380 | > 381 | > 动态分支预测技术: 382 | > 383 | > - 分支历史表 BHT 384 | > - 分支目标缓冲器 BTB 385 | > 386 | > 多流出技术:超标量、超流水、VLIW、静态指令调度 387 | 388 | ## 指令集并行基础概念 389 | 390 | **指令集并行(ILP)**是指令间存在的一种并行性,使计算机可以并行执行两条及以上的指令。 391 | 392 | 开发 ILP 的途径:① 资源重复(重复设置多个部件同时执行多条指令)② 采用流水线技术使指令重叠并行执行。 393 | 394 | 开发 ILP 的方法:分为硬件方法和软件方法。本章为硬件方法。 395 | 396 | 流水线处理机的实际 CPI:$CPI_{流水线} = CPI_{理想}+停顿_{结构冲突}+停顿_{数据冲突}+停顿_{控制冲突}$。减少停顿以提高降低 CPI、提高 IPC。 397 | 398 | 基本程序块:一串连续的代码除了入口和出口之外,没有其他的分支指令和转入点,称为一个**基本程序块**。 399 | 400 | 循环并行性:循环的不同迭代之间存在的并行性。本章不讨论。 401 | 402 | 相关与指令级并行(概念): 403 | 404 | - 程序顺序:由原来程序确定的在完全串行方式下指令的执行顺序。我们需要尽可能地开发并行性,只有在可能导致错误的情况下,才保持程序顺序。 405 | - 保持异常行为:无论怎么改变指令的执行顺序,都不能改变程序中异常的发生情况。实际使用中:指令执行顺序的改变不导致程序中发生新的异常。 406 | - 数据流:数据值从其产生者指令,到其消费者指令的实际流动。分支指令使得数据流有动态性,分支指令的执行结果决定哪条指令才是所需数据的产生者。 之后讨论的**前瞻执行**不仅解决异常问题,还能在保持数据流的情况下减少控制相关对开发 ILP 的影响。 407 | 408 | ## 指令的动态调度技术(硬件方法) 409 | 410 | **静态调度**在编译期间,把相关的指令拉开距离来减少可能产生的停顿。 411 | 412 | **动态调度**能在保持数据流和异常行为的情况下,通过硬件对指令执行顺序重排,减少数据相关导致的停顿: 413 | 414 | - 优点:① 能处理编译时情况不明的相关(如存储器访问相关),并简化编译器。② 使同一段代码能在不同流水线上高效地执行。 415 | - 代价:硬件复杂性显著增加。 416 | 417 | 动态调度基本思想: 418 | 419 | - 将流水线的 ID 段分为“IS 流出”、“RO 读操作数”两个阶段。这样使得指令**乱序执行**,指令的完成也是**乱序完成**。 420 | - 乱序执行带来新问题: 421 | - RW 冲突和 WW 冲突。 422 | - 异常处理复杂化。**不精确异常**:异常时处理机现场与严格按程序顺序执行时现场不同。不精确异常使得异常处理后难以继续执行原有程序。产生不精确异常的原因:当指令 a 导致异常发生时,流水线已经执行程序顺序是 a 之后的指令,还没完成程序顺序是 a 之前的指令。 423 | 424 | 典型动态调度算法:**记分牌算法、Tomasulo 算法**。主要考虑的因素:资源(结构)利用效率、三种数据相关。 425 | 426 | ### 记分牌算法 427 | 428 | 记分牌的目标:尽早执行没有结构冲突和数据冲突的指令。 429 | 430 | 指令执行的步骤:每条指令的执行过程分为 4 段——IS 流出、RO 读操作数、EX 执行、WB 写结果。(主要考虑浮点操作,运算在浮点寄存器之间进行,不涉及 MEM 段) 431 | 432 | - 流出:若流出指令所需的功能部件空闲,并且所有其他执行中的指令的目的寄存器与该指令不同,记分牌就向功能部件流出该指令,并修改记分牌内部的记录表。如果存在结构相关或 WAW 冲突,则该指令不流出。(在流出段解决了 WAW 冲突) 433 | - 读操作数:记分牌检测源操作数的可用性。一旦数据可用,它就通知功能部件从寄存器中读出源操作数并开始执行。否则就等待写完成之后再读出(锁定)(读操作数段动态地解决了 RAW 冲突,并可能导致指令乱序执行) 434 | - 执行:取到操作数后,功能部件开始执行。结果产生后,通知记分牌它已完成执行。这一步相当于五段流水线中的 EX。但在浮点流水线中,这一段可能占用多个时钟周期。其他指令如果不与正在执行或被锁定指令相关,可提前执行或完成。 435 | - 写结果:记分牌知道执行部件完成执行后,检测是否存在 WAR 冲突(前面某条指令的源操作数寄存器,是本指令的目标寄存器)。如果不存在(或已有的 WAR 冲突已消失),记分牌就通知功能部件把结果写入目的寄存器,并释放该指令执行所用的所有资源。否则必须等待。这一步对应五段流水线的 WB。 436 | 437 | 记分牌记录信息的组成: 438 | 439 | - 指令状态表:记录正在执行的各条指令已经进入哪一段。 440 | - 功能部件状态表:记录各个功能部件的状态。每个功能部件有 1 项,每项由 9 个字段组成。 441 | - Busy:忙标志,功能部件是否正忙。 442 | - Op:正在或将要执行的操作。 443 | - $F_i$:目的寄存器编号,$F_j,F_k$:源寄存器编号。(按指令中的顺序排列) 444 | - $Q_j,Q_k$:向源寄存器$F_j,F_k$写数据的功能部件。 445 | - $R_j,R_k$:源寄存器标志位,“yes”表示$F_j/F_k$的操作数**可用——就绪且未被取走(产生且未读)**。否则“no”。 446 | - 结果寄存器状态表:每个寄存器在该表中有一项,用于指出哪个功能部件(编号)将把结果写入该寄存器。如果正运行的指令全都不以它为目的寄存器,则设置为“no”或 0。 447 | 448 | image-20210621175746367 449 | 450 | 记分牌算法的冲突分析: 451 | 452 | - WW 冲突会导致记分牌在流出阶段停顿。 453 | 454 | - RW 冲突会导致记分牌在写结果阶段停顿。 455 | 456 | - 真相关引起的 WR 冲突会导致记分牌在读操作数阶段停顿。 457 | 458 | - 资源冲突会导致记分牌在流出阶段停顿。 459 | 460 | 通过记分牌,避免了 WW、WR、RW 冲突及结构冲突。 461 | 462 | ### Tomasulo 算法 463 | 464 | 又称公共数据总线法。通过分散控制,处理数据相关和乱序执行。 465 | 466 | 基于 Tomasulo 算法的 MIPS 处理器浮点部件主要结构: 467 | 468 | - 指令队列:存放部件送来的指令,FIFO、顺序流出。 469 | - 保留站:保存流出到本功能部件执行的指令信息(包括操作码、操作数、解决冲突的信息)。每个保留站有一个标识字段,唯一地标识了该保留站。 470 | - 访存部件缓冲器:load 缓冲器和 store 缓冲器存放读/写存储器的数据或地址(类似保留站)。 471 | - 公共数据总线 CDB:重要的数据通路。所有计算结果都送到 CDB,它直接播送到各个需要的地方。多个执行部件且采用多流出的流水线中有多条 CDB。计算结果先送到 CDB 再传送到功能部件,不需要经过寄存器。 472 | - 浮点寄存器 FP:通过总线连接到各功能部件,通过 CDB 连接到 store 缓冲器。 473 | - 运算部件:浮点加法器和浮点乘法器。 474 | 475 | 核心思想: 476 | 477 | - 记录和检测指令相关,把发生 WR 冲突的可能性减到最小。 478 | - 通过寄存器换名技术消除 RW 冲突和 WW 冲突:寄存器换名通过保留站和流出逻辑共同完成。当指令流出时,如果其操作数还没有计算出来,则将该指令中相应的寄存器号换名为将产生这个操作数的保留站的标识。当指令流出到保留站之后,其操作数寄存器号要么换成了数据本身(已就绪状态),要么换成了保留站标识,而不再与寄存器相关。这样消除了 WAR 冲突。 479 | 480 | 指令执行的步骤:三步。 481 | 482 | - 流出:从指令队列头部取指。如果该指令操作所要求的的保留站有空闲的,则把该指令送到该空闲保留站(设为 r)。如果操作数未就绪,则进行寄存器换名。另外,进行目的寄存器预约,将其设置为接收保留站 r 的结果(相当于提前完成了写操作)。由于指令顺序流出,同一个结果寄存器的预约结果肯定是最后一条指令的,消除了 WAW 冲突。如果没有空闲保留站,指令不能留出(发生结构冲突)。 483 | - 执行:如果某个操作数未被计算出来,保留站监视 CDB,结果产生保留站立刻从 CDB 获取数据。操作数都就绪后保留站用相应的功能部件开始执行指令操作。(靠推迟执行的方法解决 RAW 冲突)load 指令执行条件是存储器部件就绪,而 store 指令执行的条件是要存入存储器的数据到达并且存储器部件就绪。 484 | - 写结果:功能部件计算完毕后将结果放到 CDB 上,等待该结果的寄存器和保留站同时从 CDB 获取数据。 485 | 486 | 保留站字段: 487 | 488 | - Op:对源操作数进行的操作。 489 | - $Q_j,Q_k$:将产生源操作数的保留站号。0 表示操作数已就绪且在$V_j/V_k$中,或者不需要操作数。 490 | - $V_j,V_k$:源操作数的值,如`Reg[F4]​`。对于每一个操作数来说,V 或 Q 字段只有一个有效。 491 | - Busy:“yes”表示本保留站或缓冲单元正忙。 492 | - A:仅 load 和 store 缓冲器有该字段。开始先存放指令中的立即数字段,地址计算后存放有效地址。 493 | 494 | ![image-20210621200752388](计算机系统结构.assets/image-20210621200752388.png) 495 | 496 | ![image-20210621200740644](计算机系统结构.assets/image-20210621200740644.png) 497 | 498 | Tomasulo 算法的优点: 499 | 500 | - 冲突检测逻辑和指令执行控制是分布的(通过保留站和 CDB 实现)。 501 | - 通过寄存器换名和预约,消除了 WW 冲突和 RW 冲突导致的停顿。 502 | - 通过延迟执行解决 WR 冲突。 503 | - 保留站、寄存器组均有附加信息,用于检测和消除冲突。 504 | 505 | ## 动态分支预测技术 506 | 507 | 开发的 ILP 越多,控制相关的制约就越大:① 在 n 流出(每个时钟周期流出 n 条指令)处理机中,遇到分支指令的可能性增加 n 倍。② 根据 Amdahl 定律,机器 CPI 越小,控制停顿的相对影响越大。 508 | 509 | 动态分支预测技术目的:① 预测分支是否成功。② 尽快找到分支目标地址或指令。 510 | 511 | 动态分支预测技术需要解决的问题:① 如何记录分支的历史信息。② 如何根据这些信息预测分支去向,甚至提前取出分支目标指令。 512 | 513 | ### 分支历史表 BHT 514 | 515 | 记录分支指令最近几次的执行情况(成功或失败),并据此预测。使用两个 bit 存储历史分支信息。 516 | 517 | image-20210621201952952 518 | 519 | BHT 两个步骤: 520 | 521 | - 分支预测:当分支指令到达 ID 时,从 BHT 读出的信息进行分支预测。若正确就继续处理后续指令。若错误就作废预取指令,恢复现场,并从另一条分支路径重新取指。 522 | - 状态修改:修改 BHT 状态。 523 | 524 | ### 分支目标缓冲器 BTB 525 | 526 | 分支目标缓冲器 Branch-Target Buffer 作用: 527 | 528 | - 将分支成功的分支指令的地址,和它的分支目标地址都放到一个缓冲区中保存。 529 | - 缓冲区以分支指令的地址作为标识,得到转移目标指令地址信息。 530 | - 在 IF 段访问 BTB,将分支的开销降为 0。 531 | 532 | image-20210621202833308 533 | 534 | image-20210621202935476 535 | 536 | | 指令在 BTB 中? | 预测 | 实际情况 | 延迟周期 | 537 | | --------------- | ---- | -------- | -------- | 538 | | 是 | 成功 | 成功 | 0 | 539 | | 是 | 成功 | 不成功 | 2 | 540 | | 否 | | 成功 | 2 | 541 | | 否 | | 不成功 | 0 | 542 | 543 | (延迟两个周期:预测失败需要更新 BTB 的项,花费 1 个周期。对 BTB 项进行更改时需要停止取值,又花费 1 个周期) 544 | 545 | ### 基于硬件的前瞻执行(略) 546 | 547 | 基本思想:对分支结果预测,按预测结果继续取指、流出、执行后续指令,但结果不写回寄存区或存储器,而是写入**再定序缓冲器 ROB**,等到指令“确认”之后再写回寄存器或存储器。 548 | 549 | 前瞻执行机制下指令的执行步骤:流出——执行——写结果到 ROB——确认。 550 | 551 | ## 多流出技术 552 | 553 | 一个时钟周期内流水线流出指令条数称为 ILP。 554 | 555 | 在每个时钟周期内流出多条指令,CPI<1。 556 | 557 | image-20210621204809703 558 | 559 | 两种多流出处理机: 560 | 561 | - 超标量: 562 | - 每个时钟周期流出的指令条数不固定,但有上限 n。这种处理机称为 n 流出(n 发射)处理机。 563 | - 可以通过编译器静态调度,也可以基于 Tomasulo 算法进行动态调度。 564 | - 超长指令字 VLIW(Very Long Instruction Word): 565 | - 单一的流或控制器:在每个周期流出指令条数固定,这些指令构成一个长指令(指令包),通常大于 100 位。 566 | - 指令包中的指令之间并行性通过指令显式地表示出来。 567 | - 大量的数据通路和功能部件:设置多个功能部件。 568 | - 超长指令字包含多个控制字段:指令字被分割成一些字段,每个字段称为一个**操作槽**,直接独立控制一个功能部件。 569 | - 超长指令字的生成由编译器完成:指令调度由编译器静态完成,流出时无需复杂冲突检测。 570 | 571 | image-20210621210007044 572 | 573 | 静态调度的多流出技术: 574 | 575 | - 每个时钟周期流出 n 条指令。称为流出包。 576 | - 指令按序流出,在流出时由流出部件进行冲突检测: 577 | - 第一阶段:进行流出包内的冲突检测,选出初步判定可以流出的指令。 578 | - 第二阶段:检测选出的指令与正在执行的指令是否冲突。 579 | 580 | 超流水线处理机:每 1/n 个时钟周期流出一条指令。 581 | 582 | image-20210621210238347 583 | 584 | # 第四章 向量流水处理机 585 | 586 | > 向量处理方法:横向处理、纵向处理、纵横处理 587 | > 588 | > 向量流水处理机结构: 589 | > 590 | > - 存储器-存储器结构:纵向处理 591 | > - 寄存器-寄存器结构:纵横处理 592 | > 593 | > 提高向量处理机性能的方法: 594 | > 595 | > - 多功能部件的并行操作 596 | > - 链接技术 WD 相关 597 | > - 分段开采 598 | > - 多处理机系统结构 599 | > 600 | > 向量处理机性能的主要参数: 601 | > 602 | > - 一条向量指令的处理时间 603 | > - 一组向量指令的处理时间 604 | > - 向量处理机的性能评估(MFLOPS 或一个浮点运算的时间) 605 | 606 | ## 向量基本概念和处理方法 607 | 608 | 向量处理机:设置了向量数据表示和向量指令的流水线处理机。 609 | 610 | 向量处理机方式: 611 | 612 | - 横向处理方式:向量按 column 的方式从左到右横向进行。适用于一般处理机,不适用于向量处理机的并行处理。 613 | - 纵向处理方式:向量按 row 的方式从上到下纵向进行。将整个向量按相同运算处理完之后,再进行别的运算。不产生数据相关,对向量长度 N 没有限制。 614 | - 纵横处理方式:把向量分成若干组,组内按纵向方式处理,依次处理各组。对向量长度 N 没有限制,但以每 n 个元素分一组处理,n 的值固定。 615 | 616 | ## 向量处理机结构 617 | 618 | 存储器-存储器结构:适合纵向处理方式。 619 | 620 | - 源向量和目的向量都存放在存储器中,运算的中间结果需要送回存储器。 621 | - 对应的向量分量能并发访问,计算结果能并行地保存。 622 | - 普通存储器的 3 倍带宽:3 条独立数据通路,一个时钟周期读出两个操作数并写回一个结果。 623 | 624 | 寄存器-寄存器结构:适合纵横处理方式。 625 | 626 | - 若干级中间存储器形成有层次结构的存储系统,相当于寄存器。 627 | - 访问中间存储器速度更快。 628 | - 通过中间存储器形成新的数据结构,高效。 629 | - 中间存储器高带宽、多种寻址方式、支持流水线链接技术。 630 | 631 | 向量流水线并行条件: 632 | 633 | - 功能部件不冲突 634 | - 源寄存器不冲突 635 | - 结果寄存器不冲突 636 | - 数据不相关 637 | 638 | ## 提高向量流水处理机性能 639 | 640 | - 设置多个功能部件并行 641 | - 链接技术:向量运算输出可直接作为输入使用,结果寄存器立即成为后继指令操作数寄存器。是定向技术的发展,利用 WR 数据相关性。数据进(出)每个功能部件需 1 个时钟周期。 642 | - 分段(循环)开采:向量长度大于向量寄存器长度时,对向量进行分段处理,系统完成,对程序员透明。 643 | - 多处理机 644 | 645 | 链接技术: 646 | 647 | - 链接条件: 648 | - 空间:无向量寄存器、功能部件冲突 649 | - 时间: 650 | - 仅上一指令的第 1 个结果分量送入结果向量寄存器的时钟周期可链接。 651 | - 若后一指令源操作数分别是前两指令的结果寄存器,前两指令产生结果时间必须相等。向量长度必须相等。 652 | - 链接运算时间:① 对于链接形成的大流水线,其通过(装入)时间为$a+7+c+d+3+f+g+4+i+f+2$(没有$l$),若传送时间全为 1,则通过时间为 23。② 若向量长度为 N,计算完毕需要的时间是$23+N$。 653 | 654 | image-20210623163654677 655 | 656 | ## 向量处理机性能评价 657 | 658 | 向量处理指令特点: 659 | 660 | - 一条指令得到若干运算结果。 661 | - 执行时间与向量长度有关。 662 | - 向量处理中包含标量指令。 663 | - CPI、MIPS 不能反映向量处理性能。 664 | 665 | 向量处理机性能参数: 666 | 667 | - 向量指令处理时间$T_{vp}$: 668 | - 一条向量指令执行时间$T_{vp} = (T_{start}+n) T_c$,$T_{start}$为从第一条指令开始执行,到还差一个时钟周期就产生第一个结果所需时钟周期数。 669 | - 一组向量指令总执行时间$T_{all} = (T_{start} + mn) T_c, \space T_{start} = \sum_{i=1}^m T_{start}^{(i)}$。链接情况下该组指令总启动时间+编队个数$\times$向量长度。 670 | - 分段开采时:。 671 | - 向量流水线最大性能$R_\infty$:$\lim\limits_{n \to \infty} \frac{向量指令序列中浮点运算次数 \times 时钟频率}{向量指令序列执行所需时钟周期数}$ 672 | - 半性能向量长度$n_{1/2}$:向量处理机性能为其$R_\infty$一半时所需向量长度。与流水线建立时间有关。 673 | - 向量长度临界值$n_v$:向量流水方式的处理速度优于标量串行方式的处理速度时,向量长度的临界值。 674 | 675 | # 第九章 互连网络 676 | 677 | > 互连函数 678 | > 679 | > 互连网络的结构参数与性能指标 680 | > 681 | > 静态互联网络 682 | > 683 | > 动态互联网络 684 | > 685 | > 消息传递机制 686 | 687 | 定义:互连网络是开关元件按一定拓扑结构和控制方式构成的网络。用于实现计算机系统中结点之间的相互连接。 688 | 689 | 三要素:互连结构、开关元件、控制方式。 690 | 691 | ## 互连函数 692 | 693 | 循环表示法:$(x_0x_1x_2 \cdots x_{j-1})$,表示$I(x_0x_1x_2 \cdots x_{j-2}x_{j-1}) = x_1x_2x_3 \cdots x_{j-1}x_0$。$j$称为循环长度。 694 | 695 | 计算互连时算该处理器连接到的处理器、连接到该处理器的处理器。 696 | 697 | 基本互连函数: 698 | 699 | - 恒等函数:$I(x_{n-1}x_{n-2}...x_1x_0) = (x_{n-1}x_{n-2}...x_1x_0)$ 700 | - 交换函数:用于构造立方体和超立方体互连网络。$Cube_1(x_{n-1}x_{n-2}...x_1x_0)=x_{n-1}x_{n-2}...\bar{x_1}x_0$实现二进制地址编号中第 k 位互反的输入端和输出端之间的连接。互连函数种类为$log_2N,N为结点个数$。 701 | - 均匀洗牌函数:用于构造 Omega 和逆 Omega 网络。将入线均分,前一部分和后一部分按顺序一个接一个交叉连接。 702 | - 均匀洗牌$\sigma(x_{n-1}x_{n-2}...x_1x_0)=x_{n-2}x_{n-3}...x_1x_0x_{n-1}$,将入线二进制地址循环左移一位得到。 703 | - 逆均匀洗牌$\sigma(x_{n-1}x_{n-2}...x_1x_0)=x_0x_{n-1}x_{n-2}...x_2x_1$,循环右移。 704 | - 第 k 个子函数:把互连函数作用于低 k 位。第 k 个超函数:把互连函数作用于高 k 位。 705 | 706 | image-20210623181701508 707 | 708 | - 蝶式函数:$\beta (x_{n-1}x_{n-2}...x_1x_0)=x_0x_{n-2}...x_1x_{n-1}$。将输入端二进制最高位$x_{n-1}$与最低位$x_0$互换位置得到。 709 | - 反位序函数:$\rho (x_{n-1}x_{n-2}...x_1x_0)=x_0x_1...x_{n-2}x_{n-1}$,把输入二进制编号各位次序颠倒。 710 | - 移数函数:$\alpha (x) = (x \pm k)\mod N$把二进制编号模 N。 711 | 712 | image-20210623181606770 713 | 714 | - $PM2I$函数:加减$2^i$。构成数据变换网络的基础。实质为 1、2、4 个环形网。 715 | - $PM2_{+i}(x) = (x + 2^i)\mod N$,$0 \le i \le log_2N$。 716 | - $PM2_{-i}(x) = (x - 2^i)\mod N$ 717 | 718 | image-20210623181547578 719 | 720 | ## 结构参数与性能指标 721 | 722 | 6 个结构参数: 723 | 724 | - 网络规模$N$ 725 | - 结点度$d$:结点所连接的边数(入度、出度) 726 | - 节点距离:从一个结点出发到另一个结点,经过边数的最小值。 727 | - 网络直径$D$:网络中结点距离的最大值。(越小越好) 728 | - 等分宽度$b$:把网络均分为结点数相同的两半,在各种切法中,沿切口边数的最小值。线等分宽度$B = b \times w$,$w$为通道宽度(bit),等分宽度反映网络最大流量。 729 | - 对称性 730 | 731 | 两类性能指标:时延和带宽 732 | 733 | - 时延: 734 | - 通信时延 735 | - 软件开销:源节点、目的结点收发消息软件的执行时间。取决于软件内核。 736 | - 通道时延:消息长度/通道带宽。通常由瓶颈段带宽决定。 737 | - 选路时延:与传送路径上结点数成正比。 738 | - 竞争时延:避免、解决争用所需的时间。很难预测,取决于网络状态。 739 | - 网络时延:通道时延+选路时延。由网络硬件决定,与软件、传输状态无关。 740 | - 带宽 741 | - 端口带宽:单位时间内从该端口传输到其他端口的最大信息量。 742 | - 对称网络中各端口带宽相等=网络端口带宽。 743 | - 非对称网络的端口带宽=所有端口带宽的最小值。 744 | - 聚集带宽:网络从一半节点到另一半节点,单位时间传送的最大信息量。 745 | - 等分带宽:与等分宽度对应的切平面中,所有边合起来,单位时间传送的最大信息量。 746 | 747 | ## 静态与动态互连网络 748 | 749 | 静态互连网络:各结点之间固定连接通路,运行中不能改变。 750 | 751 | - 线性阵列:一维线性网络,N 个结点用 N-1 个链路连成一行。 752 | - 环和带弦环:用一条附加链路将线性阵列端结点连接,构成环。 753 | - 带弦环:增加链路越多,结点度越高,网络直径越小。 754 | - 全连接网络:极端情况。 755 | - 循环移数网络:在环上每个结点到所有与其距离为 2 的整数幂的结点之间都增加一条附加链路。 756 | - 树状:k 层完全平衡二叉树有$N=2^k-1$个结点。 757 | - 星形:CS 模式。中心结点故障,整个系统瘫痪。 758 | - 胖树形:越靠近树根,树干越粗(通道带宽增加)。 759 | - 网格形、Illiac、环状网络: 760 | 761 | image-20210624105654796 762 | 763 | - 超立方体:n 维结点数$N=2^n$。对于一个结点,在每一维方向上都只和一个结点相连。 764 | 765 | image-20210624110451057 766 | 767 | 带环 n-立方体(n-CCC):用 k 个结点构成的环代替 k 维超立方体。结点度恒定,扩展性好。 768 | 769 | image-20210624110558544 770 | 771 | k 元 n-立方体:这啥 772 | 773 | | 类型 | 对称 | 结点度 | 直径 | 等分宽度 | 774 | | ------------- | ---- | -------------------- | ---------------------- | --------------------- | 775 | | 线性阵列 | 否 | 端结点 1,其余结点 2 | N-1 | 1 | 776 | | 环 | 是 | 2 | 双向环:N/2,单向环:N | 2 | 777 | | 全连接网络 | 是 | N-1 | 1 | | 778 | | 循环移数网络 | 否 | $2log_2N-1$ | $\frac{log_2N}{2}$ | | 779 | | 树状 | 否 | 最大为 3,根和叶为 1 | $2(k-1)$,k 为层数 | 1 | 780 | | 星形 | 是 | 中央 N-1,边缘 1 | 2 | $\lfloor N/2 \rfloor$ | 781 | | k 维网格形 | 是 | 内部 2k | $k(n-1)$ | | 782 | | Illiac | 否 | 4 | n-1(纯网格的一半) | 2n | 783 | | 环网形 | 是 | 4 | $2\lfloor N/2 \rfloor$ | 2n | 784 | | n 维超立方体 | 是 | n | n | $N/2$ | 785 | | 带环 n-立方体 | 是 | 3(扩展性好) | 2n | N/(2n) | 786 | | | | | | | 787 | 788 | 动态互连网络:由有源交换开关构成,链路可通过设置开关状态重构。网络边界上开关元件可与处理机相连。 789 | 790 | - 总线结构 791 | 792 | - 优点:结构简单、实现成本低。 793 | - 缺点:模块分时共享,带宽较窄。(可采用多总线或多层次总线解决) 794 | 795 | - 交叉开关网络 796 | 797 | - 可以无阻塞实现$n!$种置换。 798 | - 其他参考交换原理。 799 | 800 | - 多级互联网络 801 | 802 | - MIMD 和 SIMD 计算机都采用多级互连网络 MIN。 803 | 804 | image-20210624112351189 805 | 806 | - 区别:开关模块、控制方式、级间互连模式不同。 807 | 808 | - 控制方式:级控制、单元控制、部分级控制 809 | - 级间互连:参考交换原理。 810 | 811 | - 多级立方体网络:STARAN 网络、间接二进制 n 方体网络。 812 | 813 | image-20210624114242660 814 | 815 | - Omega 网络:级间全部采用均匀洗牌。N=8的多级立方体互连网络的另一种画法 816 | 817 | image-20210624114159863 818 | 819 | - 动态互联网络的比较: 820 | 821 | | 网络 | 优点 | 缺点 | 822 | | -------- | ---------------------- | -------------------------------------------------- | 823 | | 总线互连 | 简单、成本低 | 带宽较窄 | 824 | | 交叉开关 | 带宽和寻路性能最好 | 成本最高 | 825 | | 多机互连 | 模块化结构、扩展性较好 | 时延随级数增加而增加,复杂度比总线高很多,成本较高 | 826 | 827 | ## 消息传递机制 828 | 829 | RPC:Remote Process Call,远程进程调用。 830 | 831 | 消息寻径方案: 832 | 833 | - 消息格式: 834 | - 消息:节点间通信的逻辑单位,由若干“包”组成。包分为若干“片”。寻径信息和包序列号形成头片,其余是数据片。 835 | - 两类四种寻径方式: 836 | - 线路交换:建立物理通路再传递信息。时延$T=\frac{L+L_t \times (D+1)}{B}$。L 为包总长,$L_t$为建立路径所需最小包长度,D 为中间结点个数,B 为带宽。 837 | - 优点:带宽大,平均时延小,占用缓冲区小。 838 | - 适合动态和突发性的大规模并行处理数据传送。 839 | - 缺点:频繁建立物理通路时间开销大。 840 | - 包交换 841 | - 存储转发:$T_{SF} = \frac{L}{B}(D+1)$ 842 | - 优点:简单。 843 | - 缺点:包缓冲区大、网络时延大。 844 | - 虚拟直通路:$T = T_f \times D + \frac{L}{B} \approx \frac{L}{B}$ 845 | - 优点:通信时延与结点数无关。 846 | - 缺点:中间结点依然需要缓冲器、寻径阻塞时依然需要存储整个包,占用缓冲区大。 847 | - 虫蚀:最小单位为片。一个结点把头片送到下一个结点后,后面的各片才能依次送出。$T_{WH} \approx \frac{L}{B}$ 848 | - 优点:每个结点缓冲器小,易于 VLSI 实现。有较小的网络传输延迟。 849 | - 缺点:一片被阻塞时,该消息所有片都被阻塞在结点。 850 | 851 | 死锁与虚拟通道: 852 | 853 | 流控制策略: 854 | 855 | 选播和广播寻径算法: 856 | 857 | # 第十三章 阵列处理机 858 | 859 | > 阵列处理机概念 860 | > 861 | > 阵列处理机的结构: 862 | > 863 | > - 分布式存储器的阵列机 864 | > - 共享存储器的阵列机 865 | > 866 | > 阵列处理机的特点(与流水线向量对比) 867 | > 868 | > 了解 ILLIAC IV 和 BSP 阵列处理器基本结构 869 | > 870 | > 典型算法: 871 | > 872 | > - 递归折叠求和算法 873 | 874 | ## 概念 875 | 876 | 操作模型用五元组表示:阵列处理机=$(N,C,I,M,R)$,N 为处理单元 PE 数、C 为控制部件 CU 直接执行的指令集、I 为 CU 广播至所有 PE 并行执行的指令集、M 为屏蔽方案集、R 为数据寻径功能集。 877 | 878 | 阵列处理机的特点: 879 | 880 | - SIMD 881 | - 利用并行性中的同时性,而非并发性。所有处理单元同时进行相同的操作。 882 | - 受互连网络结构限制,限制了适用的求解算法类别。 883 | 884 | ## 结构 885 | 886 | - 分布式存储器阵列机: 887 | - 主机:程序编辑、编译、调试,程序和数据装入(控制存储器)。 888 | - 指令送到阵列控制部件译码。标量指令由标量处理机执行,向量指令通过广播总线播送到所有 PE 执行。 889 | - 数据集划分后通过数据总线分布存放到 PE 的本地存储器 LM。 890 | - 有多个处理单元 PE,PE 有自己的本地存储器 LM。PE 之间通过数据寻径网络连接实现通信。 891 | - PE 的同步在控制部件的控制下由硬件实现,PE 在一个周期执行同一条指令。 892 | - 屏蔽逻辑控制某些 PE 在指定指令周期是否参与执行。 893 | - 主要区别在于数据寻径网络不同。IlliacIV:4 邻接网络、CM-2:嵌入网格的超立方体,等。 894 | - 大部分阵列处理机都是分布式存储器。易于构成 MPP。 895 | 896 | image-20210624150128094 897 | 898 | - 共享存储器 899 | - 集中设置存储器:共享多体并行存储器 SM——通过对准网络——连接 PE。 900 | - 存储模块数目等于或略大于 PE 数目。 901 | - 必须减少访存冲突,适合较少 PE 情况。 902 | - 所有阵列指令使用长度等于 PE 个数的向量操作数。 903 | 904 | image-20210624151105872 905 | 906 | ## 阵列处理机与流水线向量处理机对比 907 | 908 | - 均适合高速数值计算。阵列处理机有固定结构,与一定算法相联系。 909 | - 阵列处理机用大量处理单元对各分量运算,各单元同时进行相同操作,依赖空间并行技术。并行化程度高,潜力大。 910 | - 向量处理机基于流水线技术,时间并行性。 911 | - 阵列处理机每个单元负担多种处理功能,相当于向量机多功能流水部件,处理数据效率较低。 912 | - 互连网络设计和研究——阵列机研发重点。 913 | - 阵列机有一台标量处理机和一台前端机,向量处理部件是系统主体。机器性能主要取决于向量处理部分。也取决于标量运算速度和编译开销。 914 | 915 | ## 算法 916 | 917 | 某一向量含有 N 个向量元素,要求出元素累加和——将 N 个数的顺序相加转变为并行相加的问题。 918 | 919 | image-20210624152309862 920 | 921 | > 例:某分布存储器多处理机,8 个处理器立方体网连接,标号为 0 至 7。向量 X 的 16 个分量分别存放在 8 个 CPU 局部存储,X 的分量 i 放在标号为 i 模 8 的处理器中。标量 a 放在 0 号处理机中,最终结果 S 可放在任意处理器。在相邻处理器之间传送一个数据需要 2△t,乘法需要 4△t ,加法需要 1△t ,其它操作时间忽略不计。 求$S=\prod_{i=1}^{15}(X_i+a)$的最短执行时间。 922 | > 923 | > 解:总时间三部分构成: 924 | > 925 | > - 标量 a 广播时间 = $传送时间2\Delta t \times 网络直径3 = 6\Delta t$ 926 | > - 阵列处理器处理时间 两次加法一次乘法 = $2 \times 1\Delta t + 4\Delta t = 6\Delta t$ 927 | > - 递归折叠时间 传+乘 传+乘 传+乘 = $2+4+2+4+2+4 = 18\Delta t$ 928 | > 929 | > 总时间:$6+6+18 = 30 \Delta t$ 930 | 931 | # 第十章 多处理机 932 | 933 | > 多处理机概念: 934 | > 935 | > - MIMD 计算机的特点、分类:PVP/SMP/MPP/DSM/COW 936 | > 937 | > 对称式共享存储器多处理器(SMP)系统结构及特点 938 | > 939 | > 分布式共享存储器多处理器系统结构及特点 940 | > 941 | > - Cache 一致性问题成因和解决方法(写作废、写更新) 942 | > - 监听协议法 943 | > - 目录表协议(三种结构) 944 | 945 | ## MIMD 计算机特点、分类 946 | 947 | MIMD 是通用计算机系统的主要选择。 948 | 949 | 分类: 950 | 951 | - 并行向量多处理机 PVP,第四章:多台巨型向量处理机,共享存储器互连而成。 952 | - 大规模并行处理机 MPP,第十章:计算机模块作为一个结点,通过专用接口连接到互连网络上。 953 | - 集中式共享存储器多处理机 SMP:主流。 954 | - 分布式存储器多处理机 955 | - 分布式共享存储器系统 DSM 956 | - 机群多处理机 COW,第十二章:多个完整的计算机,通过商品化互连网络(以太网、ATM 等)相连。 957 | 958 | 特性:高性能、灵活性。 959 | 960 | --- 961 | 962 | 根据存储器组织结构分类: 963 | 964 | - 集中式共享存储器结构(对称式共享存储器多处理机 SMP): 965 | 966 | - 共享集中式物理存储器、通过总线或交换开关互连。 967 | - 也被称为UMA(Uniform Memory Access)结构。各处理器访问存储器时延相同。 968 | - 最流行结构。 969 | 970 | - 分布式存储器多处理机:存储器分布在各结点。 971 | 972 | - 要求高带宽互连网络。 973 | - 优点:① 若大多数需求为本地访存,可以降低存储器、互连网络带宽需求。② 本地存储器访问时延小。 974 | - 缺点:① 处理器之间通信复杂。② 处理器之间访问延迟较大。 975 | 976 | 分布式存储器多处理机两种存储器系统结构: 977 | 978 | - 共享地址空间(每个结点存储器统一编址):分布式共享存储器系统 DSM, 或 非均匀访存模型 NUMA 979 | - 共享逻辑地址空间。 980 | - 任意存储器可访问共享空间中任一单元。 981 | - 不同处理器上同一物理地址指向同一存储单元。 982 | - 具有共享存储器通信机制。采用访存类指令对地址进行读写。与 SMP 通信机制兼容、开销较低、可利用 Cache 技术减少通信频度和延迟和访问冲突、易于编程。 983 | - 在共享存储器上支持消息传递相对简单。 984 | - 独立地址空间(编址相互独立):多存在于机群 COW 985 | - 系统地址空间由多个独立地址空间组成。 986 | - 每个结点存储器只能本地存储器访问。 987 | - 每个存储器-处理器模块是一台单独计算机 988 | - 具有消息传递通信机制。采用显式传递消息请求操作或数据完成通信。硬件简单、显式通信、显式开销。 989 | - 在消息传递硬件上支持共享存储器相对困难。 990 | 991 | 并行处理的挑战: 992 | 993 | - 程序中的并行性有限(Amdahl 定律导致加速比不高) 994 | - 解决:采用并行性更好的算法 995 | - 通信开销较大 996 | - 解决:依靠系统结构支持使远程访问延迟降低、改进编程技术。 997 | 998 | 反应并行程序性能的重要度量:计算/通信比率。 999 | 1000 | ## Cache 一致性问题 1001 | 1002 | (写直达法:写入 Cache+写入存储器。写回法:写入 Cache。) 1003 | 1004 | 允许共享数据进入 Cache,会出现多个处理器 Cache 中都有同一存储块的副本。当某个处理器对 Cache 修改后,导致其 Cache 中的数据与其他处理器 Cache 中的数据不一致。 1005 | 1006 | 存储器一致性定义:对存储器中某个数据项的任何读操作,均能得到其最新写入的值。假设: 1007 | 1008 | - 写操作完成的定义:所有处理器均看到写的结果。 1009 | - 处理器任何访存操作不改变写的顺序。 1010 | 1011 | Cache 一致性协议:关键在于跟踪记录共享数据块的状态。 1012 | 1013 | - 目录式协议(互连网络) 1014 | - 监听式协议(总线) 1015 | - Cache 包含物理存储器中数据块的拷贝,保存各个块的共享状态信息。 1016 | - Cache 通常连在共享存储器的总线上。 1017 | - 当某个 Cache 需要访问时,它把请求放到总线上广播出去。 1018 | - 其他 Cache 控制器监听总线,判断它们自身是否有请求的数据块。如果有就进行相应操作。 1019 | 1020 | --- 1021 | 1022 | 写作废:在处理器对某个数据项写入之前,作废其他副本,保证它拥有对该数据项的唯一访问权。 1023 | 1024 | 写更新:当处理器对某数据想进行写入时,通过广播更新其他 Cache中所有该数据的副本。 1025 | 1026 | 性能区别: 1027 | 1028 | - 写作废消耗的总线和存储器带宽更少,多在基于总线的多处理机中采用。 1029 | - 写更新的延迟时间较小,适合在处理器个数不多时采用。 1030 | 1031 | --- 1032 | 1033 | ## 监听协议的基本实现技术 1034 | 1035 | - 处理器之间通过可以广播的互连机制(通常是总线)相连。 1036 | - 总线实现了写操作的串行化(获得总线控制权具有顺序性)。 1037 | - 一个处理器的 Cache 相应本地 CPU 访问时,如果涉及全局操作,Cache 控制器就要在总线上广播相应消息。 1038 | - 所有处理器一直监听总线,检测总线上的地址在他们的 Cache 中是否有副本。 1039 | - 监听的通常是 Cache 的标识(tag)。 1040 | 1041 | Cache 发送的消息: 1042 | 1043 | - RdMiss——读不命中:需要通过总线找到相应数据块的最新副本,调入本地 Cache。 1044 | - WtMiss——写不命中:需要通过总线找到相应数据块的最新副本,调入本地 Cache。写直达法:从主存中总可以取到最新值。写回法:最新值可能在某 Cache 中,也可能在主存中。(后续只讨论写回法) 1045 | - Invalidate——作废:通知其他各处理器作废其 Cache 中副本。 1046 | 1047 | 写作废:(S-Shared,只读。M-Modified,可读写。I-Invalid,不可读写) 1048 | 1049 | image-20210624170444635 1050 | 1051 | image-20210624170500516 1052 | 1053 | ## 目录协议的基本思想与实现技术 1054 | 1055 | 广播和监听的机制使得监听协议的可扩放性很差。 1056 | 1057 | 目录协议: 1058 | 1059 | - 主存中设置一个目录表,存放每个数据块(行)状态位和若干指针位(构成一个位向量),指针位对应处理机 Cache 。 1060 | - 状态位指示数据块状态,指针位指出哪些处理机 Cache 中有数据块副本。 1061 | - 当一个处理机访问本身 Cache 时,根据目录表,有选择地通知存有数据块的处理机 Cache。避免 Cache 的不一致性。 1062 | - 位向量:记录哪些 Cache 中有副本,称为共享集 S。 1063 | 1064 | 存储块的状态有三种: 1065 | 1066 | - 未缓冲:尚未调入 Cache。所有存储器 Cache 中都没有。 1067 | - 共享:一个或多个处理机拥有该块副本,且副本与存储器中的该块相同。 1068 | - 独占:仅一个处理机有该块副本,且该处理机已经进行了写操作。存储器中该块数据已过时。这个处理机称为该块拥有者。 1069 | 1070 | 三种结点: 1071 | 1072 | - 本地结点 A:发出访问请求的结点,假设访问的地址为 K。 1073 | - 宿主结点 B:包含所访问的存储单元及其目录项的结点 。 1074 | - 远程结点 C:拥有存储块副本的结点。可以和宿主结点是同一个结点,也可以不是。 1075 | 1076 | 结点间发送的消息: 1077 | 1078 | - 本地结点发送给宿主结点(目录)的消息: 1079 | - RdMiss(P,K):处理机 P 读地址 k 数据未命中,请求宿主提供该块,并把 P 加入共享集。 1080 | - WtMiss(P,k):处理机 P 写地址 k 数据未命中,请求宿主提供该块,并把 P 设为该块独占者。 1081 | - Invalidate(k):向所有拥有相应数据块副本的远程 Cache 发送消息,作废副本。 1082 | - 宿主结点发送给本地结点消息: 1083 | - DReply(D):把数据 D 返回给本地 Cache。 1084 | - Invalidate(k):作废远程 Cache 中地址 k 的数据块。 1085 | - Fetch(k):从远程 Cache 取地址 k 数据到宿主结点,并把地址 k 块状态改为共享。 1086 | - Fetch&Invalidate(k):从远程 Cache 取地址 k 数据到宿主结点,并作废远程 Cache 中该块。 1087 | - 远程结点发给宿主结点的消息: 1088 | - WtBack(k,D):把远程 Cache 中地址 k 数据块 D 写回到宿主结点。这是对 Fetch 或 Fetch&Invalidate 的响应。 1089 | 1090 | image-20210624173632498 1091 | 1092 | image-20210624173656148 1093 | 1094 | 目录三类结构: 1095 | 1096 | - 全映像目录:最大。 1097 | 1098 | - 每个目录项包含 N 位位向量,对应处理机个数。 1099 | - 优点:① 处理比较简单、速度快。② 每个 Cache 允许存放同一数据块的副本。 1100 | - 缺点:① 存储空间开销大。② 目录空间复杂度$O(N^2)$。③ 可扩放性很差。 1101 | 1102 | image-20210624175006428 1103 | 1104 | - 有限映像目录:较大。 1105 | 1106 | - 优点:提高可扩放性,减少目录占用空间。 1107 | - 核心思想:采用位数固定的目录项目。限制同一数据块在所有 Cache 中的副本总数。 1108 | - 缺点:当目录项中 m 个指针占满,而又需要新调入该块时,就需要在 m 个指针中选择一个废弃。 1109 | 1110 | image-20210624175021573 1111 | 1112 | - 链式目录:最小。 1113 | 1114 | - 用一个目录指针链表表示共享集合。主存只有一个指针位指向一个处理机 Cache。 1115 | - 优点:不限制副本个数,扩展性好。 1116 | 1117 | image-20210624175119253 1118 | --------------------------------------------------------------------------------