408公式、结论、常量总结
Jackie

408公式、结论、常量总结

根据26版王道书籍整理

数据结构

第1章、绪论

  • O(1)常数阶<O(log2n)对数阶<O(n)线性阶<O(nlog2n)线性对数阶<O(n2)平方阶<O(n3)立方阶<O(2n)指数阶<O(n!)阶乘阶<O(nn)[1]

第3章、栈、队列和数组

  • n个不同元素入栈时,出栈元素不同排列的个数为[2]

1n+1C2nn\frac{1}{n+1}C_{2n}^{n}

  • 循环队列[3]

初始时:Q.front=Q.rear=0

队首指针进1:Q.front=(Q.front+1)%MaxSize

队尾指针进1:Q.rear=(Q.rear+1)%MaxSize

队列长度:(Q.rear+MaxSize-Q.front)%MaxSize

牺牲一个单元来区分队空还是队满

约定以“队首指针在队尾指针的下一位置作为队满的标志”

队满条件:(Q.rear+1)%MaxSize==Q.front

队空条件:Q.front==Q.rear

队列中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize

  • 二维数组按行/列优先存储的下标对应关系[4]

    设二维数组的行下标与列下标的范围分别为[0,h1]与[0,h2],每个数组元素所占存储单元为L

    • 优先存储结构关系式:LOC(ai,j)=LOC(a0,0)+[i×(h2+1)+j]×L
    • 优先存储结构关系式:LOC(ai,j)=LOC(a0,0)+[j×(h1+1)+i]×L
  • 对称矩阵元素下标对应关系[5]

k={i(i1)2+j1,ij(下三角区和主对角线元素)j(j1)2+i1,i<j(上三角区元素ai,j=aj,i)k= \begin{cases} \frac{i(i-1)}{2} + j - 1,i \geq j(\text{下三角区和主对角线元素}) \\ \frac{j(j-1)}{2} + i - 1,i < j(\text{上三角区元素}a_{i,j}=a_{j,i}) \end{cases}

  • 三角矩阵元素下标对应关系

    • 下三角矩阵

      k={i(i1)2+j1,ij(下三角区和主对角线元素)n(n+1)2,i<j(上三角区元素)k= \begin{cases} \frac{i(i-1)}{2} + j - 1,i \geq j(\text{下三角区和主对角线元素}) \\ \frac{n(n+1)}{2},i < j(\text{上三角区元素}) \end{cases}

    • 上三角矩阵

      k={(i1)(2ni+2)2+(ji),ij(上三角区和主对角线元素)n(n+1)2,i>j(下三角区元素)k= \begin{cases} \frac{(i-1)(2n-i+2)}{2} + (j - i),i \le j(\text{上三角区和主对角线元素}) \\ \frac{n(n+1)}{2},i > j(\text{下三角区元素}) \end{cases}

  • 三对角矩阵

ai,j(1≤i,j≤n,|i-j|≤1)在一维数组B中存放的下标k=2i+j-3

三对角矩阵某个元素ai,j存放在一维数组B第k个位置,则

i=(k+1)/3+1j=k2i+3i=\left \lfloor (k+1)/3+1 \right \rfloor\\ j=k-2i+3

第5章、树与二叉树

  • 树的性质[6]

树的结点数n等于所有结点的度数k之和加1

n=i=1kini+1=i=1knin=\sum_{i=1}^{k}i\cdot n_i+1=\sum_{i=1}^{k}n_i

度为m的树中第i层上至多有mi-1个结点(i≥1)

高度为h的m叉树至多有(mh-1)/(m-1)个结点

  • 树结点与度之间关系[7]

总结点数=n0+n1+n2+…+nm

总分支数=1n1+2n2+…+mnm

总结点数=总分支树+1

  • 二叉树

满二叉树:对于编号为i的结点,若有双亲,则其双亲为

i=i/2i=\left \lfloor i/2 \right \rfloor

若有左孩子,则左孩子为2i,若有右孩子,则右孩子为2i+1

非空二叉树上的叶结点数等于度为2的结点数加1,即n0=n2+1

结点i所在层次(深度)为

log2i+1\left \lfloor log_2i \right \rfloor+1

具有n个(n>0)结点的完全二叉树的高度为

log2(n+1)orlog2n+1\left \lceil log_2(n+1) \right \rceil or \left \lfloor log_2n \right \rfloor +1

  • 含有n个结点的二叉链表中,含有n+1个空链域[8]
  • 前序序列和后序序列不能唯一确定一棵二叉树,但可以确定二叉树中结点的祖先关系:当两个结点的前序序列为XY与后序序列为YX时,则X为Y的祖先[9]
  • 如果是m叉哈夫曼树,需保证初始增加若干权值为0的结点,使得n-1是m-1的倍数[10]
  • 构造哈夫曼树过程中共新建了n-1个结点(双分支结点),因此哈夫曼树的结点总数为2n-1

第6章、图

  • 设图G的邻接矩阵为A,An的元素An[i][j]等于由顶点i到顶点j的长度为n的路径的数目[11]
  • 关键路径[12]

    • 事件vk的最早发生时间ve(k)

      ve(源点)=0

      ve(k)=Max{ve(j)+Weight(vj,vk)},vk为vj的任意后继,Weight(vj,vk)表示<vj,vk>上的权值

    • 事件vk的最迟发生时间vl(k)

      vl(汇点)=ve(汇点)

      vl(k)=Min{vl(j)-Weight(vk,vj)},vk为vj的任意前驱

    • 活动ai的最早开始时间e(i)=ve(k)

    • 活动ai的最迟开始时间l(i)=vj(j)-Weight(vk,vj)

    • 一个活动ai的最迟开始时间l(i)和其最早开始时间e(i)的差额d(i)=l(i)-e(i)

第7章、查找

  • 设nh表示深度h的平衡二叉树中含有的最少结点数,则nh=nh-1+nh-2+1[13]

根结点黑高为h的红黑树内部结点数(关键字)至少(h层黑结点的满树形态)至少有2h-1个

从根到叶结点的最长路径不大于最短路径的2倍

有n个内部结点的红黑树高度h≤2log2(n+1)

  • m阶B树:所有结点的平衡因子均等于0的m路平衡查找树[15]

根结点子树∈[2,m]、关键字数∈[1,m-1]

除根结点外的所有非叶结点子树∈

[m2,m][\left \lceil \frac{m}{2} \right \rceil,m]

关键字数∈

[m21,m1][\left \lceil \frac{m}{2} \right \rceil-1,m-1]

  • B树的高度

B树的高度不包括最后的不带任何信息的叶结点所处的那一层

若n≥1,对任意一棵包含n个关键字、高度为h、阶数为m的B树:

每个结点中的关键字个数达到最多,则容纳同样多关键字的B树的高度达到最小,有h≥logm(n+1)

让每个结点中的关键字个数达到最少,则容纳同样多关键字的B树的高度达到最大,对于关键字个数为n的B树,叶结点即查找不成功的结点为n+1,有

n+12(m2)h1,hence,hlogm2(n+12)+1n+1\ge 2(\left \lceil \frac{m}{2} \right \rceil)^{h-1}, \\ hence,h\le log_{\left \lceil \frac{m}{2} \right \rceil}(\frac{n+1}{2})+1

  • 在B+树中,每个结点(非根内部结点)的关键字个数n的范围是[16]

m2nm\left \lceil \frac{m}{2} \right \rceil \le n\le m

(非叶根结点:2≤n≤m);

而在B树中,每个结点(非根内部结点)的关键字个数n的范围是

m21nm1\left \lceil \frac{m}{2} \right \rceil-1 \le n\le m-1

(非叶根结点:1≤n≤m-1)

第8章、排序

  • 最佳归并树添加长度为0的“虚段”[17]

设度为0的结点有n0个,度为k的结点有nk个,归并树的结点总数为n,有

n=nk+n0(总结点数=度为k的结点数+度为0的结点数)

n=knk+1(总结点数=所有结点的度数之和+1)

因此,对严格k叉树有n0=(k-1)nk+1,由此得nk=(n0-1)/(k-1)

若(n0-1)%(k-1)=0,则这n0个叶结点正好可以构造k叉归并树。此时内结点有nk

若(n0-1)%(k-1)=u≠0,则对于这n0个叶结点有u个多余,不能包含在k叉归并树中,此时需要再加上k-u-1个空归并段才可以建立归并树

操作系统

第2章、进程与线程

  • 管道文件是一个固定大小的缓冲区,在Linux中该缓冲区的大小为4KB[18]
  • 调度的目标[19]

CPU的利用率=CPU有效工作时间CPU有效工作时间+CPU空闲等待时间\text{CPU的利用率}=\frac{\text{CPU有效工作时间}}{\text{CPU有效工作时间+CPU空闲等待时间}}

周转时间=作业完成时间-作业提交时间

平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n

带权周转时间=作业周转时间作业实际运行时间\text{带权周转时间}=\frac{\text{作业周转时间}}{\text{作业实际运行时间}}

平均带权周转时间=(作业1的带权周转时间+…+作业n的带权周转时间)/n

响应比Rp=等待时间+要求服务时间要求服务时间\text{响应比}R_p=\frac{\text{等待时间+要求服务时间}}{\text{要求服务时间}}

  • 实现临界区互斥必须遵循的准则[20]

空闲让进、忙则等待、有限等待、让权等待

前V后P

实现互斥的P操作一定要在实现同步的P操作之后

为避免死锁,系统至少提供的资源量满足:A≥P×(M-1)+1

A:系统至少提供的资源量

P:进程数量

M:每个进程最大需求量

  • 银行家算法

Need=Max-Allocation

尝试将资源分配给P后修改下面的值:

Available=Available-Request

Allocation[i,j]=Allocation[i,j]+Request[i,j]

Need[i,j]=Need[i,j]-Request[i,j]

第4章、文件管理

一个m×n组成的位示图

假设找到值为“0”的二进制位揣位示图的第i行、第j列,其对应的盘块号b=n(i-1)+j

回收的盘块号转换为位示图的行号和列号:i=(b-1)DIV n+1、j=(b-1)MOD n+1

第5章、输入/输出管理

从设备将一块数据输入缓冲区的时间为T,操作系统将该缓冲区中的数据传送到工作区的时间为M,CPU对这一块数据进行处理的时间为C

单缓冲区中T可以和C并行,处理每块数据的平均时间为Max(C,T)+M

双缓冲区中C和M可以与T并行,处理每块数据的平均时间为Max(C+M,T)

磁盘存储器由磁盘控制器、磁盘驱动器和盘片组成

磁盘地址用“柱面号·盘面号·扇区号”表示

柱面(磁道)号 盘面(磁头)号 扇区号

寻道时间Ts:活动头磁盘在读/写信息前,将磁头移动到目的磁道所需的时间Ts=mn+s

每跨越一个磁道所需的时间为m,磁道数为n,启动磁头臂的时间为s

计算机组成原理中平均寻道时间取从最外道移动到最内道时间的一半,平均旋转延迟时间取旋转半周的时间

旋转延迟时间Tr:磁头定位到要读/写扇区所需的时间Tr=1/(2r)

磁盘旋转速度为r,找到目标扇区平均需要转半圈,所以为1/2

传输时间Tt:从磁盘读出或向磁盘写入数据所需的时间Tt=b/(rN)

每次所读/写的字节数为b,磁盘每秒转数为r,一个磁道上的字节数为N,b字节的数据需b/N个磁道

总平均存取时间Ta:Ta=Ts+1/(2r)+b/(rN)

计算机网络

第1章、计算机网络体系结构

  • 计算机网络性能指标[25]

    • 速率:b/s或bps、kb/s(k=103)、Mb/s(M=106)、Gb/s(G=109

    • 带宽(最高数据传输速率):b/s

    • 时延:发送时延、传播时延、处理时延、排队时延

      考试中通常不考虑处理时延和排队时延

      • 发送时延(传输时延):发送时延=分组长度/发送速率(带宽)

        传输时延是节点将分组推向网络所需的时间

      • 传播时延:传播时延=信道长度/电磁波在信道上的传播速率

        传播时延是一个比特从一个节点传播至另一节点所需的时间

      • 时延带宽积:时延带宽积=传播时延×信道带宽

        指发送端发送的第一个比特即将到达终点时,发送端已发出了多少比特,也称以比特为单位的链路长度

    • 往返时延(RTT):不包括发送方的发送时延

    • 信道利用率:信道利用率=有数据通过的时间/(有数据通过的时间+无数据通过的时间)

  • 传输m个分组所需时间t=2r+(m-1)r、链路带宽串行相加,并行取最小[26]

一条由多段链路组成的信道,其带宽(最大数据传输速率)取决于带宽最小的那段链路

  • 计算机网络分层结构

协议数据单元(PDU):各层PDU都分为服务数据单元和协议控制信息两部分

服务数据单元(SDU)

协议控制信息(PCI)

n-SDU+n-PCI=n-PDU=(n-1)-SDU

  • OSI参考模型[27]

物理层(比特Bit)

数据链路层(帧Frame):差错控制、流量控制

网络层(数据报Packet):路由选择、分组转发、拥塞控制、网际互联、差错控制、流量控制、连接建立与释放、可靠传输管理(TCP/IP的网络层没有后四个功能)

传输层(报文段Segment):差错控制、流量控制、连接建立与释放、可靠传输

数据链路层提供的是点到点通信,传输层提供的是端到端通信,两者不同

会话层

表示层:数据格式转换

应用层(报文Message)

网络接口层:功能类似于OSI参考模型的物理层和数据链路层

网际层:路由选择、分组转发、拥塞控制、网际互联

传输层:传输控制协议TCP——报文段Segment;用户数据报协议UDP——用户数据报

应用层

OSI模型在网络层支持无连接和面向连接的通信,但在传输层仅有面向连接的通信

TCP/IP参考模型在网际层仅有一种无连接的通信模式,但传输层支持无连接和面向连接两种模式

第2章、物理层

  • 码元:1T内出现K种信号,则

1码元=log2Kbit1\text{码元}=\left \lceil log_2K \right \rceil bit

  • 码元传输速率(波特率/调制速率):Baud波特[29]

若一个码元携带n比特的信息量,则波特率M Baud对应的比特率是Mn b/s

  • 奈奎斯特定理

理想低通(没有噪声、带宽有限)信道

极限码元传输速率为2W波特,其中W是信道的频率带宽(Hz),若用V表示每个码元的离散电平数量(码元的离散电平数量是指有多少种不同的码元),则极限数据传输速率为

理想低通信道的极限数据传输速率=2Wlog2V(单位为b/s)

  • 香农定理

带宽受限且有高斯噪声干扰的信道的极限数据传输速率

信道的极限数据传输速率=Wlog2(1+S/N)(单位为b/s)

W:信道的频率带宽(Hz)

S:信道内传输信号的平均功率

N:信道内的高斯噪声功率

S/N为信噪比

当采用分贝记法时,信噪比=10log10(S/N)(单位为dB)

若给出了码元与比特数之间的关系,则需受两个公式的共同限制

  • 数字数据编码[30]

非归零编码:低0高1中不变

归零编码:低0高1中归零

反向非归零编码:跳0不跳1看起点,中不变(遇0则变,中不变)

曼彻斯特编码:跳0反跳1看中间,中必变(上0下1)

差分曼彻斯特编码:跳0不跳1看起点,中必变(遇0不变,遇1翻转)

标准以太网使用曼彻斯特编码宽带高速网使用差分曼彻斯特编码

  • 正交幅度调制(QAM)[31]

设波特率为B,采用m个相位,每个相位有n种振幅,则QAM的数据传输速率R=Blog2(mn)

  • 中继器:仅支持半双工通信[32]

  • 集线器:物理上是星型拓扑,逻辑上是总线型拓扑

    集线器的N个端口对应N个网段,哥网段属于同一个“冲突域”

    集线器既不隔离广播域,又不隔离冲突域P211

    交换机不隔离广播域,但隔离冲突域

第3章、数据链路层

  • 海明码位数[33]

n为有限信息的位数,k为检验位的位数,则信息位n和检验位k应满足n+k≤2k-1

CRC检验码的位数等于生成多项式G(x)的最高次数

  • 滑动窗口机制[34]

    • 停止-等待协议(S-W):发送窗口WT=1,接收窗口WR=1

    • 后退N帧协议(GBN):发送窗口WT>1,接收窗口WR=1

    • 选择重传协议:发送窗口WT>1,接收窗口WR>1

      若采用n比特对帧编号,则后两种滑动窗口协议还需满足WT+WR≤2n

    • 多帧滑动窗口与选择重传协议(SR):WR≤WT;WT+WR≤2n

  • 信道利用率分析

    发送方发送分组的发送时延为TD(TD等于分组长度除以数据传输速率)

    接收方发送确认分组的发送时延为TA

    • 停止-等待协议(S-W):

      U=TDTD+RTT+TAU=\frac{T_D}{T_D+RTT+T_A}

    • 连续ARQ协议(采用流水线传输):

      nTD<TD+RTT+TA(在一个发送周期内可以发送完n个分组):

      U=nTDTD+RTT+TAU=\frac{nT_D}{T_D+RTT+T_A}

      nT≥TD+RTT+TA(在一个发送周期内发不完(或刚好发完)n个分组):U =1

信道平均(实际)数据传输速率=信道利用率×信道带宽(最大数据传输速率)

信道平均(实际)数据传输速率=发送周期内发送的数据量/发送周期

  • 码分多址(CDMA)[35]

向量S表示A站的码片向量,T表示B站的码片向量

不同站的码片序列相互正交,即向量S和T的规格化内积为0

ST1mi=1mSiTi=0S\cdot T\equiv \frac{1}{m}\sum_{i=1}^{m}S_iT_i=0

任何站的码片向量和该码片向量自身的规格化内积都是1

SS1mi=1mSi2=1mi=1m(±1)2=1S\cdot S\equiv \frac{1}{m}\sum_{i=1}^{m}S_i^2=\frac{1}{m}\sum_{i=1}^{m}(\pm 1)^2=1

任何站的码片向量和该码片反码的向量的规格化内积都是-1

SS1mi=1mSiSi=1mi=1mSi2=1S\cdot \overline{S}\equiv \frac{1}{m}\sum_{i=1}^{m}S_i\overline{S_i}=-\frac{1}{m}\sum_{i=1}^{m}S_i^2=-1

两个向量在公共信道上叠加,实际上是线性叠加

载波监听多路访问/冲突检测,适用于总线形网络或半双工网络

先听后发、边听边发、冲突停发、随机重发

最短帧长=最大单向传播时延×数据传输速率×2

以太网规定最短帧长为64B,最长帧长为1518B,帧间最小间隔为9.6μs

  • 截断二进制指数退避算法
  1. 确定基本退避时间2τ(争用期)
  2. 从离散的整数集合[0,1,…,(2k-1)]中随机取一个数记为r,重传所需推迟时间为2rτ,参数k=min[重传次数,10]
  3. 当重传达16次仍不成功时抛弃该帧并向高层报错
  • CSMA/CA协议

先听后发、忙则退避

802.11标准允许发送站对信道进行预约

源站在RTS帧中填写的所需占用信道的持续时间,是从收到RTS帧后到目的站最后发送完ACK帧为止的时间,即“SIFS+CTS+SIFS+数据帧+SIFS+ACK”

AP在CTS帧中填写的所需占用信道的持续时间,是从收到CTS帧后到目的站最后发送完ACK帧为止的时间,即“SIFS+数据帧+SIFS+ACK”

  • 局域网体系结构[38]

image

  • 以太网MAC帧[39]

首部和尾部为18B,662N4,收发协数验,N是46~1500

  • 802.11局域网的数据帧格式[40]

30 N 4首数验,首部3+1地址

九十比特表去来,帧的中转靠AP

去往AP中起止,来自AP止中起

地址1和地址2分别是无线通信中信道两端的接收地址发送地址

当主机发往AP时,接收地址不是实际的目的地址,因此用地址3来存放实际的目的地址

当AP发往主机时,发送地址不是实际的源地址,因此用地址3来存放实际的源地址

6642N4,收发V协数验

在干线链路上传送的帧是802.1Q帧

  • 设备隔离冲突域和广播域的总结[42]
设备 能否隔离冲突域 能否隔离广播域
集线器 不能 不能
中继器 不能 不能
交换机 不能
网桥 不能
路由器

第4章、网络层

  • IP数据报格式[43]

首部长度为20-60B,418,首总偏

(首部长度,总长度,片偏移)以4B为单位

IP首部前两个字节往往以0x45开头

以太网帧的最大传送单元(MTU)为1500B

许多广域网的MTU不超过576B

片偏移除了最后一个分片外,每个分片的长度一定是8B的整数倍(课后67题)

  • 特殊IP地址用途[44]
IP地址 是否可作为源地址 是否可作为目的地址
主机号全为0 × ×
主机号全为1 ×
127.x.x.x
0.0.0.0 ×
255.255.255.255 ×
网络号为0,主机号为Y
本网络中主机号为Y的主机
×
  • 最佳前缀匹配(最佳匹配):应当从匹配结果中选择具有最长网络前缀的路由

  • ARP工作在网络层、NAT路由器工作在传输层

  • DHCP是应用层协议,它基于UDP;RIP是应用层协议,使用UDP传送数据;OSPF是网络层协议,直接用IP数据报传送

  • MAC地址会随着数据发往不同的网络而改变,IP地址当且仅当数据在私有网络与外部网络传递时才会改变(课后64题)[45]

  • DHCP协议

image

  • DHCP服务器

image

  • IPv6将地址从IPv4的32位增大到128位,只有源主机才能分片,是端到端的,不允许类似IPv4在中间路由器进行分片[46]

第5章、传输层

  • UDP首部:8B[47]
  • UDP一次发送一个报文,既不合并,又不拆分
  • 计算检验和时,UDP数据报前添加12B的伪首部(IP数据报检验和只检验IP数据报的首部,UDP的检验和要将首部和数据部分一起检验),最高位产生了进位要回卷
  • TCP首部:20B-60B、数据偏移以×4B为单位
  • seq表示发送的报文段中数据部分的第一个字节在A的发送缓存区中的编号,ack表示A期望收到的下一个报文段的数据部分的第一个字节在B的发送缓存区中的编号
  • 只有握手①的ACK=0;握手①②的SYN=1,其他所有TCP的报文段都是0;挥手①③的FIN=1[48]
  • 握手①②不能携带数据;握手③如果不携带数据就不消耗序号;握手①②固定消耗一个序号
  • 挥手①③即使不携带数据也要消耗一个序号;挥手②可以携带数据;挥手④不可以携带数据
  • 发送窗口上限值=min[rwnd,cwnd][49]
  • ssthresh不能小于2
  • TCP连接建立和网络出现超时时,采用慢开始和拥塞避免算法(ssthresh=cwnd/2,cwnd=1)
  • 发送方收到3个冗余ACK时,采用快重传和快恢复算法(ssthresh=cwnd/2,cwnd=ssthresh)

第6章、应用层

  • DNS协议运行在UDP上,53号端口;根域名、顶级域名、二级域名

  • FTP协议运行在TCP上,21号控制端口,20号数据端口,做题默认采用主动模式PORT(S主动向C发起连接)(C连接到S的21号端口,要读取数据时C随机开放一个端口并告知S,S通过20号端口和C连接并发送数据)

  • SMTP用Push的通信方式,POP3用Pull的通信方式;SMTP协议运行在TCP上,25号端口,POP3协议运行在TCP上,110号端口

  • 假设请求n-1个文件,加上Web请求共n个请求

    非持久连接:2n×RTT;持久连接、非流水线:(n+1)×RTT;持久连接、流水线:1×RTT

    如果题目中出现MSS字样需考虑TCP中的拥塞控制

  • HTTP三种工作方式[50]

image

  • 计算机网络协议

image

计算机组成原理

第1章、计算机系统概述

  • MAR用于寻址,其位数反映最多可寻址的存储单元的个数,MAR的长度与PC的长度相等[51]
  • MDR的位数通常等于存储字长,一般为字节的2次幂的整数倍
  • MAR和MDR属于存储器,但是这两元件和Cache存在于CPU中
  • 运算器:累加器(ACC)、乘商寄存器(MQ)、操作数寄存器(X)、变址寄存器(IX)、基址寄存器(BR)等
  • 控制器:程序计数器(PC)、指令寄存器(IR)、控制单元(CU)
  • 编译运行过程:预处理→编译→汇编→链接→加载→执行
  • 机器语言是计算机唯一可以直接识别和运行的语言
  • 字长一般等于通用寄存器的位数或ALU的宽度[52]

  • MAR位数反映了存储单元的个数、MDR的位数反映了存储单元的字长

  • CPI(Cycle Per Instruction):执行一条指令所需的时钟周期数

  • IPS(Instructions Per Second):每秒执行多少条指令,IPS=主频/平均CPI

  • CPU执行时间:运行一个程序所花费的时间

    CPU执行时间=CPU时钟周期数/主频=(指令条数×CPI)÷主频

  • MIPS(Million Instructions Per Second):每秒执行多少百万条指令

    MIPS=指令条数÷(执行时间×106)=主频÷(CPI×106)

  • FLOPS(Floating-point Operations Per Second):每秒执行多少次浮点运算、MFLOPS(百万106)、GFLOPS(十亿109)、TFLOPS(万亿1012)、PFLOPS(千万亿1015)、EFLOPS(百京1018)、ZFLOPS(十万京1021

    1京=1亿亿(1016

  • 在CPU中,IR、MAR和MDR对各类程序员都是透明的[53]
  • 字、字长、机器字长、指令字长、存储字长的区别和联系

字长是指CPU内部用于整数运算的数据通路的宽度,因此字长等于CPU内部用于整数运算的运算器位数和通用寄存器宽度,它反映了计算机处理信息的能力。字和字长的概念不同。字用来表示被处理信息的单位,用来度量数据类型的宽度,如x86机器中将一个字定义为16位

指令字长:一个指令字中包含的二进制代码的位数

存储字长:一个存储单元存储的二进制代码的位数

它们都必须是1字节的整数倍

指令字长一般取存储字长的整数倍,若指令字长等于存储字长的2倍,则需要2个访存周期来取出一条指令;若指令字长等于存储字长,则取指令周期等于机器周期

早期的存储字长一般与指令字长、字长相等,因此访问一次主存储器便可取出一条指令或一个数据。随着计算机的发展,指令字长、字长都可变,但必须都是字节的整数倍

第2章、数据的表示和运算

  • 十进制转二进制[54]
    • 除基取余法:除基取余,先余为低,后余为高
    • 乘基取整法:乘基取整,先整为高,后整为低
  • 现代计算机中通常用补码整数表示整数,原码小数表示浮点数的尾数部分,移码表示浮点数的阶码部分
  • [x]=2n+1+x(-2n≤x≤2n,mod2n+1
  • 由[x]快速求[-x]方法:符号位、数值位全部取反,末尾加1
  • 模-a的绝对值=a的补数
  • 移码:补码基础上将符号位取反,移码
类型(字长为n+1) 整数范围 小数范围 备注
原码 [-(2n-1),2n-1] [-(1-2-n),1-2-n] 关于原点对称
补码 [-2n,2n-1] [-1,1-2-n] 比原码多表示-2n
反码 [-(2n-1),2n] [-(1-2-n),1-2-n]
移码 [-2n,2n-1] \ 整数表示范围与补码一致
n位无符号数 [0,2n-1] \

image

  • 若不指定signed/unsigned,默认为有符号整数,字符型(char,8位)是C语言中的一个特殊类型,默认按无符号整数解释,上述类型都是按补码形式存储的
  • 0拓展:原数字为无符号整数,拓展后的高位用0填充;符号拓展:原数字为有符号整数,拓展后的高位用原数字符号位填充[55]
  • 定点整数的不同类型转换(考虑机器数)[56]
  1. 长→短:去掉高位,保留低位
  2. 位数相同:保证机器数不变
  3. 短→长:根据短的类型判断:有符号数则符号拓展,高位补符号;无符号数则0拓展,高位补0

image

非>与>或

A+B=AB\overline{A+B}=\overline{A}\cdot\overline{B}

AB=A+B\overline{A\cdot B}=\overline{A}+\overline{B}

  • 带标志加法器[57]
标志名称 作用 01表示
溢出OF=CnCn1OF=C_n\oplus C_{n-1} 判断有符号数加减运算和无符号、有符号数的乘法运算是否溢出 0没有溢出
1溢出
符号SF=Fn-1 有符号数的加减运算的正负 0正1负
零ZF当且仅当F=0 结果是否为0 1零0非零
进位/借位CF=CoutCin=CnC0CF=C_{out}\oplus C_{in}=C_n\oplus C_0 无符号数加减运算是否溢出
Cin固定为0,当Cout为1,最高位产生进位
0没有溢出
1溢出
  • 逻辑移位:将操作数视为无符号整数,左移(×2,发生溢出)高位移出,低位补0;右移(×2-1,丢失精度)低位移出,高位补0
  • 算术移位:将操作数视为有符号整数,左移(左移前后符号位不同发生溢出)高位移出,低位补0;右移低位移出,高位补符号位
  • 无符号整数的乘法运算原理[58]

image

速度:阵列乘法器>由ALU、移位器、寄存器、控制逻辑组成的乘法电路(通常需要多个时钟周期)>移位、加/减运算等效实现乘法

  • 带符号整数的乘法运算原理

image

  • 无符号整数除法

image

无符号整数单精度除法不可能发生“商溢出”

  • 带符号整数(补码)除法

image

  • 十六进制求补操作[59]
  1. 从十六进制数最低位向左找到第一个非0的数字
  2. 该位右侧的0保持不变
  3. 对于找到的非0数字,该位结果为16减去该数字
  4. 该位左侧的所有为结果都为15减去这些位对应的数字
eg1.
00008009H↓
FFFF7FF7H
eg2.
123FF000H↓
EDC01000H
  • 计算机无符号数和有符号数一起参与运算时,计算机按无符号数来解释最终执行结果
  • 215=32768、216=65536
  • 复杂小数转换二进制:乘基取整法(从高到低,仅用于处理十进制真值的小数部分)[60]
十进制 乘基(基数为2) 取整
0.4375 0.4375×2=0.875 0
0.875 0.875×2=1.75 1
0.75 0.75×2=1.5 1
0.5 0.5×2=1.0 1
  • 浮点数的规格化(BV1qG41197E4:2-4-2——湖科大教书匠):N=rE×M

通过调整一个非规格化浮点数的尾数和阶码的大小,使非零浮点数在尾数的最高数位上保证是一个有效值

当浮点数的尾数的基数为2时,原码规格化数的尾数最高位一定是1;当浮点数的尾数的基数为4时,原码规格化数的尾数最高两位不全为0

基数r越大,可表示的浮点数范围越大,而且所表示的数个数越多,但浮点数的精度反而下降

  • IEEE754浮点数

image

image

  • 浮点数的加减运算[61]

    • 对阶:小阶码向大阶码看齐(尾数右移时保留至少3位参与尾数部分的运算)
    • 舍入:如果舍弃位刚好为100
      • 若尾数末位为0,直接截断多余位
      • 若尾数末位为1,截断多余位,末位加1
  • 溢出判断:由指数上溢来判断(111111111发生指数上溢;00000000发生指数下溢)

    1. 结果是否发生溢出
    2. 精度是否丢失
      • 整数和小数之间的转化
      • 浮点数运算对阶
      • 高精度往低精度转化

    范围:double>float>int

    精度:double(53)>int(31)>float(24)

  • 不同类型数的混合运算时,遵循类型提升的原则

  • 数据的大小端存储[62]

    • 大端方式:先存储高位字节,后存储低位字节。字节中的字节顺序和原序列的相同
    • 小端方式:先存储低位字节,后存储高位字节。字节中的字节顺序和原序列的相反

    针对的是某一个数据内部,它的存储不会影响各个数据之间的顺序

  • 数据按“边界对齐”方式存储

现代计算机都是按字节编址的,数据按边界对齐的方式存放要求其存储地址是自身大小的整数倍

第3章、存储系统

  • SDRAM刷新周期[63]

    一般取2ms,分为集中刷新(死区不能访问存储器)、分散刷新(没有死区,但加长了系统存取周期)、异步刷新(一个刷新周期内每一行仅刷新一次(刷新周期除以行数)),刷新对CPU透明,刷新时不需要选片(整个存储器中的所有芯片同时被刷新)

  • DRAM通常采用地址引脚复用技术

  • SRAM与DRAM的比较

特点 SRAM DRAM
存储信息 触发器 电容
破坏性读出
(读出后需要重写)
需要刷新 不要 需要
(由存储器独立完成,无需CPU)
送行列地址 同时送 分两次送(复用)
(地址线、引脚减半)
运行速度
集成度
存储成本
主要用途 高速缓存Cache、TLB 主机内存、页表
  • 多模块存储器——低位交叉编址[64]

    低位地址为模块号,高位地址为模块内地址,模块号=单元地址%m

    m个模块,k个单元,模块存取周期为T,总线传输周期为r

    为实现轮流启动方式,m≥T/r

    按每隔1/m个存取周期轮流启动各模块,则连续存取m个字所需的时间为t=T+(m-1)r

    • 主存-总线-Cache间的连接结构问题

      《计算机组成与系统结构》(第3版)袁春风著,第七章249页

      image

  • 字位同时扩展法:将进行位扩展的芯片作为一组,各组的连接方式与位扩展的相同,由系统地址线高位译码产生若干片选信号,分别接到各组芯片的片选控制线[65]

    线选法缺点:地址空间不连续

  • RAID1:镜像磁盘阵列、RAID2~5:带校验的磁盘阵列[66]
  • SSD(固态硬盘)数据是以为单位读/写、以为单位擦除
  • 局部性原理[67]

    • 时间局部性:如果某条指令或数据项当前被访问,则在不久的将来很可能再次被访问

      源于程序中存在循环、重复调用的子程序,以及对同一数据的多次操作

    • 空间局部性:如果某存储单元被访问,则其邻近的存储单元在不久的将来很可能也被访问

      指令通常顺序存放并顺序执行,而数据(如数组、向量)也往往以连续块的形式存储

  • Cache和主存的映射方式[68]

    为了识别每个Cache行对应哪个主存块,需要为每行设置一个标记位记录其主存块编号

    设置一位有效位指示该行数据是否有效

    • 直接映射:每一块只能装入Cache中的唯一指定位置

      块冲突概率最高,空间利用率最低

      Cache行号=主存块号mod Cache总行数,主存块号的低c位即为其对应的Cache行号

      • 地址结构:(设Cache共有2c行,主存共有2m块)

        ┌-------------┬---------------┬-------------┐
        │ tag标记(t位) | Cache行号(c位) │ 块内地址(b位) |
        └-------------┴---------------┴-------------┘
        m=t+c

        eg.Cache4块,每块大小4B,23号内存地址放到Cache哪个位置?
        23 / 4 = 5 ...... 3
        内存地址 块大小 内存块号 块内地址

        5 / 4 = 1 ...... 1
        内存块号 Cache行数 tag标记 行号

        内存块号
        ┌----┴----┐
        0001 01 11(23)
        tag标记 行号 块内地址
    • 全相联映射:每一块可以装入Cache中的任何位置

      标记的比较速度较慢,实现成本较高

      • 地址结构:

        ┌--------┬---------┐
        │ tag标记 | 块内地址 |
        └--------┴---------┘
    • 组相联映射:将Cache划分为Q个大小相等的组,每个主存块只能映射到固定组中的任意一行

      组间采用直接映射,组内采用全相联映射,设每组包含r个Cache行,则称为r路组相联映射

      Cache组号=主存块号mod Cache组数(Q)

      • 地址结构:

        ┌--------┬------┬--------┐
        │ tag标记 | 组号 │ 块内地址 |
        └--------┴------┴--------┘

        eg.每块大小4B,2路组相联,23号内存地址放到Cache哪个位置?
        23 / 4 = 5 ...... 3
        内存地址 块大小 内存块号 块内地址

        5 / 2 = 2 ...... 1
        内存块号 Cache组数 标记 Cache组号

        内存块号
        ┌----┴----┐
        00010 1 11(23)
        tag标记 组号 块内地址
  • Cache容量=(控制算法位+数据部分)×Cache总行数

    • 控制算法位:有效位+LRU替换位+脏位+tag标记位
      • 脏位:一直维护性位
    • 数据部分:Cache行的数据部分位数(数据部分的大小等于一个主存块的大小
    主存物理地址:
    ┌--------┬---------┐
    │ tag标记 | 块内地址 |
    └--------┴---------┘
    Cache行:
    ┌-------┬-------┬-----┬-------┬-------┐
    │ 有效位 | 替换位 │ 脏位 | tag位 | 数据位 |
    └-------┴-------┴-----┴-------┴-------┘

    image

  • 通常为每个Cache行都设置一个比较器比较器的位数等于标记字段的长度,其查找过程是一种“按内容访问”的存取方式,是一种“相联存储器”[69]

    • 直接映射只需要设置1个比较器
    • 全相联映射需要设置行数个比较器
    • r路组相联映射需要设置r个比较器
  • Cache一致性问题

    • 写操作命中

      • 全写法(直写法):必须把数据同时写入Cache和主存

        缺点:增加了访存次数,降低了Cache的效率

        在Cache和主存之间加一个写缓冲,CPU同时写数据到Cache和写缓冲中,写缓冲再将内容写入主存

        写缓冲可能饱和甚至溢出

      • 回写法:只把数据写入Cache,只有当此块被替换时才写回主存

        优点:减少了访存次数;缺点:可能数据不一致

        给每个Cache行设置一个修改位(脏位、一致性维护位)

    • 写操作不命中

      • 写分配法:更新主存单元,然后把这个主存块调入Cache
      • 非写分配法:只更新主存单元,而不把主存块调入Cache

    非写分配法通常与全写法合用,写分配法通常与回写法合用

  • 【2021统考真题】若计算机主存地址为32位,按字节编址,Cache数据区大小为32KB,主存块大小为32B,采用直接映射方式和回写(Write Back)策略,则Cache行的位数至少是()[70]

分析:

┌--------┬-----------┬--------┐
│ tag标记 | Cache行号 │ 块内地址 |
└--------┴-----------┴--------┘
17 10 5
┌-------┬-------┬-----┬-------┬-------┐
│ 有效位 | 替换位 │ 脏位 | tag位 | 数据位 |
└-------┴-------┴-----┴-------┴-------┘
1 无 1 17 256
一个主存块大小32B,为32×8=256位(数据部分)
主存地址一共32位,一个主存块32B,则块内地址为5位
Cache数据区大小32KB,一个Cache行数据32B,则共有32KB/32B=2^10行,则行号为10位
总的主存地址32位,则32-10-5=17位的tag位
  • TLB和Cache的访问过程

    image

  • 带TLB虚拟存储器的CPU访存过程

    image

  • 快表TLB通常采用全相联或组相联映射方式。TLB表项包含虚拟页号(作为标记)和对应的物理页号及控制位(如有效位、脏位等)。在全相联映射下,TLB标记即为完整的虚拟页号;在组相联映射下,虚拟页号的高位作为标记,低位作为组索引

  • TLB在CPU中

  • MMU地址转换过程:MMU会检查页表项的访问权限,以确保进程有权访问某个页面,否则就会访问越权。为了获得对应的页表项,先查找TLB,若找不到,则TLB缺失,然后查找页表,若找不到,则页面缺失

第4章、指令系统

  • 寻址方式、有效地址及访存次数[71]
寻址方式 有效地址 访存次数
立即寻址 A即是操作数 0
直接寻址 EA=A 1
一次间接寻址 EA=(A) 2
寄存器寻址 EA=Ri 0
寄存器间接一次寻址 EA=(Ri) 1
相对寻址 EA=(PC)+A 1
基址寻址 EA=(BR)+A 1
变址寻址 EA=(IX)+A 1
堆栈寻址 入栈/出栈时EA的确定方式不同 硬堆栈不放存,软堆栈访存1次
  • 立即寻址采用补码表示,#表示立即寻址特征
  • 相对寻址的A是相对于当前PC值的偏移量,且PC取值后进行了自增运算,应用于转移指令
  • 基址寻址的内容不变(作为基地址),形式地址可变(作为偏移量),应用于多道程序
  • 变址寄存器面向用户,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址),应用于循环程序和数组问题
  • 寄存器堆栈也称硬堆栈;从主存(内存)划出一段区域做堆栈称为软堆栈
  • AT&T格式指令和Intel格式指令对比[72]

image

  • 双操作数指令的两个操作数不能都是内存

  • push指令:1.将ESP值减4(栈增长方向与内存地址增长方向相反)2.将操作数压入ESP指示的地址

  • pop指令:1.将ESP指示的地址中的内容出栈2.ESP值加4

  • idiv指令:有符号整数除法指令,只有一个操作数,即除数,被除数则为edx:eax中的内容(共64位),操作数结果有两部分:商和余数(低商高余)商送到eax,余数送到edx

  • shl/shr:逻辑移位指令

  • call指令保存该指令的下一条指令的地址

  • 用条件转移指令实现循环

    image

  • 用loop指令实现循环

    image

  • 栈帧结构[73]

image

第5章、中央处理器

  • 运算器[74]

    算术逻辑单元(ALU)、暂存器、累加寄存器(ACC)、通用寄存器组(GPRs)、程序状态字(PSW)寄存器、移位寄存器、计数器(CT)等组成

  • 控制器

    程序计数器(PC)、指令寄存器(IR)、指令译码器(ID)、时序电路和微操作信号发生器等组成

  • 用户可见寄存器

    通用寄存器组(含基址/变址寄存器)、程序状态字寄存器(PSW)、程序计数器(PC)

  • 用户不可见寄存器

    存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、指令寄存器(IR)、暂存寄存器、累加寄存器、移位寄存器

若PC和主存储器均按字节编址,则PC的位数等于主存储器地址位数

IR位数等于指令字长

  • CPU可视为由数据通路控制部件两大部分组成,数据通路的基本构成元件可分为组合逻辑元件时序逻辑元件两大类[75]

    • 组合逻辑元件(操作元件)

      任意时刻的输出仅由当前输入决定,不依赖历史状态;内部不含记忆单元,不受时钟控制,且无输出到输入的反馈通路,因而具有确定性和即时响应性

      包括加法器、算术逻辑单元(ALU)、译码器、多路选择器(MUX)和三态门等

    • 时序逻辑元件

      输出不仅取决于当前输入,还依赖于电路的历史状态,因此其内部必然包含用于存储信息的记忆单元;这类元件必须在时钟的同步控制下工作

      包括各类寄存器和存储器,例如通用寄存器组、程序计数器(PC)、状态/暂存寄存器等

  • 微程序控制器[76]

    image

    程序>指令=微程序>微指令≥微命令=微操作(>包括;=对应)

  • 微指令的设计

    image

  • 微程序控制器与硬布线控制器的对比
对比项 微程序控制器 硬布线控制器
工作原理 微操作控制信号以微程序的形式存放
在控制存储器中,执行指令时读出即可
微操作控制信号由组合逻辑电路根据
当前的指令码、状态和时序即时产生
执行速度
规整性 较规整 繁琐、不规整
应用场合 CISC CPU RISC CPU
易扩充性 易扩充修改 扩充修改困难
IF ID EX MEM WB
load 计算地址 访存 写回
store 计算地址 访存

image

  • 异常和中断响应过程

image

  • 流水线的冒险与处理[78]

    流水线逻辑结构:取值(IF)、译码(ID)、执行(EX)、访存(MEM)、写回(WR)

    • 结构冒险(互斥)

      又称资源冲突,是指不同指令在同一时刻争用同一功能部件所引发的冲突,其本质是硬件资源的物理限制

      • 解决办法
        • 前一指令访存时使后一条指令及其后续指令暂停一个时钟周期
        • 设置多个独立的部件
    • 数据冒险(同步)

      又称数据相关,根本原因是后面指令用到前面指令的结果时,前面指令的结果还未产生或写回

      • 解决办法

        • 延迟执行相关指令

          软件插入空操作“nop”指令和硬件阻塞(stall)

          若寄存器堆支持在一个时钟周期的前半个时钟周期写入、后半个时钟周期读出,则add指令在WB段写入的值可在同一个时钟周期被sub指令在ID段读取。此时,add指令的WB段与sub指令的ID段可重叠执行,从而仅需延迟2个时钟周期

        • 采用旁路转发技术

          将数据通路中生成的中间数据直接转发到ALU输入端

        • load-use数据冒险的处理

          若load指令与其后紧邻的运算类指令存在数据相关,则无法通过转发技术解决

          load r2,12(r1)        # M[(r1)+12]→(r2)
          add r4,r3,r2 # (r3)+(r2)→(r4)

          最简单的做法是由编译器在add指令前插入一条nop指令

    • 控制冒险

      遇到转移、返回、中断或异常等事件时,程序计数器(PC)的值会被修改,导致流水线断流

      PC在MEM段修改,减少在控制冒险时阻塞的时间

      • 解决办法
        • 延迟分支处理:对于由分支指令引起的冲突,可由软件在分支指令后插入若干nop指令,或由硬件自动阻塞(插入气泡)。插入nop指令的数量等于分支延迟周期数
        • 对转移指令进行分支预测,尽早生成转移目标地址
  • 流水线性能指标

    • 吞吐率

      TP=nTkTP=\frac{n}{T_k}

      n是任务数,Tk是处理完n个任务所用的总时间

      设流水线共有k段,时钟周期为△t,理想条件下(任务连续输入、无阻塞)完成n个任务所需时间Tk=(k+n−1)△t,此时吞吐率

      TP=n(k+n1)ΔtTP=\frac{n}{(k+n-1)\Delta t}

    • 加速比

      完成同一批任务不用流水线和用流水线所用时间之比

      S=T0TkS=\frac{T_0}{T_k}

      T0表示不使用流水线的总时间,Tk表示使用流水线的总时间。一条k段流水线完成n个任务所需时间Tk=(k+n−1)△t;顺序执行n个任务所需总时间T0=kn△t,则

      S=knΔt(k+n1)Δt=knk+n1S=\frac{kn\Delta t}{(k+n-1)\Delta t}=\frac{kn}{k+n-1}

  • 超标量流水线技术不能调整指令的执行顺序,每个时钟周期内可并发多条独立指令

第6章、总线

  • 数据总线双向传输,位数反映一次能传送的数据的位数[79]
  • 地址总线单向传输,地址信息只能由CPU发送至内存或外设,位数反映最大的寻址空间
  • 控制信息和状态信息单向传输,控制信息通过控制总线由CPU发送至内存或外设,状态信息通过状态总线由内存或外设发送至CPU
  • 总线带宽=总线宽度×总线时钟频率×每个时钟周期传送数据的次数

第7章、输入/输出系统

  • I/O接口中的数据线传送的是读/写数据、状态信息、控制信息和中断类型号;地址线传送的是要访问I/O接口中的寄存器的地址;控制线传送的是读/写控制信号[80]
  • 中断优先级包括响应优先级处理优先级。响应优先级由硬件线路或查询程序的查询顺序确定,不可动态改变;处理优先级由中断屏蔽字确定,可灵活改变
  • 在单级(或单重)中断系统中不允许中断嵌套。中断处理过程为:①关中断;②保存断点;③识别中断源;④保存现场;⑤中断事件处理;⑥恢复现场;⑦开中断;⑧中断返回。其中①~③由硬件完成,④~⑧由中断服务程序完成
  • DMA的传送过程:①预处理:CPU完成一些必要的准备工作,由DMA控制器向CPU发总线请求。②数据传送:DMA控制器接管总线后,在设备接口和主存之间进行数据传送,此阶段由DMA控制器控制。③后处理:传送结束后,DMA控制器向CPU发送中断信号,做结束处理
  • 中断响应在一个指令周期结束后;而DMA响应是在一个总线周期后

  1. P6 ↩︎

  2. P63 ↩︎

  3. P77 ↩︎

  4. P101 ↩︎

  5. P102 ↩︎

  6. P126 ↩︎

  7. P130 ↩︎

  8. P133 ↩︎

  9. P159 ↩︎

  10. P184 ↩︎

  11. P207 ↩︎

  12. P240 ↩︎

  13. P290 ↩︎

  14. P291 ↩︎

  15. P311 ↩︎

  16. P314 ↩︎

  17. P391 ↩︎

  18. P43 ↩︎

  19. P69 ↩︎

  20. P99、107 ↩︎

  21. P152 ↩︎

  22. P298 ↩︎

  23. P320 ↩︎

  24. P340 ↩︎

  25. P6 ↩︎

  26. P9 ↩︎

  27. P16 ↩︎

  28. P19 ↩︎

  29. P31 ↩︎

  30. P33 ↩︎

  31. P35 ↩︎

  32. P46 ↩︎

  33. P59 ↩︎

  34. P63 ↩︎

  35. P80 ↩︎

  36. P84 ↩︎

  37. P86 ↩︎

  38. P99 ↩︎

  39. P102 ↩︎

  40. P105 ↩︎

  41. P105 ↩︎

  42. P125 ↩︎

  43. P137 ↩︎

  44. P139 ↩︎

  45. P147-P150 ↩︎

  46. P179 ↩︎

  47. P226 ↩︎

  48. P234 ↩︎

  49. P240 ↩︎

  50. P288 ↩︎

  51. P4 ↩︎

  52. P12 ↩︎

  53. P24 ↩︎

  54. P27 ↩︎

  55. P32 ↩︎

  56. P33 ↩︎

  57. P40 ↩︎

  58. P45 ↩︎

  59. P47 ↩︎

  60. P56 ↩︎

  61. P60 ↩︎

  62. P62 ↩︎

  63. P86 ↩︎

  64. P90 ↩︎

  65. P103 ↩︎

  66. P111 ↩︎

  67. P115 ↩︎

  68. P118 ↩︎

  69. P120 ↩︎

  70. P128 ↩︎

  71. P169 ↩︎

  72. P184 ↩︎

  73. P192 ↩︎

  74. P207 ↩︎

  75. P219 ↩︎

  76. P236 ↩︎

  77. P249 ↩︎

  78. P256 ↩︎

  79. P282 ↩︎

  80. P302 ↩︎

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务