title: PAT
date: 2020-01-06 07:26:48
tags:
1。掌握数据结构的基本概念、基本原理和基本方法。
2。掌握数据的逻辑结构、存储结构及基本操作的实现,能够对算法进行基本的时间复
杂度与空间复杂度的分析。
3。能够运用数据结构基本原理和方法进行问题的分析与求解,具备采用 C 或 C++语言
设计与实现算法的能力。
(一)线性表的定义和基本操作
(二)线性表的实现
1。顺序存储
2。链式存储
3。线性表的应用
(一)栈和队列的基本概念
(二)栈和队列的顺序存储结构
(三)栈和队列的链式存储结构
(四)栈和队列的应用
(五)特殊矩阵的压缩存储
(一)树的基本概念
(二)二叉树
1。二叉树的定义及其主要特征
2。二叉树的顺序存储结构和链式存储结构
3。二叉树的遍历
4。线索二叉树的基本概念和构造
(三)树、森林
1。树的存储结构
2。森林与二叉树的转换
3。树和森林的遍历
(四)树与二叉树的应用
1。二叉排序树
2。平衡二叉树
3。哈夫曼(Huffman)树和哈夫曼编码
(一)图的基本概念
(二)图的存储及基本操作
1。邻接矩阵法
2。邻接表法
3。邻接多重表、十字链表
(三)图的遍历
1。深度优先搜索
2。广度优先搜索
(四)图的基本应用
1。最小(代价)生成树
2。最短路径
3。拓扑排序
4。关键路径
(一)查找的基本概念
(二)顺序查找法
(三)分块查找法
(四)折半查找法
(五)B 树及其基本操作、B+树的基本概念
(六)散列(Hash)表
(七)字符串模式匹配
(八)查找算法的分析及应用
(一)排序的基本概念
(二)插入排序
1。直接插入排序
2。折半插入排序
(三)气泡排序(bubble sort)
(四)简单选择排序
(五)希尔排序(shell sort)
(六)快速排序
(七)堆排序
(八)二路归并排序(merge sort)
(九)基数排序
(十)外部排序
(十一)各种内部排序算法的比较
(十二)排序算法的应用
graph LR
A(绪论) --- B(数据结构)
B --- B1(逻辑结构)
B --- B2("存储结构(物理结构)")
B --- B3(数据的运算)
B1 --- B11("线性结构: 线性表, 栈, 队列")
B1 --- B12("非线性结构: 树, 图, 集合")
A --- C(五个特征)
C --- C1(算法定义)
C --- C2("五个特性: 有穷, 确定, 可行, 输出, 输出")
C --- C3(效率的度量)
C3 --- C11(时间复杂度)
C3 --- C12(空间复杂度)
数据, 数据元素, 数据对象, 数据类型, 抽象数据类型, 数据结构
抽象数据类型(ADT): 指一个数据模型及定义在该模型上的一组操作; 其定义仅取决于它的一组逻辑特性; 常用(数据对象, 数据关系, 基本操作集)表示
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。包含三方面内容(逻辑结构, 存储结构和数据运算)
数据的逻辑结构
graph LR
A(数据的逻辑结构) --- B(线性结构)
B --- B1(一般线性表)
B --- B2(受限线性表)
B2 --- B21(栈和队列)
B2 --- B22(串)
B --- B3(线性表推广)
B3 --- B31(数组)
B3 --- B32(广义表)
A --- C(非线性结构)
C --- C1(集合)
C --- C2(树形结构)
C2 --- C21(一般树)
C2 --- C22(二叉树)
C --- C3(图状结构)
C3 --- C31(有向图)
C3 --- C32(无向图)
存储结构
时间复杂度
算法中所有语句的频度之和记为 T(n), 时间复杂度主要分析 T(n)的数量级。
常用算法中基本运算的频度 f(n)来分析算法的时间复杂度. 记为 T(n) = O(f(n))
常见的渐近时间复杂度为:O(1) < O($log{2}n$) < O(n) < O($nlog{2}n$) < O($n^2$) < O($n^3$) < O($2^n$) < O($n!$) < O($n^n$)
空间复杂度
graph LR
A(线性表) --- B(顺序存储)
B --- B1(顺序表)
A(线性表) --- C(链式存储)
C --- C1(单链表)
C1 --- C5(指针实现)
C --- C2(双链表)
C2 --- C5
C --- C3(循环链表)
C3 --- C5(指针实现)
C --- C4("静态链表(借助数组实现)")
定义
#define InitSize 100
typedef struct {
ElemType *data;
int MaxSize, length;
}
链表,无论单链表,双链表还是循环链表,一定要保证不断链。
定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList
```
不管带不带头结点,头指针始终指向链表的第一个结点
头结点是带头结点的链表中的第一个结点,结点内通常不存储信息。(加入头结点,空表和非空表的处理得到统一)
O(n)
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
} DNode, *DLinklist;
借助数组来描述线性表的链式存储结构,这里的指针是结点的相对地址(数组下标),又称游标。
基于存储考虑
难以估计线性表的长度或存储规模时,不宜采用顺序表;链表不用事先估计存储规模,但链表的存储密度较低,显然链式存储结构的存储密度是小于1的。
基于运算考虑
基于环境的考虑
graph LR
A(线性表)-- 操作受限 ---B1(栈)
B1 --- B11(顺序栈)
B1 --- B12(链栈)
B1 --- B13(共享栈)
A(线性表)-- 操作受限 ---B2(队列)
B2 --- B21(循环队列)
B2 --- B22(链式队列)
B2 --- B23(双端队列)
A-- 推广 ---C(数组)
C --- C1(一维数组)
C --- C2("多维数组: 压缩存储, 稀疏矩阵")
栈(Stack) 只允许在一端进行插入或删除操作的线性表。
顺序栈
#define MaxSize 50
typedef struct{
Elemtype data[MaxSize];
int top;
} SqStack;
共享栈
两个顺序栈共享一个一维数组空间
- top0=-1时,0号栈为空, top1=MaxSize时1号栈为空
- 栈满,仅当两个栈顶指针相邻(top1 - top0)=1 时,判断为栈满。
链栈
typedef struct Linknode{
ElemType data;
struct Linknode *next;
} *LiStack;
队列(Queue) 只允许在表的一端进行插入,而在表的另一端进行删除
#define MaxSize 50
typedef struct{
ElemType data[MaxSize];
int front, rear;
} SqQueue;
存在 假溢出 的现象
初始时: Q.font=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.size==0
队满条件: Q.size==MaxSize
队满队空都有Q.front==Q.rear
类型中增设tag数据成员,以区分是队满还是队空。
typedef struct{
ElemType data;
struct LinkNode *next;
} LinkNode;
typedef struct{
LinkNode *front, *rear;
} LinkQueue;
输出受限的双端队列,输入受限的双端队列
即最小空间存储矩阵,矩阵在计算机图形学,工程计算中占有举足轻重的地位。数据结构考虑的是如何用最小的内存空间来存储同样一组数据,并能方便地提取矩阵中的元素。
数组一旦被定义,其维数和维界就不再改变。
在考研真题中,链式栈出现的概率要比顺序栈低得多。
graph LR
A(树形结构) --- B(二叉树)
B --- B1("概念: 定义, 存储结构")
B --- B2("操作")
B --- B3("应用")
B2 --- B21("三种遍历")
B2 --- B22("线索二叉树")
B3 --- B31("排序二叉树 ---- 平衡二叉树")
B3 --- B32(哈夫曼树)
A(树形结构) --- C(树和森林)
C --- C1("概念: 定义, 存储结构")
C --- C2(操作)
C2 --- C21(与二叉树的转换)
C2 --- C22(遍历)
C --- C3("应用: 并查集")
树具有如下最基本的性质:
树结点与度之间的关系有:
几个特殊的二叉树
二叉树的性质
顺序存储结构
链式存储结构
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
按照某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。
common
由遍历序列构造二叉树, 先中,后中,层中
常见有: 先序(PreOrder)、中序(InOrder) 和后序(PostOrder)。
递归算法和非递归算法的转换
借助栈
void InOrder2(BiTree T){
InitStack(S);
BiTree p=T;
while(p||!IsEmpty(s)) {
if(p) {
Push(S, p);
p = p->lchild;
} else {
Pop(S, p);
visit(p);
p = p->rchild;
}
}
}
层次遍历
借助队列
void LevelOrder(BiTree T) {
InitQueue(Q);
BiTree p;
EnQueue(Q,T);
while(!IsEmpty(Q)) {
DeQueue(Q,p);
visit(p);
if (p->lchild != NULL)
EnQueue(Q, p->lchild);
if (p->rchild != NULL)
EnQueue(Q, p->rchild);
}
}
线索,指向前驱或后继的指针。
typedef struct ThreadNode {
ElemType data;
struct ThreadNode *lchild, *rchild; // 左右孩子指针
int ltag, rtag;
} ThreadNode, *ThreadTree;
线索二叉树的构造
void InThread(ThreadTree &p, ThreadTree &pre) {
// 中序遍历对二叉树线索化的递归算法
if (p != NULL) {
InThread(p->lchild, pre);
if (p->lchild == NULL) {
p->lchild = pre;
p->ltag = 1;
}
if (pre != NULL && pre->rchild==NULL) {
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
InThread(p->rchild, pre);
}
}
void CreateInThread(ThreadTree T) {
ThreadTree pre=NULL;
if (T != NULL) {
InThread(T, pre);
pre->rchild=NULL;
pre->rtag=1;
}
}
存储结构
双亲表示法
#define MAX_TREE_SIZE 100
typedef struct {
ElemType data;
int parent;
} PTNode;
typedef struct {
PTNode nodes[MAX_TREE_SIZE];
int n;
}PTree;
孩子表示法
孩子兄弟表示法, 又称二叉树表示法
typedef struct CSNode {
ElemType data;
struct CSNode *firstchild, *nextsibling;
} CSNode, *CSTree
树,森林和二叉树的转换
树和森林的遍历
树的应用 —— 并查集
二叉排序树 (BST)
二叉排序树的非递归查找
BSTNode *BST_Search(BiTree T, ElemType key, BSTNode *&p) {
p=NULL;
while (T!=NULL && key!=T->data) {
p=T;
if (key < T->data) T=T->lchild;
else T=T->rchild;
}
return T;
}
二叉排序树的插入
int BST_Insert(BiTree &T, KeyType k){
if (T == NULL) {
T = (BiTree)malloc(sizeof(BSTNode));
T->key=k;
T->lchild=T->rchild=NULL;
return 1;
} else if (k == T->key){
return 0;
} else if (k < T->key)
return BST_Insert(T->lchild, k);
}
二叉排序树的构造
void Create_BST(BiTree &T, KeyType str[], int n) {
T=NULL;
int i=0;
while(i<n){
BST_Insert(T,str[i]);
i++;
}
}
平衡二叉树
任意结点的左右子树高度差的绝对值不超过1,将这样的二叉树成为平衡二叉树,简称平衡树(AVL)。定义高度差为平衡因子,可能取值为-1,0,1。
调整规律
平衡二叉树的查找
含有 n 个结点的平衡二叉树的最大深度为O($log_2{n}$),因此平衡二叉树的平均查找长度为$O(log_2{n})$。
哈夫曼树和哈夫曼编码
common
从树的根结点到任意结点的路径长度 (经过的边数)与该结点上权值的乘积,称为该结点的带权路径长度。
树种所有叶节点的带权路径长度之和称为该树的带权路径长度,记为$WPL=\sum{i=1}^{n}w{i}l_{i}$。
$w_i是第i个叶节点所带的权值,l_i是该叶节点到根结点的路径长度$
在含有n个带权叶子结点的二叉树中,其中带权路径长度(WPL) 最小的二叉树称为哈夫曼树,也称最优二叉树。
哈夫曼树的构造
哈夫曼编码
图$G$由顶点集$V$和边集$E$组成,记为$G=(V,E)$。有向图$
graph LR
A(图) --- B(图的定义)
A(图) --- C(图结构的存储)
C --- C1("邻接矩阵法, 邻接表法")
C --- C2("邻接多重表法, 十字链表")
A(图) --- D(图的遍历)
D --- D1(深度优先遍历)
D --- D2(广度优先遍历)
A(图) --- E(图的相关应用)
E --- E1("最小生成树: Prim算法, Kruskal算法")
E --- E2("最短路径: Dijkstr算法, Floyd算法")
E --- E3("拓扑排序: AOV网")
E --- E4("关键路径: AOE网")
有向图,无向图,简单图,多重图,完全图(简单完全图),子图,
连通,连通图和连通分量
强连通图、强连通分量
生成树、生成森林
连通图的生成树包含图中全部顶点的一个极小连通子图,若顶点数为 $n$,则它的生成树含有 $n-1$ 条边。
在非连通图中,连通分量的生成树构成了非连通图的生成森林。
[顶点的度、入度和出度]
边的权和网、[稠密图、稀疏图]、[路径、路径长度和回路]、[简单路径、简单回路]、距离、有向树
临接矩阵法,指用一个一维数组存储图中顶点信息,用一个二维数组存储图中边的信息(即各顶点之间的临接关系),存储顶点之间临接关系的二维数组称为邻接矩阵。
#define MaxVertexNum 100 // 图顶点数目的最大值
typedef char VertexType; // 顶点的数据类型
typedef int EdgeType; // 带权图中边上权值的数据类型
typedef struct {
VertexType Vex[MaxVertexNum]; // 顶点表
EdgeType Edge[MaxVertexNum][MaxVertexNum]; // 邻接矩阵,边表
int vexnum, arcnum; // 图的当前顶点数和弧数
} MGraph;
邻接表法,是对图$G$中的每个顶点$v_i$建立一个单链表,这个单链表称为边表。边表的头指针和顶点的数据信息采用顺序存储(称为顶点表)。
#define MaxVertexNum 100 // 图中顶点数目的最大值
typedef struct ArcNode { // 边表结点
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *next; // 指向下一条弧的指针
// InfoType info; // 网的边权值
}ArcNode;
typedef struct VNode { // 顶点表结点
VertexType data; // 顶点信息
ArcNode *first; // 指向第一条依附该顶点的弧的指针
}VNode, AdjList[MaxVertexNum];
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 图的顶点数和弧数
} ALGraph; // ALGraph是以邻接表存储的图类型
十字链表,是有向图的一种链式存储结构
#define MaxVertexNum 100 // 图中顶点数目的最大值
typedef struct ArcNode { // 边表结点
int tailvex, headvex; // 该弧的头尾结点
struct AcrNode *hlink, *tlink; // 分别指向弧头相同和弧尾相同的结点
// InfoType info; // 相关信息指针
} ArcNode;
typedef struct VNode { // 顶点表结点
VertexType data; // 顶点信息
ArcNode *firstin, *firstout; // 指向第一条入弧和出弧
} VNode;
typedef struct {
VNode xlist[MaxVertexNum]; // 邻接表
int vexnum, arcnum; // 图的顶点数和弧数
} GLGraph; // GLGraph 是以十字邻接存储的图类型
邻接多重表,是无向图的另一种链式存储结构。
#define MaxVertexNum 100 // 图中顶点数目的最大值
typedef struct ArcNode { // 边结点
bool mark; // 访问标记
int ivex, jvex; // 分别指向该弧的两个结点
struct ArcNode *ilink, *jlink; // 分别指向两个顶点的下一条边
// InfoType info; // 相关信息指针
} ArcNode;
typedef struct VNode {
VertexType data; // 顶点表结点
ArcNode *firstedge;
} VNode;
typedef struct {
VNode adjmulist[MaxVertexNum];
int vexnum, arcnum;
} AMLGraph;
图的基本操作
对于同样一个图,基于邻接矩阵存储的遍历所得到的DFS序列和BFS序列是唯一的,基于邻接表的遍历所得到的DFS和BFS序列是不唯一的。
广度优先搜索,(Breadth-First-Search, BFS)
info
广度优先所有算法的伪代码如下:
bool visited[MAX_VERTEX_NUM];
void BFSTraverse(Graph G) {
// 对图G进行广度优先遍历,设访问函数为visit()
for (i=0; i<G.vexnum; ++i)
visited[i] = false; // 访问标记数组初始化
InitQueue(Q); // 初始化辅助队列Q
for (i=0; i<G.vexnum; ++i) // 从 0 号顶点开始遍历
if (!visited[i]) // 对每个连通分量调用一次BFS
BFS(G, i); // Vi未访问过,从Vi开始BFS
}
void BFS(Graph G, int v) {
visit(v); // 访问初始顶点v
visited[v] = true; // 对v做已访问标记
Enqueue(Q, v); // 顶点 v 入队列
while(!isEmpty(Q)) {
DeQueue(Q, v); // 顶点 v 出队列
for (w=FirstNeighbor(G, v); w>=0; w=NextNeighbor(G, v, w)
// 检测 v 所有邻接点
if (!visited[w]) { // w 为 v 的尚未访问的邻接顶点
visit(w); // 访问顶点 w
visited[w] = true; // 对w做已访问标记
EnQueue(Q, w);
} //if
} // while
}
BFS算法求解单源最短路径问题(最少边数,非带权)
void BFS_MIN_Distance(Graph G, int u) {
//d[i]表示从 u 到 i 结点的最短路径
for (i=0; i<G.vexnum; ++i)
d[i] = ∞; // 初始化路径长度
visited[u] = true; d[u] = 0;
EnQueue(Q, u);
while(!isEmpty(Q)) { // BFS算法主过程
DeQueue(Q, u); // 队头元素出队
for (w=FirstNeighbor(G, u); w>=0; w=NextNeighbor(G, u, w))
if (!visited[w]) { // w为u的尚未访问的邻接顶点
visited[w] = true; // 设已访问标记
d[w] = d[u] + 1; // 路径长度加1
EnQueue(Q, w); // 顶点w入队
} // if
} //while
}
深度优先搜索 (Depth-First-Search, DFS)
info
算法过程如下
bool visited[MAX_VERTEX_NUM]; // 访问标记数组
void DFSTraverse(Graph G) {
// 对图G进行深度优先遍历,访问函数为visit()
for (v=0; v<G.vexnum; ++v)
visited[v] = false;
for (v=0; v<G.vexnum; ++v)
if (!visited[v])
DFS(G, V);
}
void DFS(Graph G, int v) {
// 从顶点 v 出发, 采用递归思想,深度优先遍历图G
visit(v); // 访问顶点
visited[v] = true; // 设已访问标记
for (w=FirstNeighbor(G, v); w>=0; w=NextNeighbor(G, v, w))
if (!visited[w]) { // w 为 u 的尚未访问的邻接顶点
DFS(G, w);
// if
}
}
本节是历年考查重点。图的应用主要包括: 最小生成(代价)树,最短路径,拓扑排序和关键路径。一般,直接以算法设计题形式考查的可能性很小,而更多的是结合图的实例来考查算法的具体执行过程,读者必须学会手工模拟给定图的各个算法的执行过程。此外,还需掌握对给定模型建立相应的图去解决问题的方法。
最小生成树
最短路径,带权路径长度最短的那条路径称为最短路径。
拓扑排序
Info
算法实现
bool TopologicalSort(Graph G) {
// 若G存在拓扑序列,返回true; 否则返回false,这时 G 中存在环
InitStack(S); // 初始化栈,存储入度为0的顶点
for (int i=0; i<G.vexnum; i++)
if (indegree[i]==0)
Push(S, i); // 将所有入度为 0 的顶点进栈
int count = 0; // 计数,记录当前已经输出的顶点数
while(!IsEmpty(S)) { // 栈不空,则存在入度为 0 的顶点
Pop(S, i); // 栈顶元素出栈
print[count++]=i; // 输出顶点 i.
for (p=G.vertices[i].firstarc; p ; p=p->nextarc) {
// 将所有 i 指向的顶点的入度间1,并且将入度减为0的顶点压入栈 S
v = p->adjvex;
if (!(--indegree[v]))
Push(S, v); // 入度为0, 则入栈
} // for
} // while
if (count<G.vexnum)
return false; // 排序失败,有向图中有回路
else
return true; // 拓扑排序成功
}
关键路径
Info
寻找关键活动时所用到的几个参量的定义。
事件$v_k$的最早发生事件$v_e(k)$
$v_e(源点)=0$
$v_e(k)=Max{v_e(j)+Weight(v_j, v_k)}, Weight(v_j, v_k)表示
事件$v_j$的最迟发生事件$v_l(j)$
$v_l(汇点)=v_e(汇点)$
$v_l(j)=Min{v_l(k)-Weight(v_j, v_k)}, Weight(v_j, v_k)表示
活动$a_i$的最早开始事件$e(i)$
该时间是指该活动的起点所表示的事件最早发生的时间。
若边$
活动$a_i$的最迟开始事件$l(i)$
该时间是指该活动的终点所表示的事件最迟发生时间与该活动所需时间之差。
若边$
一个活动$a_i$的最迟开始时间$l(i)$和其最早开始时间$e(i)$的差额$d(i)=l(i)-e(i)$
它是指该活动的时间余量,即活动$a_i$可拖延的时间。
称$l(i)-e(i)=0$即$l(i)=e(i)$的活动$a_i$是关键活动。
本章是考研命题的终点
graph LR
A(查找) --- B("基本概念: 静态查找, 动态查找")
A --- C(线性结构)
C --- C1(顺序查找)
C --- C2(折半查找)
C --- C3(分块查找)
A --- D(树形结构)
D --- D1(二叉排序树)
D --- D2(二叉平衡树)
D --- D3(B树, B+树)
A --- E("散列结构 ---- 散列表")
E --- E1(性能分析)
E --- E2(冲突处理)
A --- F("效率指标 --- 平均查找长度")
F --- F1(查找成功)
F --- F2(查找失败)
又称线性查找,主要用于在线性表中进行查找。
一般线性表的顺序查找
typedef struct {
ElemType *elem; // 元素存储空间基址,建表时按实际长度分配,0号单元留空
Int TableLen;
}SSTable;
int Search_Seq(SSTable ST, ElemType key) {
ST.elem[0] = key;
for (i=ST.TableLen;ST.elem[i]!=key;--i);
return i;
}
有序表的顺序查找
又称二分查找,仅适用于有序的顺序表。
算法
int Binary_Search(SeqList L, ElemType key) {
int low=0, high=L.Tablelen-1, mid;
while (low<=high) {
mid=(low+high)/2;
if (L.elem[mid] == key)
return mid;
else if (L.elem[mid] > key)
high=mid-1;
else
low=mid+1;
}
return -1;
}
又称索引顺序查找,结合顺序查找和折半查找各自的优点,既有动态结构,又适于快速查找。
块内无序,块间有序
graph LR
A(排序) --- B(基本概念)
B --- B1(稳定性)
B --- B2("衡量标准: 时,空复杂度")
A --- C(内部排序)
C --- C1(插入排序)
C1 --- C11(直接插入排序)
C1 --- C12(折半插入排序)
C1 --- C13(希尔排序)
C --- C2(交换排序)
C2 --- C21(冒泡排序)
C2 --- C22(快速排序)
C --- C3(选择排序)
C3 --- C31(简单选择排序)
C3 --- C32(堆排序)
C --- C4(归并排序)
C --- C5(基数排序)
A --- D("外部排序----多路归并排序")
直接插入排序
void InsertSort(ElemType A[], int n) {
int i,j;
for (i=2; i<=n; i++) { // 依次将A[2] ~ A[n]插入到前面已排序序列
if (A[i].key < A[i-1].key)
A[0]=A[i];
for (j=i-1; A[0].key < A[j].key; --j)
A[j+1]=A[j]; // 向后挪位
A[j+1]=A[0];
}
}
折半插入排序
void InsertSort(ElemType A[], int n) {
int i,j,low,high,mid;
for (i=2; i<=n; i++) { // 依次将A[2] ~ A[n]插入到前面已排序序列
A[0]=A[i];
low=1; high=i-1;
while (low <= high) {
mid=(low+high)/2;
if (A[mid].key > A[0].key) high=mid-1;
else low=mid+1;
}
for (j=i-1; j>=high+1; --j)
A[j+1]=A[j];
A[high+1]=A[0];
}
}
希尔排序
void ShellSort(ElemType A[], int n) {
for (dk=n/2; dk>=1; dk=dk/2)
for (i=dk+1; i<=n; ++1)
if(A[i].key < A[i-dk].key) {
A[0]=A[i];
for (j=i-dk; j>0&&A[0].key < A[j].key; j-=dk)
A[j+dk]=A[j];
A[j+dk]=A[0];
}//if
}
冒泡排序
void BubbleSort(ElemType A[], int n) {
for (i=0; i<n-1; i++) {
flag=false;
for(j=n-1; j>i; j--)
if (A[j-1].key > A[j].key) {
swap(A[j-1], A[j]);
flag=true;
}
if (flag==false)
return;
}
}
快速排序
void QuickSort(ElemType A[], int low, int high) {
if (low<high) {
int pivotpos=Partition(A, low, high);
QuickSort(A, low, pivotpos-1);
QuickSort(A, pivotpos+1, high);
}
}
int partition(ElemType A[], int low, int high) {
ElemType pivot=A[low];
while(low<high) {
while(low<high&&A[high] >= pivot) --high;
A[low]=A[high];
while(low<high&&A[low] <= pivot) ++low;
A[high]=A[low];
}
A[low]=pivot;
return low;
}
简单选择排序
void SelectSort(Ele;mType A[], int n) {
for (i=0; i<n-1; i++) {
min = 1;
for(j=i+1; j<n; j++)
if(A[j] < A[min]) min=j;
if(min!=i) swap(A[i], A[min])
}
}
堆排序
建立大根堆算法
void BuildMaxHeap(ElemType A[], int len) {
for (int i=len/2; i>0; i--)
AdjustDown(A, i, len);
}
void AdjustDown(ElemType A[], int k, int len) {
A[0]=A[k];
for (i=2*k; i<=len; i*=2) {
if (i<len && A[i]<A[i+1])
i++;
if (A[0]>=A[i]) break;
else {
A[k]=A[i];
k=i;
}
} // forj
A[k]=A[0];
}
堆排序算法
void HeapSort(ElemType A[], int len) {
BuildMaxHeap(A, len);
for(i=len; i>1; i--) {
Swap(A[i], A[1]);
AjustDown(A, 1, i-1);
}//for
}
下面是向上调整堆的算法
void AjustUp(ElemType A[], int k) {
A[0]=A[k];
int i=k/2;
while(i>0&&A[i]<A[0]) {
A[k]=A[i];
k=i;
i=k/2;
}//while
A[k]=A[0];
}
1。理解单处理器计算机系统中各部件的内部工作原理、组成结构以及相互连接方式,
具有完整的计算机系统的整机概念。
2。理解计算机系统层次化结构概念,熟悉硬件与软件之间的界面,掌握指令集体系结
构的基本知识和基本实现方法。
3。能够综合运用计算机组成的基本原理和基本方法,对有关计算机硬件系统中的理论
和实际问题进行计算、分析,对一些基本部件进行简单设计;并能对高级程序设计语言(如
C 语言)中的相关问题进行分析。
(一)计算机发展历程
(二)计算机系统层次结构
计算机硬件的基本组成
计算机软件和硬件的关系
计算机的工作过程
(三)计算机性能指标
吞吐量、响应时间;CPU 时钟周期、主频、CPI、CPU 执行时间;MIPS、MFLOPS 、GFLOPS、
TFLOPS、PFLOPS。
(一)数制与编码
1。进位计数制及其相互转换
2。真值和机器数
3.BCD 码
(一)存储器的分类
(二)存储器的层次化结构
(三)半导体随机存取存储器
1.SRAM 存储器
2.DRAM 存储器
3。只读存储器
4.Flash 存储器
(四)主存储器与 CPU 的连接
(五)双口 RAM 和多模块存储器
(六)高速缓冲存储器(Cache)
1.Cache 的基本工作原理
2.Cache 和主存之间的映射方式
3.Cache 中主存块的替换算法
4.Cache 写策略
(七)虚拟存储器
1。虚拟存储器的基本概念
2。页式虚拟存储器
3。段式虚拟存储器
4。段页式虚拟存储器
5.TLB(快表)
(一)指令格式
1。指令的基本格式
2。定长操作码指令格式
3。扩展操作码指令格式
(二)指令的寻址方式
1。有效地址的概念
2。数据寻址和指令寻址
3。常见寻址方式
(三)CISC 和 RISC 的基本概念
(一)CPU 的功能和基本结构
(二)指令执行过程
(三)数据通路的功能和基本结构
(四)控制器的功能和工作原理
1、硬布线控制器
2、微程序控制器
微程序、微指令和微命令;微指令的编码方式;微地址的形式方式。
(五)指令流水线
1、指令流水线的基本概念
2、指令流水线的基本实现
3、超标量和动态流水线的基本概念
(一)总线概述
1、总线的基本概念
2、总线的分类
3、总线的组成及性能指标
(二)总线仲裁
1、集中仲裁方式
2、分布仲裁方式
(三)总线操作和定时
1、同步定时方式
2、异步定时方式
(四)总线标准
(一)I/O 系统基本概念
(二)外部设备
1、输入设备:键盘、鼠标
2、输出设备:显示器、打印机
3、外存储器:硬盘存储器、磁盘阵列、光盘存储器
(三)I/O 接口(I/O 控制器)
1、I/O 接口的功能和基本结构
2、I/O 端口及其编址
(四)I/O 方式
1、程序查询方式
2、程序中断方式
中断的基本概念;中断响应过程;中断处理过程;多重中断和中断屏蔽的概念。
3、DMA 方式
DMA 控制器的组成,DMA 传送过程。
重点掌握各个性能指标的计算和基本概念。
小记
英文缩写
存储器
运算器
机器字长,计算机能直接处理的二进制数据的位数,一般等于内部寄存器的大小,决定计算机的运算精度。
数据通路带宽,数据总线一次所能并行传送信息的位数。(外部)
主存容量,指主存储器所能存储信息的最大容量,MAR的位数反映存储单元的个数。
运算速度
吞吐量,指系统在单位时间内处理请求的数量。主要取决于主存的存取周期
响应时间,
CPU时钟周期,常为节拍脉冲或T周期,即主频的倒数,是CPU中最小的时间单位,每个动作至少需要1个时钟周期。
主频(CPU时钟频率),衡量机器速度的重要参数,主频越高,速度越快。1Hz表示每秒1次。
CPI(Clock cycle Per Instruction),指执行一条指令所需的时钟周期数。
CPU执行时间,指运行一个程序所花费的时间
CPU执行时间=CPU时钟周期数 / 主频=(指令条数 x CPI)/ 主频
MIPS、MFLOPS(百万)、GFLOPS(十亿)、TFLOPS(万亿)
三种语言
机器语言,汇编语言(汇编程序),高级语言(编译-汇编 | 翻译)
计算机的工作过程
取指令:(PC) -> MAR -> M -> MDR -> IR
分析指令: OP(IR) -> CU
执行指令: Ad(IP) -> MAR -> M -> MDR -> ACC
: (PC)+1 -> PC
计算机系统的多层次结构
微程序机器层 - 传统机器语言层 - 操作系统层 - 汇编语言层 - 高级语言层.
“裸机” - 没有配备软件的纯硬件系统,3-5层称为虚拟机
计算机体系结构和计算机组成的区别和联系
纵观近几年真题,不难发现unsigned, short, int, long, float, double, 等在C语言中的表示,运算,溢出判断,隐式类型转换, 强制类型转换, IEEE 754浮点数的表示, 以及浮点数的运算,都是考验的重点,需要牢固掌握。
Base
进制转换
真值,机器数:真值是带符号“+” 和 “-”的数, 机器数是将符号数字化的数,如 0为正,1为负。
BCD码,二进制编码的十进制数(Binary-Coded Decimal, BCD),常采用4位二进制数表示一位十进制的数码。有8421码,余3码,2421码
字符与字符串
校验码
tips
奇偶校验码,具有局限性,奇偶校验只能发现数据代码中奇数位的出错情况,但不能纠正错误,常用于对存储器数据的检查或传输数据的检查。
海明(汉明)校验码 *
纠错理论 L - 1 = D + C 且 D >= C
Steps
确定海明码的位数,$n+k\le2^k-1$,若要检测两位错,则需再增加1位校验位,即$2^{k-1}\ge n+k$
确定校验位的分布,规定校验位 $P_i$在海明位号为$2^{i-1}$的位置上,其余各位为信息位。
分组以形成校验关系,被校验数据位的海明位号等于校验该数据位的各校验位海明位号之和。
校验位取值,校验位$P_i$的值为第$i$组(由校验位校验的数据位)所有位求异或
海明码的校验原理
每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查,若全为 0,则说明无错,否则说明出错,且这个数就是错误位的位号,直接将该位取反就达到了纠错的目的。
循环冗余校验(CRC)码 *
表示
无符号数,
有符号数 | 原码,补码,反码,移码 | 区别真值
0为正,1为负,设字长为n+1.
原码,
补码,
纯小数表示范围$-1\le x\le 1-2^{-n}$,(比原码多表示 $-{1}$)
整数表示范围$-2^n \le x \le 2^n-1$, (比原码多表示$-2^n$)
真值零的补码表示是唯一的,00000
对于正数,补码与原码的表示相同
对于负数, $[x]原 \rarr [x]补 或 [x]补\rarr[x]原$
符号为不变,数值部分按位取反,末位加1
反码
移码
定点表示
定点小数($1-2^{-n}$),定点整数($2^n - 1$)
补码的算术移位
运算
移位
算术移位 (有符号数), 移位过程中,符号位保持不变
逻辑移位,操作对象是逻辑代码,可视为无符号数
循环移位
带进位标志位CF的循环移位(大循环),不带进位标志位的循环移位(小循环)
特点:移出的数位又被移入数据
适合将数据的低字节数据和高字节数据互换
原码定点数的加减法运算
补码定点数的加减法运算
计算机系统中普遍采用补码加减运算
符号扩展
溢出概念和判别方法
大于机器所能表示的最大正数为 上溢
小于机器所能表示的最小负数为 下溢
补码溢出判断
V=0,表示无溢出;V=1,表示有溢出
2. 采用双符号位,也称模 4 补码
$S_{s1}S_{s2}$相同,表示未溢出,不同,表示溢出,此时最高位符号位代表真正的符号
3. 采用一位符号位根据数据位的进位情况判断溢出
若符号位的进位$C_s$与最高数位的进位相同,说明没有溢出,否则表示发生溢出
定点数的乘法运算
乘法运算由累加和右移操作实现
原码一位乘法
符号位与数值位分开求,符号位求异或,数值位求两绝对值的乘积(过程中的移位操作均为逻辑移位),操作中引入双符号位
补码一位乘法(Booth算法)
一种有符号数的乘法,采用相加或相减操作计算补码数据的乘积,(移位操作为补码右移),引入双符号位,(共进行 n+1 次累加和 n 次右移).
乘法运算总结
定点数的除法运算
除法运算可转换成 “累加-左移”(逻辑左移)
原码除法,主要采用原码不恢复余数法,也称原码加减交替除法
特点:商符合商值分开进行,商符求异或.
补码除法,(加减交替法)
除法运算总结
强制类型转换
数据的存储和排列,
表示
tips
表示格式
规格化浮点数
IEEE754标准
IEEE754标准的浮点数(除临时浮点数外),是尾数用采取隐藏位策略的原码表示,且阶码用移码表示的浮点数。
定点, 浮点表示的区别
浮点表示相比较而言,表示范围远远扩大、精度有所下降、运算较复杂、(非规格化)不一定会溢出
浮点数的加减运算
特点:阶码运算和尾数运算分开进行,一律采用补码.
分为以下几步:
对阶 ,小阶向大阶看齐
尾数求和
规格化
舍入
溢出判断
强制类型转换
常见有 char - int - long -double 和 float - double
加法器
一位全加器 |
算术逻辑单元的功能和结构
分类
作用
主存储器(主存,内存)、辅助存储器(外存)、高速缓冲存储器(Cache)
介质
磁表面存储器(磁盘,磁带)、磁心存储器半导体存储器(MOS行存储器,双极行存储器)和光存储器(光盘)
存取方式
随机存储器(RAM)、只读存储器(ROM)、串行访问存储器
可保存性
易失存储器,非易失存储器
性能指标
存储容量 | 单位成本 |
存储速度
数据传输率 = 数据的宽度 / 存储周期
存取时间$T_a$,存取周期$T_m$,主存带宽$B_m$(又称数据传输率)
(磁带,光盘)—> 磁盘—> 主存—> Cache—> 寄存器
半导体存储芯片
基本结构:存储矩阵,译码驱动,读写电路,读/写控制线,片选线,地址线,数据线
74138译码器
tips
SRAM和DRAM
SRAM工作原理
DRAM工作原理
DRAM电容上的电荷只能维持1~2 ms
集中刷新,
读写操作时,不受刷新影响,因此系统的存取速度较高;缺点是在集中刷新期间(死区)不能访问存储器。
分散刷新
优点是没有死区;缺点是加长了系统的存取周期,降低了整机的速度
异步刷新
前两种的结合。避免是CPU连续等待过长的时间,而且减少了刷新次数,从根本上提高了整机的工作效率
RAM的读 写周期
写周期不明确
SRAM 和 DRAM 的比较.
tips
只读存储器
ROM的特点,
类型
掩膜式只读存储器MROM,一次可编程只读存储器PROM,可擦除可编程只读存储器EPROM(编程次数有限),闪速存储器Flash Memory,固态硬盘Solid State Drivers.
连接原理
数据总线,地址总线,控制总线
主存容量的扩展
位扩展法
连接方式,是将多个存储芯片的地址端、片选端和读写控制端相应并联,数据短分别引出。
仅采用位扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,在某一时刻选中所有的芯片,所以片选信号$\overline{CS}$要连接到所有芯片
字扩展法
字位同时扩展法
存储芯片的地址分配和片选
CPU对存储单元进行访问,首先要选择存储芯片(片选),然后为选中的芯片依地址码选择相应的存储单元,以进行数据的存取(字选)。片内的字选通常是由CPU送出的 N 条低位地址线完成的,地址线直接接到所有存储芯片的地址输入端(N由片内存储容量$2^N$决定)
线选法
优:不需要地址译码器,线路简单;缺:地址空间不连续,选片的地址线必须分时为低电平(否则不能工作),不能充分利用系统的存储器空间,造成地址资源的浪费
译码片选法
用除片内寻址外的高位地址线通过地址译码器芯片产生片选信号。
存储器与CPU的连接
合理选择存储芯片
地址线的连接
数据线的连接
CPU的数据线数与存储芯片的数据线数不一定相等,在相等时可直接相连;在不相等时必须对存储芯片扩位,使两者相等
读/写命令线的连接
片选线的连接
片选线的连接是CPU与存储芯片连接的关键。存储器有许多存储芯片叠加而成,哪一片被选中完全取决于该存储芯片的片选控制端$\overline{CS}$是否能接收到来自CPU的片选有效信号。
片选信号与CPU的访存控制信号$\overline{MREQ}$(低电平有效)有关
为了提高CPU访存速度,可采用双端口存储器、多模块存储器等技术,它们同属并行技术,前者为空间并行,后者为时间并行。
双端口RAM
多模块存储器
单体多字存储器
多体并行存储器
高位交叉编址(顺序方式),高位地址表示体号,低位地址为体内地址
低位交叉编址(交叉方式),低位地址为体号,高位地址为体内地址
因为单纯依靠并行主存系统提高主存系统的频宽是有限的,所以 Cache 闪亮登场.
程序访问的局部性原理,包括时间局部性和空间局部性
高速缓冲技术就是利用程序访问的局部性原理。
Cache的基本工作原理,cache常由SRAM构成
Cache和主存的映射方式
在Cache中,地址映射是指把主存地址空间映射到Cache地址空间,即把存放在主存中的程序按照某种规则装入Cache。
地址映射不同于地址变换,地址变换是指CPU在访存时,将主存地址按映射规则换算成Cache地址的过程。
直接映射,实现简单,但不够灵活,块冲突概率最高,空间利用率最低
全相联映射,比较灵活,Cache块的冲突概率低,空间利用率高,命中率也高;缺点:地址变换速度慢,实现成本高,通常采用昂贵的按内容寻址的相连存储器进行地址映射。
组相联映射
组间采取直接映射,组内采取全相连映射
Cache中主存块的替换算法
随机算法(RAND)
实现比较简单,但未依据程序访问的局部性原理,故可能命中率较低.
先进先出算法(FIFO)
容易实现,但也未依据程序访问的局部性原理,可能会把常用的程序块作为最早进入Cache的块替换掉。
近期最少使用算法(LRU)
依据程序访问的局部性原理选择近期内长久未访问过的存储行作为替换的行,平均命中率要比FIFO的高,是堆栈类算法。
LRU对每行设置一个计数器,Cache每命中一次,命中行计数清 0,其它行计数器均加 1。计数值最大的行换出。
最不经常使用算法(LFU)
将一段时间内被访问次数最少的存储行换出,每行也设置一个计数器,新行初始为0,每访问一次,被访问行计数器加 1,计数值最小的行换出
Cache写策略,对于Cache写命中 (write hit)
全写法(写直通法,write-through)
实现简单,随时保持主存数据的正确性。缺点:增加了访存次数,降低了Cache的效率。
写缓冲(Write Buffer):减少全写法直接写入主存的时间消耗,是一个FIFO队列
写回法(write-back)
当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。
减少了访存次数,但存在不一致的隐患,
每个Cache行必须设置一个标志位(脏位),以反映此块是否被CPU修改过。
写不命中
写分配法(write-allocate)
加载主存中的块到Cache中,然后更新这个Cache块,它试图利用程序的空间局部性,但缺点是每次不命中都需要从主存中读取一块
非写分配法(not-write-allocate)
只写入主存,不进行调块
多级Cache
通常为 3 级,离CPU越远,访问速度越慢,容量越大。指令Cache与数据Cache分离一般在L1级,此时通常为写分配法与写回法合用。
虚拟存储器具有主存的速度和辅存的容量,提高了存储系统的性价比。
基本概念
用于编程允许设计的地址称为 虚地址或逻辑地址,虚地址对应的存储空间或程序空间;实际的主存单元地址称为实地址或物理地址,实地址对应的是主存地址空间,也成实地址空间。虚地址要比实地址大很多。程序进行虚地址到实地址转换的过程称为程序的再定位。
页式虚拟存储器
虚地址分为两个字段:虚页号 和 页内地址
页表,虚页号和实页号的对照表;页表项:虚页号,实页号,装入位
优: 页面长度固定,页表简单,调入方便。缺:处理,保护和共享都不及段式虚拟存储器方便。
段式虚拟存储器
虚拟地址分为两部分:段号和段内地址
段表,是程序逻辑段和在主存中存放位置的对照表;段表行:段号,装入位,段起点和段长
优:易于编译,管理,修改和保护,也便于多道程序的共享;缺:容易在段间留下碎片,造成浪费。
段页式虚拟存储器
块表(TLB)
虚拟存储器与Cache的比较
相联存储器既可以按地址寻址,又可以按内容寻址,又称按内容寻址的存储器。
软件和硬件的逻辑上是等效的,不是等价的
什么是存储程序原理?按此原理,计算机应具有哪几大功能?
- 存储程序是指将指令以代码的形式事先输入计算机主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。
- 计算机按照此原理应该具有 5 大功能:数据传送功能、数据存储功能、数据处理功能、操作控制功能、操作判断功能
指令,又称机器指令,是计算机运行的最小功能单位。指令系统是计算机的主要属性,位于硬件和软件的交界层面上。
基本格式
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,包括 操作码字段 和 地址码字段。
指令长度:单字长指令,半字长指令,双字长指令
定长指令字结构和变长指令字结构
根据指令中操作数地址码的 数目 的不同,可分为
零地址指令
一地址指令
只有目的操作数的但操作数指令
$OP(A_1)\rarr A_1$ ,如加1,减1,求反,求补
隐含约定目的地址的双操作数指令,如ACC(累加器)
$(ACC)OP(A_1)\rarr ACC$
二地址指令
$(A_1)OP(A_2)\rarr A_1$
三地址指令
$(A_1)OP(A_2)\rarr A_3$
四地址指令
$(A_1)OP(A_2)\rarr A_3,\ A_4 = 下一条将要执行指令的地址$,
定长操作码指令格式
一般 n 位操作码字段的指令系统最大能够表示 $2^n$ 条指令.
扩展操作码指令格式
设计操作码指令格式时,需注意:
不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
各指令的操作码一定不能重复
一般地,使用频率较高的指令分配较短的操作码,使用频率低的指令分配较长的操作码,以减少指令译码和分析的时间。
寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。形式地址(A)+ 寻址方式 = 有效地址(EA).
指令寻址
数据寻址
数据寻址是指如何在指令中表示一个操作数的地址,如何用这种表示得到操作数或怎样计算出操作数的地址。
常见的数据寻址方式
隐含寻址
累加器(ACC)对单地址指令格式来说是隐含地址。
优:利于缩短指令字长;缺:需增加存储操作数或隐含地址的硬件
立即(数)寻址
优:指令在执行阶段不访问主存,指令执行时间最短;缺:A的位数限制了立即数的范围。
直接寻址,EA = A
指令字中的形式地址 A 是操作数的真实地址 EA.
优:简单,指令在执行阶段仅访问一次主存,不需要专门计算操作数的地址。
缺:A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改
间接寻址,EA = (A)
即操作数地址的地址,一次间接寻址或多次间接寻址.
优:可扩大寻址范围,便于编制程序;
缺:指令在执行阶段要多次访存,优于访问速度过慢,所以不常用,一般问道扩大寻址范围时,通常指的是寄存器间接寻址。
寄存器寻址,EA = $R_i$
指在指令字中直接给出操作数所在的寄存器编号,其操作数在有 $R_i$所指的寄存器内。
优:指令在执行阶段不访问主存,只访问寄存器,因寄存器数量少,对应地址码长度较小,使得指令字短且因不用访存,所以执行速度快,支持向量/矩阵运算
缺:寄存器价格昂贵,计算机中的寄存器个数有限。
寄存器间接寻址,EA = $(R_i)$
指在寄存器$R_i$中给出的不是一个操作数,而是操作数所在主存单元的地址。
特点:比一般简介寻址速度更快,但指令的执行阶段需要访问主存。
相对寻址,EA = (PC)+ A
把程序计数器(PC)的内容加上指令格式中的形式地址 A 而形成操作数的有效地址。其中 A 是相对于当前指令地址的位移量,可正可负,补码表示。
优:操作数地址不固定,随 PC 值得变化而变化,且与指令地址之间总是相差一个固定值,因此便于程序浮动,相对寻址广泛应用于转移指令。
基址寻址, EA = (BR) + A
CPU中基址寄存器(BR)的内容加上指令格式中的形式地址 A 而形成操作数的有效地址. 其中基址寄存器即可采用专用寄存器,又可采用通用寄存器。基址寄存器面向操作系统,其内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。
优:可扩大寻址范围,用户不必考虑自己的程序存于主存的哪个空间区域,故有利于多道程序设计,并可用于编制浮动程序,但偏移量(形式地址 A)的位数较短。
变址寻址,EA = (IX) + A
指有效地址 EA 等于指令字中的形式地址 A 与 变址寄存器 IX 的内容之和。变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址 A 不变(作为基地址)。
变址寻址与基址寻址的有效地址形成过程极为相似,但本质上讲,两者有较大区别:
堆栈寻址
该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP).
复杂指令系统计算机(CISC)
精简指令系统计算机(RISC)
两者的比较
功能
基本结构
运算器
3.累加寄存器(ACC),通用寄存器,暂存ALU运算的结果信息,可以作为加法运算的一个输入端
4.通用寄存器组
如AX, BX, CX, DX, SP等,用于存放操作数(源操作数,目的操作数及中间结果)和各种地址信息。SP是堆栈指针,用于指示栈顶的地址。
5.程序状态字寄存器(PSW)
溢出标志(OF),符号标志(SF),零标志(CF),进位标志(CF)等。PSW中的这些位参与并决定微操作的形成。
6.移位器 ,对操作数和运算结果进行移位运算
7.计数器(CT),控制乘除运算的操作步数。
控制器
基本功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的。控制器分 硬布线控制器和微程序控制器两种类型。
寄存器
指令周期
指令周期的数据流
数据流是根据指令要求依次访问的数据序列。
取指周期
间址周期
执行周期
不同指令的执行周期操作不同,因此没有同意的数据流向
中断周期
指令执行方案
单指令周期
对所有指令都选用相同的执行时间来完成,此时每条指令 都在固定的时钟周期内完成。会降低整个系统的运行速度。
多指令周期
选用不同个数的时钟周期来完成不同的指令的执行过程
流水线方案
指令之间并行执行。追求目标是力争在每个时钟脉冲周期完成一条指令的执行过程(理想状态)。
功能
数据在功能部件之间传送的路径称为数据通路。功能是实现CPU内部的运算器与寄存器及寄存器之间的数据交换。建立数据通路的任务是由 “操作控制部件” 来完成的。
数据通路的基本结构
CPU内部单总线方式,多冲突,性能低
CPU内部三总线方式,效率较高
专用数据通路方式,性能较高,但硬件量大。
Attention
内部总线是指同一部件,如CPU内部链接各寄存器及运算部件之间的总线;系统总线是指同一台计算机系统的各部件,如CPU, 内存, 通道和各类 I/O 接口间互相连接的总线。
Others
寄存器之间的数据传送
主存与CPU之间的数据传送
执行算术或逻辑运算
结构和功能
硬布线控制器
硬布线控制单元图
硬布线控制器的时序系统及微操作
时钟周期
机器周期
指令周期
微操作命令分析
CPU的控制方式
硬布线控制单元设计步骤,复杂,详见书本
微程序控制器
微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生。
基本概念
组成和工作过程
基本组成
工作过程,复杂,见课本
微指令的编码方式
又称微指令的控制方式,是指如何对微指令的控制字段进行编码,以形成控制信号。编码的目标是在保证速度的情况下,尽量缩短微指令字长。
直接编码(直接控制)方式
优点是简单、直观,执行速度快,操作并行性好;缺点是微指令字长过长,n 个微指令就要求微指令的操作字段有 n 位,造成控制存储器容量极大。
字段直接编码方式
字段间接编码方式
又称隐式编码,可进一步缩短微指令字长,但因削弱了微指令的并行控制能力,因此通常作为字段直接编码方式的一种辅助手段。
微指令的地址形成方式
微指令的格式
水平型微指令
优点是微程序短,执行速度快;缺点是微指令长,编写微程序较麻烦
垂直型微指令
优点是微指令短,简单,规整,便于编写微程序;缺点是微程序长,执行速度慢,工作效率低。
混合型微指令
微指令较短,仍便于编写;微程序也不长,执行速度加快
水平型微指令和垂直型微指令
微程序控制单元的设计步骤
动态微程序设计和毫微程序设计
硬布线和微程序控制器的特点
基本概念
计算机的流水线把一个重复的过程分解为若干子过程,每个子过程与其他子过程并行执行。是一种普遍使用的并行处理技术。
指令流水的定义
多条指令在处理器中执行时:
顺序执行方式,T = 3nt
传统冯.诺依曼机采用顺序执行方式,又称串行执行方式。优点是控制简单,硬件代价小;缺点是执行指令的速度较慢。
一次重叠执行方式,T = (1+2n)t
优点:程序的执行时间缩短了 1/3, 各功能部件的利用率明显提高,但硬件上有较大开销,控制过程也较复杂。
二次重叠执行,(2+n)t
时间缩短 2/3,这是一种理想的指令执行方式。
![image-20200422172613136](pat\cc0057.png)
流水线的表示方法,时空图
流水线方式的特点,见书。
流水线的分类
影响流水线的因素
流水线的性能指标
超标量流水线的基本概念
为了更好地解决 I/O 设备和主机之间连接的灵活性问题,计算机的结构从分散连接发展为总线连接,为了进一步简化设计,又提出了各类总线标准。
基本概念
定义
总线是一组能为多个部件分时、共享的公共信息传送线路。在某一时刻只允许有一个部件向总线发送信息,但多个部件可同时从总线上接受相同的信息。
总线设备:主设备和从设备
总线特性:是指机械特性(尺寸,形状)、电器特性(传输方向和有效的电平范围)、功能特性(每根传输线的功能)和时间特性(信号和时序的关系)。
总线的猝发传输方式,在一个总线周期内传输存储地址连续的多个数据字的总线传输方式,称为猝发传送。
分类
按功能划分为以下 3 类:
片内总线,是CPU芯片内部寄存器与寄存器之间、寄存器与ALU之间的公共连接线。
系统总线,是计算机系统内各功能部件(CPU,主存,I/O连接)之间相互连接的总线。
数据通路是数据流经的路径,数据总线是承载的媒介。
按传送信息内容的不同,又可分为 3 类:
通信总线,也称为外部总线
通信总线是在计算机系统之间或计算机系统与其他系统(如远程通信设备、测试设备)之间传送信息的总线
结构
单总线结构,主存总线
双总线结构,主存总线 和 I/O 总线
性能指标
1.总线的传输周期,2.总线时钟周期,3.总线的工作频率, 4.总线的时钟频率, 5.总线宽度,6.总线带宽,7.总线复用,8.信号线数
集中仲裁方式
分布仲裁方式
总线定时是指总线在双方交换数据的过程中国需要时间上配合关系的控制,这种控制称为总线定时,其实质是一种协议或规则,主要有同步和异步两种基本定时方式。
总线传输的4个阶段
申请分配阶段,寻址阶段,传输阶段,结束阶段
同步定时方式
适用于总线长度较短及总线所接部件的存取时间比较接近的系统。
异步定时方式
根据 “请求” 和 “回答” 信号的撤销是否互锁,又可分为以下 3 种类型:
输入/输出系统
I/O控制方式
1)2)主要用于数据传输率较低的外部设备,3)4)主要用于数据传输率较高的设备
程序查询方式,由CPU通过程序不断查询 I/O 设备是否已做好准备,从而控制 I/O设备与主机交换信息
程序中断方式,有在 I/O 设备准备就绪并向 CPU 发出中断请求时才予以响应
DMA方式,主存和 I/O 设备之间有一条直接数据通路,当主存和 I/O 设备交换信息时,无需调用中断服务程序。
通道方式,在系统中设有通道控制部件,每个通道都挂接若干外设,主机在执行 I/O 命令时,只需启动有关通道,通道将执行通道程序,从而完成 I/O 操作。
输入设备
键盘,鼠标(机械式,光电式)
输出设备
显示器
主要参数有:屏幕大小,分表率,灰度级,刷新,刷新频率,显示存储器
阴极射线管(CRT)显示器
字符显示器 和 图形显示器
液晶显示器(LCD)
LED(发光二极管)显示器
打印机
外存储器
磁盘存储器,磁盘阵列,光盘存储器,固态硬盘
功能
基本结构
类型
端口及其编址
对 I/O 端口的编址方式:
1。掌握操作系统的基本概念、基本原理和基本功能,理解操作系统的整体运行过程。
2。掌握操作系统进程、内存、文件和 I/O 管理的策略、算法、机制以及相互关系。
3。能够运用所学的操作系统原理、方法与技术分析问题和解决问题,并能利用 C 语言
描述相关算法。
(一)操作系统的概念、特征、功能和提供的服务
(二)操作系统的发展与分类
(三)操作系统的运行环境
1。内核态与用户态
2。中断、异常
3。系统调用
(四)操作系统体系结构
(一)进程与线程
1。进程概念
2。进程的状态与转换
3。进程控制
4。进程组织
5。进程通信
共享存储系统;消息传递系统;管道通信。
6。线程概念与多线程模型
(二)处理机调度
1。调度的基本概念
2。调度时机、切换与过程
3。调度的基本准则
4。调度方式
5。典型调度算法
先来先服务调度算法;短作业(短进程、短线程)优先调度算法;时间片轮转调度算法;
优先级调度算法;高响应比优先调度算法;多级反馈队列调度算法。
(三)同步与互斥
1。进程同步的基本概念
2。实现临界区互斥的基本方法
软件实现方法;硬件实现方法。
3。信号量
4。管程
5。经典同步问题
生产者-消费者问题;读者-写者问题;哲学家进餐问题。
(四)死锁
1。死锁的概念
2。死锁处理策略
3。死锁预防
4。死锁避免
系统安全状态,银行家算法。
5。死锁检测和解除
(一)内存管理基础
1。内存管理概念
程序装入与链接;逻辑地址与物理地址空间;内存保护。
2。交换与覆盖
3。连续分配管理方式
4。非连续分配管理方式
分页管理方式;分段管理方式;段页式管理方式。
(二)虚拟内存管理
1。虚拟内存基本概念
2。请求分页管理方式
3。页面置换算法
最佳置换算法(OPT);先进先出置换算法(FIFO);最近最少使用置换算法(LRU);
时钟置换算法(CLOCK)。
4。页面分配策略
5。工作集
6。抖动
(一)文件系统基础
1。文件概念
2。文件的逻辑结构
顺序文件;索引文件;索引顺序文件。
3。目录结构
文件控制块和索引节点;单级目录结构和两级目录结构;树形目录结构;图形目录结构。
4。文件共享
5。文件保护
访问类型;访问控制。
(二)文件系统实现
1。文件系统层次结构
2。目录实现
3。文件实现
(三)磁盘组织与管理
1。磁盘的结构
2。磁盘调度算法
3。磁盘的管理
(一)I/O 管理概述
1.I/O 控制方式
2。 I/O 软件层次结构
(二)I/O 核心子系统
1.I/O 调度概念
2。高速缓存与缓冲区
3。设备分配与回收
4。假脱机技术(SPOOLing)
操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合。
特征
并发(Concurrence)
共享(Sharing)
虚拟(Virtual)
异步(Asynchronism)
多道程序环境允许多个程序并发执行,但由于资源有限,进程的执行并不是一贯到底的,而是走走停停的,它以不可预知的速度向前推进,这就是进程的异步性。
操作系统的目标和功能
操作系统类似于 工人 于 雇主和机器的关系
操作系统作为计算机系统资源的管理者
处理机管理(进程管理)
包括进程控制、进程同步、进程通信、死锁处理、处理机调度等
存储器管理
包括内存分配、地址映射、内存保护与共享、内存扩充
文件管理
包括文件存储空间的管理、目录管理、文件读写管理和保护
设备管理
包括缓冲管理、设备分配、设备处理、虚拟设备
操作系统作为用户与计算机硬件系统之间的接口
操作系统用作扩充机器
操作系统发展与分类
操作系统的运行环境
操作系统的运行机制
CPU 通常执行两种不同性质的程序
特权指令,是指计算机中不允许用户直接使用的指令,如 I/O指令、置终端指令等
CPU状态,用户态(目态)和 核心态(管态、内核态)
现代操作系统几乎都是层次的结构,各项功能分别设置在不同的层次上。
大多数操作系统内核包括四方面内容:
时钟管理
中断机制
中断机制中,只有一小部分功能属于内核,它们负责保护和恢复中断现场的信息,转移控制权到相关的处理程序
原语(Atomic Operation)
系统控制的数据结构及处理
系统中用来登记状态信息的数据结构很多。
中断和异常的概念
系统调用
是指用户在程序中调用 操作系统所提供的一些子功能。
按功能分
设备管理 | 文件管理 | 进程管理 | 进程通信 | 内存管理
用户程序可以执行陷入指令(又称访管指令或 trap 指令)来发起系统调用,请求操作系统提供服务。相当于底层操作对用户透明,用户只需调用已定义的方法或操作即可。期间,CPU 在用户态和核心态间切换
访管指令是在用户态使用的,不是特权指令
操作系统的体系结构
Intro
进程的状态与转换
进程控制
一般把进程控制用的程序段称为原语.
进程的创建
进程的终止
进程的阻塞(Block)和唤醒(Wakeup)
进程切换
进程的组织
进程是一个独立的运行单位,也是操作系统进行,资源分配和调度的基本单位。一般由三部分组成
进程控制块,即现场
程序段
程序段就是能被进程调度程序调度到 CPU 执行的程序代码段。注意,多个进程可以运行同一个程序。
数据段
一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。
进程的通信
高级通信方式是指以较高的效率传输大量数据的通信方式,主要有以下三类:
线程概念和多线程模型
Intro
调度
从就绪队列中按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行。
调度的层次
一个作业从提交开始直到完成,往往要经历以下三级调度,
作业调度,又称高级调度,是内存与辅存之间的调度,频率低,几分钟一次,大多多道批处理系统中有,其它系统则不需要
中级调度,又称内存调度,
进程调度,又称低级调度,频率很高,一般几十毫秒一次,最基本的,不可或缺
三级调度的联系
调度的时机、切换和过程
进程调度和切换程序是操作系统内核程序
进程调度方式
非剥夺调度方式,非抢占方式
适用于大多数的批处理系统,但它不能用于分时系统和大多数的实时系统
剥夺调度方式,抢占方式
该方式对提高系统吞吐率和响应效率都有明显的好处,但 “剥夺” 不是一种任意性行为,必须遵循一定的原则,主要有优先权、短进程优先和时间片原则等。
调度的基本准则
典型的调度算法
先来先服务(FCFS)调度算法
短作业优先(SJF)调度算法
优先级调度算法
静态 / 动态 优先级,动态调整的主要依据有占有 CPU 时间的长短、就绪进程等待 CPU 时间的长短
优先级设置参考准则
高响应比优先调度算法
主要用于作业调度,是对 FCFS 和 SJF 的一种综合平衡
克服饥饿状态,兼顾了长作业
时间片轮转调度算法
多级反馈队列调度算法(融合了前几种算法的优点)
Intro
临界资源
同步
也称直接制约关系,指两个或多个进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系,该关系源于它们之间的相互合作
互斥
也称间接制约关系,需遵循以下准则:
实现临界区互斥的基本方法
软件实现方法
进入区设置标志,退出区修改标志
硬件实现方法
通过硬件支持实现临界段问题的方法称为低级方法,或元方法
信号量
Intro
Intro
整型信号量
wait(S) {
while(S <= 0);
S = S - 1;
}
signal(S) {
S = S + 1;
}
被定义为一个用于表示资源数目的整型量 S.
未遵循 “让权等待” 的准则,而是使进程处于 “忙等” 的状态
记录性信号量
typedef struct {
int value;
struct process *L;
} semaphore;
void wait(semaphore S) { // 相当于申请资源
S.value--;
if(S.value < 0) {
add this process to S.L;
block(S.L);
}
}
void signal(semaphore S) { // 相当于释放资源
S.value++;
if(S.value <= 0){
remove a process P from S.L;
wakeup(P);
}
}
S.value < 0, 表示该类资源已分配完,因此进程调用 block 原语,进行自我阻塞,放弃处理机,并插入该类资源的等待队列 S.L. 遵循 “让权等待” 准则
若 S.value 加 1,后,仍然 <= 0, 表示 S.L 中仍有等待该资源的进程被阻塞,故还应调用 wakeup 原语,将 S.L 中的第一个等待进程唤醒。
利用信号量实现同步
S 初始值为 0,$P_2$ 等待 $P_1$ 的结果, $P_2$ 先执行 P(S) , S 为 0,执行 P 操作会把进程 $P_2$ 阻塞,并放入阻塞队列;当进程 $P_1$ 得出结果,执行 V 操作,把 $P_2$ 从 阻塞队列中放回就绪队列,当 $P_2$ 得到处理机时,就得以继续执行。
利用信号量实现进程互斥
S 初始值为 1,临界区无进程,进程执行 P 操作,把 S 减为 0,然后进入临界区;临界区有进程,S 为 0,再有进程执行 P 操作将会被阻塞。
利用信号量实现前驱关系
分析进程同步和互斥问题的方法步骤
管程
1。掌握计算机网络的基本概念、基本原理和基本方法。
2。掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理
解典型网络设备的工作原理。
3。能够运用计算机网络的基本概念、基本原理和基本方法进行网络系统的分析、设计
和应用。
(一)计算机网络概述
1。计算机网络的概念、组成与功能
2。计算机网络的分类
3。计算机网络的标准化工作及相关组织
(二)计算机网络体系结构与参考模型
1。计算机网络分层结构
2。计算机网络协议、接口、服务等概念
3.ISO/OSI 参考模型和 TCP/IP 模型
(一)通信基础
1。信道、信号、宽带、码元、波特、速率、信源与信宿等基本概念
2。奈奎斯特定理与香农定理
3。编码与调制
4。电路交换、报文交换与分组交换
5。数据报与虚电路
(二)传输介质
1。双绞线、同轴电缆、光纤与无线传输介质
2。物理层接口的特性
(三)物理层设备
1。中继器
2。集线器
(一)数据链路层的功能
(二)组帧
(三)差错控制
1。检错编码
2。纠错编码
(四)流量控制与可靠传输机制
1。流量控制、可靠传输与滑轮窗口机制
2。停止-等待协议
3。后退 N 帧协议(GBN)
4。选择重传协议(SR)
(五)介质访问控制
1。信道划分
频分多路复用、时分多路复用、波分多路复用、码分多路复用的概念和基本原理。
2。随即访问
ALOHA 协议;CSMA 协议;CSMA/CD 协议;CSMA/CA 协议。
3。轮询访问
令牌传递协议
(六)局域网
1。局域网的基本概念与体系结构
2。以太网与 IEEE 802.3
3.IEEE 802.11
4。令牌环网的基本原理
(七)广域网
1。广域网的基本概念
2.PPP 协议
3.HDLC 协议
(八)数据链路层设备
1。网桥的概念和基本原理
2。局域网交换机及其工作原理。
(一)网络层的功能
1。异构网络互联
2。路由与转发
3。拥塞控制
(二)路由算法
1。静态路由与动态路由
2。距离-向量路由算法
3。链路状态路由算法
4。层次路由
(三)IPv4
1.IPv4 分组
2.IPv4 地址与 NAT
3。子网划分与子网掩码、CIDR
4.ARP 协议、DHCP 协议与 ICMP 协议
(四)IPv6
1.IPv6 的主要特点
2.IPv6 地址
(五)路由协议
1。自治系统
2。域内路由与域间路由
3.RIP 路由协议
4.OSPF 路由协议
5.BGP 路由协议
(六)IP 组播
1。组播的概念
2.IP 组播地址
(七)移动 IP
1。移动 IP 的概念
2。移动 IP 的通信过程
(八)网络层设备
1。路由器的组成和功能
2。路由表与路由转发
(一)传输层提供的服务
1。传输层的功能
2。传输层寻址与端口
3。无连接服务与面向连接服务
(二)UDP 协议
1.UDP 数据报
2.UDP 校验
(三)TCP 协议
1.TCP 段
2.TCP 连接管理
3.TCP 可靠传输
4.TCP 流量控制与拥塞控制
(一)网络应用模型
1。客户/服务器模型
2.P2P 模型
(二)DNS 系统
1。层次域名空间
2。域名服务器
3。域名解析过程
(三)FTP
1.FTP 协议的工作原理
2。控制连接与数据连接
(四)电子邮件
1。电子邮件系统的组成结构
2。电子邮件格式与 MIME
3.SMTP 协议与 POP3 协议
(五)WWW
1.WWW 的概念与组成结构
2.HTTP 协议
计算机网络是一些互联的、自治的计算机系统的集合.
功能:数据通信,资源共享,分布式处理,提高可靠性,负载均衡等。
分类
按分布范围
按传输技术
是否采用分组存储转发与路由选择机制是点对点式网络与广播式网络的重要区别,广域网基本属于点对点网络。
按拓扑结构
星形网络
每个终端或计算机都以单独的线路与中央设备相连,现在中央设备一般是交换机或路由器。
便于集中控制和管理,缺点是成本高,中心结点对故障敏感。
总线形网络
建网容易,增减结点方便,节省线路。缺点是重负载时通信效率不高,总线任意一处对故障敏感
环形网络
如令牌环局域网
网状型网络
多仔广域网中,可靠性高,缺点是控制复杂,线路成本高。
按使用者
按交换技术
电路交换网络
如传统电话网络, 包括建立连接、传输数据和断开连接 三个阶段
报文交换网络,也称存储-转发网络
用户数据加上源地址、目的地址、校验码等辅助信息,然后封装成报文。
分组交换网络,也称包交换网络
基于报文交换网络,并且其缓冲易于管理,平均时延小,平均占用缓冲区更少,易于标准化。目前流行。
按传输介质,有线,无线。
计算机网络的标准化工作及相关组织
RFC(Request For Comments); 4个阶段。
组织:ISO, ITU, IEEE
性能指标
带宽,Bandwidth,本来表示通信线路允许通过的信号频带范围,单位是Hz。计算机网络中,带宽表示网络的通信线路所能传送数据的能力,单位是比特 b/s.
时延,Delay,包括发送时延,传播时延,处理时延和排队时延。
发送时延 = 分组长度 / 信道宽度
高速链路只是减少了发送时延
传播时延 = 信道长度 / 电磁波在信道上的传播速率
时延带宽积 = 传播时延 x 信道带宽
往返时延,RTT
吞吐量,Throughput,指单位时间内通过某个网络(或信道,接口)的数据量,受网络带宽或网络额定速率的限制。
速率,speed,单位 b/s. kb, Mb, Gb
体系结构,层次和各层的协议及层间接口的集合。
协议
接口,是同一结点内相邻两层间交换信息的连接点,是一个系统的内部规定。SAP(Service Aceess Point)
服务,是垂直的,供上层调用。服务原语有 4 类:1. 请求 2. 指示 3. 响应 4. 证实
面向连接服务与无连接服务
如 TCP vs IP、UDP
可靠服务和不可靠服务
只有被高一层实体 “看得见” 的功能才能称为服务
有应答服务和无应答服务
如,文件传输服务 vs WWW服务
OSI参考模型
TCP / IP 模型
两种模型的比对
OSI参考模型在网络层支持无连接和面向连接的通信,传输层仅有面向连接
TCP/IP模型认可可靠性是端到端的问题,因此它在网际层仅有一种无连接的通信模式,但传输层支持无连接和面向连接两种模式。
学习模型
数据部分SDU - 加上控制信息PCI - PDU
基本概念
数据:传送信息的实体
信号:数据的电器或电磁表现,是数据在传输过程中的存在形式,有模拟信号和数字信号两种形式,传输方式有串行传输和并行传输两种方式。
码元,用一个固定时长的信号波形(数字脉冲)表示一位 k 进制数字,是数字通信中数字信号的计量单位。
一个数据通信系统主要划分为信源、信道和信宿三部分。
速率,单位时间内传输的数据量
码元传输速率,码元速率,波形速率
单位是波特(Baud),码元速率与进制无关
信息传输速率,信息速率,比特率
单位是比特/秒 , b/s
奈奎斯特 (Nyquist) 定理
香农定理
调制指把数据变换为模拟信号的过程;编码指把数据变换为数字信号的过程。
数字数据编码为数字信号,数字发送器
用于基带传输,
数字数据调制为模拟信号,调制器
调制方法有:
幅移键控(ASK),振幅
频移键控(FSK), 频率
相移键控(PSK),相位
正交振幅调制(QAM),ASK 与 PSK的结合
模拟数据编码为数字信号,PCM编码器
常用于对音频信号进行编码的脉码调制(PCM)。包括三个步骤:采样、量化和编码。
采样定理:
模拟数据调制为模拟信号,放大器调制器
电路交换
报文交换
分组交换
较先进,解决大报文传输的问题
面向连接的虚电路方式 和 无连接的数据报方式是分组交换的两种方式,都由网络层提供。
数据报,存储转发
虚电路
比较
双绞线
同轴电缆
组成:内导体、绝缘层、网状编织屏蔽层和塑料外层
$50\Omega$ ,传送基带数字信号,局域网和$70\Omega$传送宽带信号,有线电视系统。
光纤
无线传输介质
物理层的接口特性
本章是历年考察重点,研究的是 “点到点” 之间的通信。
主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。
为网络层提供服务
链路管理
组帧主要解决帧定界、帧同步、透明传输等问题。网络信息传输的最小单位是 帧。
流量控制、可靠传输 与 滑动窗口机制
流量控制的基本方法是由接收方控制发送方发送数据的速率,常见方式有:停止-等待协议和滑动窗口协议。
停止-等待流量控制基本原理,每次只发送一帧,然后等待反馈。
滑动窗口流量控制基本原理,
发送窗口$W_T$代表在还未收到对方确认信息的情况下发送方最多还可以发送多个数据帧。
接受窗口,控制可以 接收/抛弃 哪些数据帧,
接收窗口大小为 1 时,可保证帧的有序接受
窗口的大小在传输过程中是固定的,与 传输层的滑动窗口协议的区别
停止-等待协议:$W_T=1,W_R=1$
后退 N 帧协议:$W_T>1,W_R=1$
选择重传协议:$W_T>1,W_R>1$
可靠重传机制
数据链路层的可靠性传输通常使用确认和超时重传两种机制来完成。
确认,捎带确认
超时重传,发送方设置计时器
自动重传请求(ARQ),接收方请求出错帧。传统自动重传请求分三种:
数据链路层中流量控制和可靠传输是交织在一起的。
单帧滑动窗口 与 停止-等待协议
多帧滑动窗口 与 后退 N 帧协议(GBN)
接收方只允许按顺序接收帧;
接收端可以在连续收到好几个正确的数据帧后,才对最后一个数据帧发确认信息。
若采用 n 比特对帧编号,发送窗口大小应满足 $1\le W_T\le 2^n-1$。
多帧滑动窗口 与选择重传协议(SR)
只重传出现差错的数据帧或计时器超时的数据帧
更有效的差错处理策略,一旦接收方怀疑帧出错,就会发送一个否定帧 NAK给发送方,重传。
窗口需满足: $W_R+W_T\le 2^n \quad,W_R\le 2^{n-1}\le W_T$
接受窗口为最大值时,$W{Tmax}=W{Rmax}=2^{n-1}\quad,一般地 W_T = W_R$
MAC子层,任务是为使用介质的每个结点 隔离 来自同一信道上其它结点所传送的信号,决定广播信道中信道分配。
信道划分介质访问控制
信道划分实质就是通过分时,分频,分码等方法把原来的一条广播信道,逻辑上分为几条用于两个结点之间通信的互不干扰的子信道,实际上就是把广播信道转变为点对点信道。
随机访问介质访问控制
info
ALOHA协议, Additive Link On-line HAwaii system.
CSMA协议,载波侦听多路访问(Carrier Sense Multiple Access, CSMA)
1-坚持 CSMA
侦听到信道忙后,继续坚持侦听信道;侦听到信道空闲后,发送帧的概率为 1。
非坚持CSMA
如果信道忙,那么放弃侦听,等待一个随机的时间再继续侦听,若空闲,立即发送。
p-坚持CSMA
CSMA/CD 协议,载波侦听多路访问/碰撞检测(CSMA with Collision Detection)
CSMA/CA 协议,载波侦听多路访问/碰撞避免(CSMA with Collision Avoidance)
轮询访问介质访问控制
令牌是由一组特殊的比特组合而成的帧,只有拿到令牌的计算机才可以发送数据帧
适合负载很高的广播信道,即指多个结点在同一时刻发送数据概率很大的信道。
要熟悉局域网的各种协议.
基本概念和体系结构
特点
局域网的特性主要由三个要素决定
拓扑结构
星形、环形、总线形,星形和总线形结合的复合型
传输介质
双绞线(主流)、铜缆和光纤等
介质访问控制方式,最重要,决定技术特性
CSMA/CD、令牌总线和令牌网,前两种主用于总线形网络,令牌环主要用于环形局域网
三种特殊的局域网拓扑实现
IEEE 802
以太网 与 IEEE 802.3
Intro
以太网的传输介质与网卡
以太网的MAC帧
MAC地址,又称物理地址,长 6 字节。高24位为厂商代码。
两种标准:DIX Ethernet V2 和 IEEE 802.3
高速以太网
速率达到或超过 100Mb/s的以太网称为高速以外网
IEEE 802.11
令牌环网的基本原理
基本概念
广域网由一些结点交换机及连接这些交换机的链路组成。
PPP协议,(Point-to-Point Protocol)
面向字节
设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各主机、网桥和路由器之间简单连接的一种共同的解决方案。
三部分
PPP 帧的格式
PPP 是点对点,不是总线,无须采用CSMA/CD协议,没有最短帧一说,所以信息段占0-1500B
HDLC协议,高级数据链路控制(High-level Data Link Control, HDLC)
面向比特
基于两种配置,非平衡配置和平衡配置
3 种站类型:主站(命令帧)、从站(响应帧)和复合站(命令帧和复合帧)。
3 中数据操作方式:正常响应方式,异步平衡方式,异步响应方式
HDLC帧
网桥的概念及其基本原理
局域网交换机及其工作原理
静态路由与动态路由
常见的动态路由算法分两类:距离-向量路由算法 和 链路状态路由算法
距离-向量路由算法
链路状态路由算法
层次路由
IPv4分组
IPv4分组的格式
IP数据报分片
网络层转发分组的流程
IPv4地址与NAT
IPv4地址
主机号全为 0 表示本网络本身
主机号全为 1 表示本网络的广播地址,又称直接广播地址
127.0.0.0 保留为环路自检地址,表示任意主机本身
32位全为0, 0.0.0.0 表示本网络上的本主机
32位全为1, 255.255.255.255 表示整个 TCP/IP网络的广播地址,又称受限广播地址。由于路由器对广播域的隔离,其等效为本网络的广播地址。
A 减2,全 0 为保留地址,网络号为 127 的 IP 地址是环回测试地址
B 减1,128.0 网络号不可指派 / 65534
C 减1,192.0.0的网络不可指派 / 254
IP地址的特点
网络地址转换(NAT)
指通过将专用网络地址(如Intranet)转换为公用地址(Internet),对外隐藏内部管理的IP地址。
路由器对目的地址是私有地址的数据报一律不进行转发
专用互联网或本地互联网,私有IP地址也称为可重用地址
NAT 转换表 完成 本地地址 与 全球地址的相互转换,
通过{本地IP地址 : 端口} - {全球IP地址: 端口}
普通路由器(仅在网络层)在转发 IP 数据报时,不改变其源 IP 地址和目的地址。而NAT路由器在转发 IP 数据报时,一定要更换其IP地址。
子网划分与子网掩码、CIDR
子网划分
子网掩码
无分类域间路由选择(CIDR)
无域间路由选择是在变长子网掩码的基础上提出的一种消除传统A、B、C类网络划分,并且可以在软件的支持下实现超网构造的一种 IP 地址的划分方法。
ARP、DHCP与ICMP
IP地址与硬件地址
地址解析协议(Address Resolution Protocol, ARP)
动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)
网际控制报文协议(Internet Control Message Protocol, ICMP)
让主机或路由器报告差错和异常情况
IP 层协议
A. ICMP差错报告报文
1.终点不可达 2.源点抑制 3.时间超过 4.参数问题 5.改变路由(重定向)
B. ICMP询问报文
IPv6
路由协议
自治系统(Autonomous System, AS)
域内路由与域间路由
路由信息协议(Routing Information Protocol, RIP)
RIP 是一种分布式的基于距离向量的路由选择协议,最大优点就是简单。
开发最短路径优先(OSPF)协议
使用分布式链路状态路由算法.
边界网关协议(Border Gateway Protocol, BGP)
IP组播
移动IP
网络层设备
传输层的功能
传输层的寻址与端口
端口是传输层的服务访问点(TSAP),标识主机应用进程,类似于 IP 和 MAC地址
是软件端口,区别与路由器或交换机上的硬件端口
端口号,长16 bite, 标识 65536个不同端口号
服务端使用的端口号
熟知端口号,0 - 1023,IANA(互联网地址指派机构)指派给 TCP/IP 最重要的应用程序
登记端口,1024 - 49151,使用这类端口必须在 IANA登记,以防止重复
客户端使用的端口号,49152 - 65535,又称短暂端口号(临时端口号)
套接字
无连接服务和面向连接服务
TCP 不提供广播和组播服务;增加了开销(确认、流量控制、计时器及连接管理);主适用于可靠性更高德场合,如文件传输协议(FTP),超文本传输协议(HTTP),远程登录(TELNET)
UDP
UDP 在 IP 之上仅提供两个附加服务:多路复用 和 对数据的错误检查
简单,执行速度快,实时性好
UDP 数据报
UDP 校验
特点
TCP报文段
TCP 连接管理
tips
TCP 连接的建立,3 次握手
TCP 连接的释放,4 次握手
TCP 可靠传输
TCP 流量控制
TCP 拥塞控制
与流量控制的异同
4 种算法:
慢开始和拥塞避免
慢开始算法
cwnd初始为1个MSS, 每经过一个 RTT ,拥塞窗口 cwnd 就会加倍,增大道一个规定的慢开始门限 ssthresh (阈值),然后改用拥塞避免算法
拥塞避免算法
每经过一个 RTT,拥塞窗口 cwnd 就会增加 一个 MSS,不再是加倍,线性增长,当出现一次超时(网络拥塞),令慢开始门限 ssthresh 等于当前 cwnd 的一般
根据 cwnd 的大小 执行不同的算法
网络拥塞的处理
只要发送方检测到 超时时间的发生, ssthresh 就设置为出现拥塞时 cwnd 值得一半,cwnd 重新设置为 1,执行慢开始算法。
若 2cwnd > ssthresh, 则下一个 RTT 的 cwnd 等于 ssthresh。即慢开始阶段 cwnd 不能超过 ssthresh值
不能完全避免拥塞
“乘法减小” 和 ‘“加法增大’
快重传和快恢复,是对上面方法的改进
传重传
快恢复
原理:发送端收到连续三个冗余 ACK(即重复确认)时,执行 “乘法减小”算法,把慢开始门限 ssthresh 设置为出现拥塞时发送方 cwnd 的一半,与慢开始不同,它把 cwnd 设置为慢开始门限 ssthrsh 改变后的数值而不是 1(因此成为快恢复).然后执行拥塞避免算法(“加法增大”)
当发送方检测到超时的时候,就采用慢开始和拥塞避免,当发送方接受到冗余 ACK 时,就采用快重传和快恢复。
客户/服务器模型
常见应用包括Web、文件传输协议(FTP)、远程登录和电子邮件
P2P模型
Intro
层次域名空间
采用层次树结构的命名方法,
任何一个连接到因特网的主机或路由器,都有一个唯一的层次结构名称,即域名(Domain Name),其中域是名字空间中一个可被管理的划分,每个域名都有标号序列组成,标号之间用点 “.” 隔开。
每个域由不同的组织进行管理,每个组织都可以将它的域再分成一定数目的子域,并将这些子域委托给其他组织去管理
tips
顶级域名(Top Level Domain, TLD)
国家顶级域名(nTLD)
通用顶级域名(gTLD)
.com-公司;.net-网络服务机构;.org-非营利性组织;.gov-美国政府部门
基础结构域名,仅一个,即arpa, 用于反向域名解析,又称反向域名
域名服务器
Intro
4 种类型的域名服务器
根域名服务器
顶级域名服务器
授权域名服务器(权限域名服务器)
本地域名服务器
域名解析过程
Intro
两种方式
递归查询,会造成根域名服务器负载过大,几乎不用
递归和迭代相结合的查询
FTP 的工作原理
控制连接(端口 21)与数据连接(端口 20)
电子邮件系统的组成结构
三个最主要的构建:用户代理(User Agent)、邮件服务器、电子邮件使用的协议(SMTP、POP3或 IMAP)
邮件服务器
电子邮件格式与MIME
SMTP 和 POP3
WWW的概念与组成结构
万维网(World Wide Web, WWW)是一个资料空间
超文本标记语言(HyperText Markup Language, HTML)
万维网的内核部分是由三个标准构成的
统一资源定位符(URL)
负责标识万维网上的各种文档
一般形式 <协议>://<主机>:<端口>/<路径>
HTTP,应用层协议,TCP
HTML,一种文档结构的标记语言
万维网是无数个网络站点和网页的集合
超文本传输协议(HTTP)
Intro
HTTP 的操作过程
HTTP 的特点
HTTP使用的 TCP是面向连接的,但 HTTP本身是无连接的
持久连接,(HTTP/1.1 支持)
HTTP的报文结构
Reference
book
经验贴
参考book
基础级
中文题目只涉及初级编程分5个段位
青铜
理解并掌握简单数据类型及表达式、程序的顺序执行结构和简单分支结构。具备使用一门编程语言进行简单的计算、基本的格式化输入输出以及解决简单分支问题的能力。
白银
在达到青铜段位要求的基础上,理解并掌握程序的循环结构。具备编程解决复杂嵌套分支和嵌套循环问题的能力。
黄金
在达到白银段位要求的基础上, 理解并掌握数组(包括高维数组和字符串)和结构体等概念,具备编程解决相关问题的能力。
白金
在达到黄金段位要求的基础上,理解并掌握函数和递归的概念,具备使用函数和递归解决较为复杂的综合性问题的能力,并掌握一定的调试技巧。
钻石
在达到白金段位要求的基础上,掌握简单排序、二分查找算法,具备解决较为复杂的综合性问题的能力,能够编写并调试代码量超过50行的程序。
乙级
中文题目只涉及基础编程最难到排序算法
考生应具备以下基本能力:
1. 基本的C/C++的代码设计能力,以及相关开发环境的基本调试技巧; 2. 理解并掌握最基本的数据存储结构,即:数组、链表; 3. 理解并熟练编程实现与基本数据结构相关的基础算法,包括递归、排序、查找等; 4. 能够分析算法的时间复杂度、空间复杂度和算法稳定性; 5. 具备问题抽象和建模的初步能力,并能够用所学方法解决实际问题。
甲级
英文题目涉及基础数据结构
在达到乙级要求的基础上,还要求:
1. 具有充分的英文阅读理解能力; 2. 理解并掌握基础数据结构,包括:线性表、树、图; 3. 理解并熟练编程实现经典高级算法,包括哈希映射、并查集、最短路径、拓扑排序、关键路径、贪心、深度优先搜索、广度优先搜索、回溯剪枝等; 4. 具备较强的问题抽象和建模能力,能实现对复杂实际问题的模拟求解。
国际竞赛水平相当涉及高级数据结构与经典算法的应用
在达到甲级要求的基础上,还要求:
1. 对高级、复杂数据结构掌握其用法并能够熟练使用,如后缀数组、树状数组、线段树、Treap、静态KDTree等; 2. 能够利用经典算法思想解决较难的算法问题,如动态规划、计算几何、图论高级应用(包括最大流/最小割,强连通分支、最近公共祖先、最小生成树、欧拉序列)等,并灵活运用; 3. 能够解决复杂的模拟问题,编写并调试代码量较大的程序; 4. 具有缜密的科学思维,考虑问题周全,能够正确应对复杂问题的边界情况。
PAT
《算法导论》
学会C++
数据结构我大概学了这几块:
线性结构:数组,栈,队列看一下就过了;链表自己实现了一遍;常见排序理解并会写。
树:二叉搜索树熟练(尤其是各种遍历);AVL树和红黑树尽力理解了一下,我是真的记不住……
图:BFS, DFS, 最短路(dijkstra, spfa, floyd)。这里的题目最常见,要能写得很灵活。
其它:堆,背包问题(良心教程https://github.com/tianyicui/pack/blob/master/V2.pdf),贪心问题, KMP(还没遇到过题目)。