绪论
图灵模型
数据处理器
数据处理模型:
定义太广泛,没有说清楚可以处理的类型和数量
可编程数据处理器
基于图灵模型的计算机:可编程数据处理器
程序用来告诉计算机对数据进行处理的指令集合
输出数据依赖输入数据和程序两方面因素的结合作用
1、相同的程序、不同的输入数据
2、相同的输入数据、不同的程序
3、相同的程序、相同的输入数据
通用图灵机
能做任何可计算的运算
冯·诺伊曼模型
4个子系统
存储器:存储数据和程序
算术逻辑单元:进行数字计算和逻辑运算的地方
控制单元:对存储器、算术逻辑单元、输入/输出等子系统进行控制操作的单元
输入/输出:输入负责从计算机外部接收输入数据和程序;输出负责将计算机处理的结果输出到计算机外部
存储的程序
完成某一任务的程序通过操作一系列开关或改变其配线来实现,程序及其响应数据以位模式(0和1序列)存储在内存中
指令的顺序执行
一条接着一条指令按顺序执行
计算机组成
3大部分:计算机硬件、数据和计算机软件
计算机硬件
基于冯·诺伊曼模型
数据
存储数据
冯·诺伊曼模型没有定义数据应如何存储在计算机中,不同类型的数据按照不同的方式以0和1序列的二进制形式存储在计算机内部
组织数据
数据只能以一种形式(位模式)存储在计算机内部,在计算机外部可表现为不同形式,数据被组织成许多小的单元,再由这些小的单元组成更大的单元,有效地将数据组织成不同的实体和格式
计算机软件
必须存储程序
内存中需要存放数据和程序
指令的序列
程序必须是有序的指令集,每条指令操作一个或多个数据项,每个程序可以是不同指令的不同组合
算法
按照步骤解决问题的方法
语言
机器语言→计算机语言
软件工程
结构化程序的设计和编写,描述完成某一任务的应用程序,以及程序设计中所严格遵循原理和规则
操作系统
有一系列指令对所有程序来说是公用的,为程序访问计算机部件提供方便的一种管理程序等
历史
机械计算机器
17世纪:布莱斯·帕斯卡发明加减运算计算机器Pascsline
20世纪:尼克劳斯·沃思发明结构化程序设计语言Pascal
17世纪后期:戈特弗里德·莱布尼茨发明能乘除运算又能加减运算的计算机器莱布尼茨之轮
19世纪初期:约瑟夫-玛丽·雅卡尔发明利用存储和编程概念的机器提花织机,利用穿孔卡来控制
1823年:查尔斯·巴比奇发明查分引擎进行简单数学运算和解多项式方程以及分析引擎
1890年:赫尔曼·何勒里斯设计并制作有编程能力的机器,可以自动阅读、计数和排列存储在穿孔卡上的数据
电子计算机的诞生
早期的电子计算机
所有计算机在外部进行编程
ABC:实现解决线性方程的系统,完成特定任务的计算机,通过将信息进行电子编码
ZI:通用的计算机
Mark I:巨型计算机,使用电子部件和机械部件
巨人:破译德国Enigma密码
ENIAC:第一台通用的、完全电子的计算机
基于冯·诺伊曼模型的计算机
之前的存储单元仅存储数据,利用配线或开关进行外部编程
EDVAC:第一台基于冯氏思想的计算机
EDSAC:与EDVAC同时以及同类型
计算机的诞生
1950年以后基本都基于冯·诺伊曼模型
第一代计算机
以商用计算机出现为主要特征,体积庞大,使用真空管作为电子开关,大机构
第二代计算机
晶体管代替真空管,缩小了体积,节省了开支,中小型企业
第三代计算机
集成电路(晶体管、导线以及其他部件做在一块单芯片上)出现,减小了成本和大小,小型计算机,软件行业诞生
第四代计算机
微型计算机以及计算机网络出现
第五代计算机
掌上电脑和台式电脑诞生,第二代存储媒体(CD-ROM、DVD)等改进、多媒体应用以及虚拟现实现象
社会问题和道德问题
社会问题
依赖
随着科技发展,人们对于计算机的依赖逐渐增大
社会公正
不是所有人都能拥有一台计算机或能支付起上网费用
数字化分裂
包括依赖和社会公正,将社会分裂成两组群:以电子形式联系在一起的人和没有以电子形式联系在一起的人
道德问题
隐私
通信的私密性通过网络安全来保证,费用和努力较大
版权
电子版权问题,谁有权拥有数据
计算机犯罪
盗取金钱以及病毒
计算机科学作为一门学科
分为系统领域和应用领域
系统领域:涵盖与硬件和软件构成直接相关的领域
应用领域:涵盖与计算机使用有关的领域
关键术语
algorithm(算法)
data processor(数据处理器)
Arithmetic Logic Unit,ALU(算术逻辑单元)
digital divide(数字化分裂)
computer languages(计算机语言)
input data(输入数据)
control unit(控制单元)
instruction(指令)
integrated circuit(集成电路)
program(程序)
memory(存储器)
software engineering(软件工程)
operating system(操作系统)
Turing model(图灵模型)
output data(输出数据)
von Neumann model(冯·诺伊曼模型)
数字系统
数字系统(或数码系统)定义了如何用独特的符号表示一个数字,不同系统中数字的表示方法不同,分为位置化系统和非位置化系统
位置化数字系统
符号所占位置决定表示的值
表示方法为:
S是一套符号集;b是底(或基数),等于S符号集中的符号总数,下标表示该符号的位置,b的幂可以从一个方向由0到k-1,还可以从另一个方向由-1到-l,b的非负数幂与该数字的整数部分有关,负数幂与该数字的小数部分有关,±符号表示数字可正可负
十进制系统(以10位底)
b = 10 并且用10个符号表示一个数,符号集S = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},该系统中符号称作十进制数码或仅为数码
计算机存储正负数的方式不同
数字表示为:
为渐变通常省略圆括号、底和正号(对于正数)
整数
实数
带有小数部分的数字
实数表示为:
b=10是底,k是整数部分数码的数量,l是小数部分数码的数量,十进制小数点用于分割整数部分和小数部分
二进制系统(以2为底)
底b=2并且用两个符号来表示一个数,即S={0, 1},该系统符号称为二进制数码或位(位数码)
整数
实数
可带有小数部分的数字
实数表示为:
b=2是底,k是整数部分数码的数量,l是小数部分数码的数量,二进制小数点用于分割整数部分和小数部分
十六进制系统(以16为底)
b=16并且用16个符号来表示一个数,字符集S={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F},该系统中符号称为十六进制数码
整数
实数
可带有小数部分的数字
实数表示为:
b=16是底,k是整数部分数码的数量,l是小数部分数码的数量,十六进制小数点用于分割整数部分和小数部分
八进制系统(以8为底)
b=8并且用8个符号来表示一个数,字符集S={0, 1, 2, 3, 4, 5, 6, 7},该系统中符号称为八进制数码
整数
实数
可带有小数部分的数字
实数表示为:
b=8是底,k是整数部分数码的数量,l是小数部分数码的数量,八进制小数点用于分割整数部分和小数部分
4种位置化系统小结
系统 | 底 | 符号 |
---|---|---|
十进制 | 10 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 |
二进制 | 2 | 0, 1 |
八进制 | 8 | 0, 1, 2, 3, 4, 5, 6, 7 |
十六进制 | 16 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F |
4种位置化系统中的数字比较
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
转换
其他进制到十进制的转换
将数码乘以其在源系统中的位置量并求和便得到十进制数
十进制到其他进制的转换
需要两个过程:整数部分和小数部分
整数部分的转换
使用连除,称十进制数的整数部分为源,已转换好的整数部分数数为目标
小数部分的转换
数码的数量
把数字从十进制数转换成其他进制前,需要知道数码的数量,通过关系可以得到整数数码的数量,N是该整数的十进制值
二进制-十六进制的转换
二进制-八进制的转换
八进制-十六进制的转换
使用二进制系统作为中介系统
从八进制转到十六进制,先将八进制转到二进制,将位数重排成4位一组,找到十六进制的对等值
从十六进制转到八进制,先将十六进制转到二进制,将位数重排成3位一组,找到八进制的对等值
目标系统中所需用到的数码的最小数量计算方法
设以
非位置化数字系统
每个符号有一个值,符号所占用的位置通常与值无关,每个符号的值时固定的
数字表示为:
罗马数字系统
符号 | I | V | X | L | C | D | M |
值 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
遵循特定的规则:
- 当一个带有较小值的符号位于一个带有较大同等值或者较大值的符号的后面,这些值相加
- 当一个带有较小值的符号位于一个带有较大值的符号的前面,用大值减小值
- 如果S1≤10×S2,则符号S1不能出现在符号S2之前
- 对于大数字,在6种符号(除I以外的所有符号)中的任意一个上方加横杠表示乘以1000
关键术语
base(底)
bit(位)
binary digit(二进制数码)
decimal digit(十进制数码)
binary system(二进制系统)
decimal system(十进制系统)
hexadecimal digit(十六进制数码)
octal system(八进制系统)
hexadecimal system(十六进制系统)
place value(位置量)
integer(整数)
positional number system(位置化数字系统)
nonpositional number system(非位置化数字系统)
radix(基数)
number system(数字系统)
real(实数)
octal digit(八进制数码)
Roman number system(罗马数字系统)
数据存储
数据类型
计算机内部的数据
位
存储在计算机中的最小单位;是0或1
位模式
表示数据的不同类型,是一个序列,有时称为位流,通常长度为8的位模式被称为1个字节,有时用字这个术语来代表更长的位模式
属于不同数据类型的数据可以以同样的模式存储于内存中
数据压缩
减少内存空间占用
错误检测和纠正
存储数字
存储整数
可被当做小数点位置固定的数字:小数点固定在最右边,定点表示法用于存储整数,小数点是假定的,并不存储,用户(程序)可能将整数作为小数部分为0的实数存储,无符号和有符号整数在计算机中存储方式不同
存储无符号整数
- 将整数变为二进制数
- 如果二进制位数不足n位,则在二进制整数的左边补0,是使它的总位数为n位,如果位数大于n,该整数无法存储,导致溢出的情况发生
译解无符号整数
输出设备译解内存中位模式的位串并转换为一个十进制的无符号整数
溢出
无符号整数的应用
提高存储效率,不用存储整数符号,所有分配的位单元都可用来存储数字
- 计数
- 寻址,地址都是从0开始
- 为其他数据类型排序
符号加绝对值表示法
用于在计算机中存储部分实数
使用第一位(最高位)来表示符号:0表示正数、1表示复数,剩余的位表示这个数的绝对值,最大正数值时无符号最大数的一半,n位单元可存储的数字范围为:
符号加绝对值表示法中有两个0,+0和-0
符号加绝对值表示法的溢出
符号加绝对值表示法的应用
用于存储部分实数以及采集模拟信号
二进制补码表示法
存储位于n位存储单元中的有符号整数,首位(最左位)决定符号,最左位为0,表示该整数非负,最左位为1,表示该整数为负数
两种运算
反码(取一个整数的反码)
反转各个位
补码(取一个整数的补码)
首先,从右边复制位,直到有1被赋值;接着,反转其余的位
对该数进行1次反码运算再加上1
以二进制补码格式存储整数
- 将整数变为n为二进制数
- 如果整数是正数或零,以其原样存储;如果是负数,计算机取其补码存储
从二进制补码格式还原整数
- 如果最左位是1,计算机取其补码,如果最左位是0,计算机不进行操作
- 计算机将该整数转换成十进制
二进制补码表示法仅有一个0
二进制补码表示法的溢出
二进制补码表示法的应用
用于存储整数的标准表示法
3种系统的比较
存储单元的内容 | 无符号 | 符号加绝对值 | 二进制补码 |
---|---|---|---|
0000 | 0 | 0 | +0 |
0001 | 1 | 1 | +1 |
0010 | 2 | 2 | +2 |
0011 | 3 | 3 | +3 |
0100 | 4 | 4 | +4 |
0101 | 5 | 5 | +5 |
0110 | 6 | 6 | +6 |
0111 | 7 | 7 | +7 |
1000 | 8 | -0 | -8 |
1001 | 9 | -1 | -7 |
1010 | 10 | -2 | -6 |
1011 | 11 | -3 | -5 |
1100 | 12 | -4 | -4 |
1101 | 13 | -5 | -3 |
1110 | 14 | -6 | -2 |
1111 | 15 | -7 | -1 |
存储实数
带有整数部分和小数部分的数字
浮点表示法
维持正确度或精度,允许小数点浮动,可在小数点左右有不同数量的数码,极大地增加了可存储的实数范围,由3部分组成:符号、位移量和定点数
符号可正可负,位移量显示小数点应该左右移动构成实际数字的位移量,定点数是小数点位置固定的定点表示法
用于表示很小或很大的十进制数,在称作科学记数法的表示法中,定点部分在小数点左边只有1个数码而且位移量是10的幂次
规范化
科学记数法(用于十进制)和浮点表示法(用于二进制)都在小数点左边使用了唯一的非零数码,称为规范化
- 十进制 → ± d.xxxxxxxxxxxxxx d是1到9,每个x是0到9
- 二进制 → ± 1.yyyyyyyyyyyyyy 每个y是0或1
符号、指数和尾数
二进制规范化后,只存储了符号、指数和尾数(小数点右边的位)三部分
小数点和定点部分左边的位1并没有存储,是隐含的
符号
用一个二进制位来存储(0或1)
指数
小数点移动的位数,采用余码表示法
尾数
小数点右边的二进制数,定义了该数的精度,作为无符号整数存储,在尾数中如果在数字的右边插入多余的零,这个值会改变
尾数是带符号的小数部分,像以符号加绝对值表示法存储的整数那样对待
余码系统
指数是有符号的数,正的和负的整数都可以作为无符号数存储,为表示正的或负的整数,将正整数(称为一个偏移量)添加到每个数字中,将它们统一移到非负的一边,余码系统中所有整数都是正数
IEEE标准
定义了几种存储浮点数的标准,最常用的两个为:单精度和双精度
单精度
用64位来存储一个浮点表示法的实数,符号位占用1位(0为正,1为负),指数占用11位(使用偏移量1023),尾数使用52位
IEEE标准浮点数的存储
- 在S中存储符号(0或1)
- 将数字转换为二进制
- 规范化
- 找到E和M的值
- 连接S,E和M
将存储为IEEE标准浮点格式的数字还原
- 找到S、E和M的值
- 如果S=0,将符号设为正号,否则设为负号
- 找到位移量(E-127)
- 对尾数去规范化
- 将去规范化的数字变为十进制以求出绝对值
- 加上符号
上溢和下溢
存储零
符号、指数和尾数都设置为0
截断误差
原始数字与还原后数字的差异
存储文本
文本的片段是用来表示该语言中某个意思的一系列符号
符号数量和位模式长度的关系
符号数量 | 位模式长度 |
---|---|
2 | 1 |
4 | 2 |
8 | 3 |
16 | 4 |
128 | 7 |
256 | 8 |
65536 | 16 |
4294967296 | 32 |
不同位模式集合被设计用于表示文本符号,每个集合称为代码,表示符号的过程称为编码
常用代码
ASCII
美国信息交换标准码,使用7位表示每个符号,可定义128种不同符号
Unicode
使用32位,表示最大达4294967296个符号,代码不同部分被分配用于表示来自世界上不同语言的符号
其他编码
存储音频
文本由可数的实体(文字)组成,是数字数据
音频是不可数的,随时间变化的实体,是模拟数据
采样
不能记录一段间隔音频信号的所有值,可以记录其中一些值,选择数量有限的点来度量它们的值并记录
采样率
样本数量依赖于模拟信号中变化的最大数量
量化
将样本的值截取为最接近的整数值的一种过程
编码
量化的样本值编码为位模式
一些用无符号整数表示,一些用有符号整数表示,可以使用符号加绝对值来表示
每样本位
每个样本系统分配多少位,有时称为位深度
位率
每样本位数量为B,每秒样本数为S,每秒需要音频存储S×B位,也称为位率R
声音编码标准
当今主流标准是MP3,是一种有损压缩法
存储图像
两种技术:光栅图或矢量图
光栅图(位图)
图像是模拟数据,数据密度(色彩)因空间而变化,采样被称作扫描,样本称为像素
解析度
每英寸的方块或线条记录的像素数,扫描率称为解析度
色彩深度
表现像素的位的数量,依赖于像素颜色是如何由不同编码技术来处理
真彩色
像素编码的技术之一,用24位来编码,每个三原色(RGB)表示为8位,每种颜色都由0到255之间的三位数字表示
颜色 | 红 | 黄 | 蓝 |
---|---|---|---|
黑色 | 0 | 0 | 0 |
红色 | 255 | 0 | 0 |
绿色 | 0 | 255 | 0 |
蓝色 | 0 | 0 | 255 |
黄色 | 255 | 255 | 0 |
青色 | 0 | 255 | 255 |
洋红色 | 255 | 0 | 255 |
白色 | 255 | 255 | 255 |
索引色(调色板色)
每个应用程序从大的色彩集中选择一些颜色并对其建立索引,对选中的颜色赋值
图像编码标准
JPEG(联合图像专家组)使用真彩色模式,通过压缩图像来减少位数,GIF(图像交换格式)使用索引色模式
矢量图(几何模型或面向对象图形)
不存储每个图像的位模式,一个图像被分解成几何图形的组合,每个几何图形由数学公式表达
存储视频
图像在时间上的表示(称为帧),随空间(单个图像)和时间(一系列图像)变化的信息表现
关键术语
- ANSI(美国国家标准协会)
- one's complement representation(二进制反码表示法)
- ASCII(美国信息交换标准码)
- overflow(溢出/上溢)
- analog(模拟)
- palette color(调色板色)
- audio(音频)
- pixel(像素)
- binary digit(二进制数码)
- bit(位)
- quantization(量化)
- bit depth(位深度)
- raster graphic(光栅图)
- bit pattern(位模式)
- real(实数)
- bit rate(位率)
- resolution(解析度)
- bitmap graphic(位图)
- RGB(三原色)
- byte(字节)
- sampling(采样)
- code(代码)
- scanning(扫描)
- digital(数字的)
- color depth(色彩深度)
- sign-and-magnitude representation(符号加绝对值表示法)
- encoding(编码)
- text(文本)
- Excess representation(余码表示法)
- Excess_1023(余1023码)
- True-Color(真彩色)
- Excess_127(余127码)
- truncation error(截断误差)
- fix-point representation(定点表示法)
- two's complement representation(二进制补码表示法)
- floating-point representation(浮点表示法)
- GIF(图形交换格式)
- underflow(下溢)
- indexed color(索引色)
- unicode(统一编码)
- JPEG(联合图像专家组)
- unsigned integer(无符号整数)
- mantissa(尾数)
- vector graphic(矢量图)
- MP3(MPEG第三代音频压缩格式)
- video(视频)
- MPEG(运动图像专家组)
- word(字)
- normalization(规范化)
数据运算
逻辑运算
应用于模式中的一个二进制位,或在两个模式中相应的两个二进制位的相同基本运算,可以在位层次上和模式层次上定义逻辑运算
位层次上的逻辑运算
应用布尔代数定义的运算操纵二进制位
4中位层次上的运算:非(NOT)、与(AND)、或(OR)和异或(XOR)
非(NOT)
一元操作符,输入0时输出1;输入1时输出0
与(AND)
二元运算符,如果两个输入都是1,则输出1;否则,输出0,只要输入中有一位是0,则不需要检查其他输入,结果必为0
或(OR)
二元运算符,如果两个输入都是0,则输出0;否则,输出1,只要输入中有一位是1,则不需要检查其他输入,结果必为1,有时被称为包含或运算符
异或(XOR)
二元运算符,如果两个输入相同,则输出0;否则,输出1,如果其中一个输入为1,结果就是与其他输入相应位相反
x XOR 1 等价于 NOT x
x XOR 0 等价于 x
模式层次上的逻辑运算
求反
对整个模式求反
使指定的位复位
把一个位模式的指定为复位(置0),利用第二个输入(掩码)来实现,掩码设置为:将需要复位的位置0其余位1,使模式与掩码进行与操作
对指定的位置位
把一个位模式的指定为置位(置1),利用第二个输入(掩码)来实现,掩码设置为:将需要置位的位置1其余位0,使模式与掩码进行或操作
对指定的位反转
把一个位模式的指定为反转,利用第二个输入(掩码)来实现,掩码设置为:将需要反转的位置1其余位0,使模式与掩码进行异或操作
移位运算
移动模式中的位,改变位的位置,可分为逻辑移位运算和算数以为运算
逻辑移位运算
应用于不带符号的数的模式
逻辑移位
逻辑右移把每一位向右移动一个位置,最右位被丢弃,最左位填0;逻辑左移把每一位向左移动一个位置,最左位被丢弃,最右位填0
循环移位(旋转运算)
对位进行移位,没有位丢弃或增加,循环右移把每一位向右移动一个位置,最右位被回环,称、成为最左位;循环左移把每一位向左移动一个位置,最左位被回环,成为最右位
算术移位运算
假定用二进制补码格式来表示带符号的整数
算术右移相当于对整数除以2;算术左移相当于对整数乘以2,不改变符号位
算术右移保留符号位,同时复制,放入相邻的右边的位中;算术左移丢弃符号位,接受它右边的位作为符号位,如果新的符号位与原先相同,则运算成功,否则发生上溢或下溢
算术运算
加、减、乘、除等
整数的算数运算
二进制补码整数的加减法
A - B = A + (B的补码)
符号加绝对值整数的加减法
- 检查运算,如果运算是减法,那么改变第二个整数的符号
- 对两符号应用XOR运算,如果结果(存储在临时单元S中)是0,则符号是相同的
- 如果符号是相同的,
M指的是绝对值,S指的是符号,想加两个绝对值时,可能会发生上溢,必须报告,处理过终止 - 如果符号不同,,不存在上溢,结果是负数,取结果的二进制补,使结果的符号取B的符号
实数的算术运算
- 如果两数(A或B)中任一个为0,那么令结果为0,过程终止
- 如果运算时减法,那么改变第二个数(B)的符号来模拟加法
- 通过在尾数中包含隐含的1和增加指数,将两个数取规范化
- 然后统一指数,增加减小的指数,移位相应的尾数,知道两个数具有相同的指数
- 把每个数的符号和尾数的组合看成一个符号加绝对值格式的整数
- 再次规范化数
关键术语
- AND operation(与运算)
- arithmetic operation(算术运算)
- arithmetic shift operation(算术移位运算)
- Boolean algebra(布尔代数)
- circular shift operation(循环移位运算)
- logic operation(逻辑运算)
- logical shift operation(逻辑移位运算)
- mask(掩码)
- NOT operation(非运算)
- OR operation(或运算)
- rotate operation(旋转运算)
- set(置位)
- truth table(真值表)
- unset(复位)
- XOR operation(异或运算)
计算机组成
计算机组成部件分为三大类(或子系统):中央处理单元(CPU)、主存储器和输入/输出子系统
中央处理单元(CPU)
用于数据的运算,大多数体系结构中有三个组成部分:算术逻辑单元(ALU)、控制单元和寄存器组(快速存储单元)
算术逻辑单元(ALU)
对数据进行逻辑、移位和算术运算
逻辑运算
与、或、非和异或,输入和输出都是二进制位模式
移位运算
包括逻辑移位运算和算术移位运算
逻辑移位运算:对二进制位模式进行向左或右的移位
逻辑算术移位运算:应用于整数,用2除或乘一个整数
算术运算
寄存器
临时存放数据的高速独立的存储单元
数据寄存器
保存运算的中间结果,被命名位R1到Rn
指令寄存器
存放内存中取出的指令
程序计数器
通用寄存器,保存当前正在执行的指令
控制单元
控制各个子系统的操作,通过从控制单元发送到其他子系统的信号来进行控制
主存储器
存储单元的集合,每个存储单元都有一个唯一的标识地址,数据以称为字的位组的形式在内存中传入和传出,字可以是8位、16位、32位,甚至有的时候是64位,8位一般称为一个字节
地址空间
所有在存储器中标识的独立的地址单元的总数称为地址空间
单位 | 字节数的准确值 | 近似值 |
---|---|---|
千字节 | 2^10(1024)字节 | 10³字节 |
兆字节 | 2^20(1048576)字节 | 10^6字节 |
千兆字节 | 2^30(1073741824)字节 | 10^9字节 |
兆兆字节 | 2^40字节 | 10^12字节 |
作为位模式的地址,以位模式存储数
地址用无符号整数表示(不用负的地址),起始地址通常是0000 0000 0000 0000(地址0),最后一个地址通常是1111 1111 1111 1111(65535),通常如果一个计算机有N个字的存储空间,就需要有log2(N)位的无符号整数确定每一个存储单元
存储器类型
RAM和ROM
随机存取存储器RAM
计算机主存的主要组成部分,可以使用存储单元地址来存取一个数据项,不需要存取位于它前面的所有数据项,具有易失性,当计算机断电后,存储在RAM中的信息将被删除,RAM可以分为SRAM和DRAM
静态SRAM
用传统的触发器门电路(有0和1两个状态的门)来保存数据,通电时数据始终存在,不需要刷新,速度快,价格贵
动态DRAM
使用电容器,电容器充电时,状态为1,放电时,状态为0,内存单元需要周期性刷新,速度慢,价格便宜
只读存储器ROM
由制造商写入,用户只能读不能写,特点时非易失性,电源断电后数据不会丢失,用来存储关机后也不能丢失的程序或数据
可编程只读存储器PROM
发货时时空白的,可以借助特殊的设备将程序存储在上面,程序存储后不能重写,用户用它来存储一些特定的程序
可擦除的可编程只读存储器EPROM
可对他编程,但需要用一种可以发出紫外光的特殊一起来对其进行擦写,需要拆下来擦除在重新安装
电可擦除可编程只读存储器EEPROM
编程和擦除用电子脉冲,无需从计算机上拆下来
存储器的层次结构
高速缓冲存储器
速度比主存快,比CPU及其内部的寄存器慢,容量小,通常置于主存和CPU之间,任何时间都含有主存中一部分内容的副本,存取一个字的过程为:
- CPU检查高速缓存
- 如果要存取的字存在,CPU复制;否则,CPU从主存中拷贝一份从需要读取的字开始的数据块,该数据块覆盖高速缓存中内容
- CPU存取高速缓冲存储器并拷贝该字
输入输出子系统
分为非存储设备和存储设备
非存储设备
使CPU/内存可以和外界通信,但不能存储信息
键盘和监视器
键盘:输入功能
监视器:显示输出并同时响应键盘输入
打印机
产生永久记录的输出设备
存储设备(辅助存储设备)
分为磁介质和光介质两种
磁介质存储设备
使用磁性存储位数据,有磁性表示1,无磁性表示0
磁盘
由一张一张的磁片叠加而成,由薄磁膜封装起来,信息通过盘上每一个磁片的读/写磁头读写磁介质表面进行存取
- 表面结构
每个盘面被划分为磁道,每个磁道分成若干扇区,磁道间通过磁道内部间隔隔开,扇区之间通过扇区内部间隔隔开 - 数据存取
数据项可以随机存取,某一时间可以读取的最小存储区域只能是一个扇区,数据块可以存储在一个或多个扇区上 - 性能
最重要的取决因素有:角速度、寻道时间和传送时间
角速度:磁盘的旋转速度
寻道时间:读/写磁头寻找数据所在磁道的时间
传送时间:将数据从磁盘移到CPU/内存所需的时间
磁带
大小不一,最普通的一种用厚磁膜封装的半英寸塑料磁带,通过磁头读写磁带上的数据
- 表面结构
磁带宽度可分为9个磁道;磁道每个点可分为存储1位的信息,垂直切面的9个点可存8位(即一个字节)的信息,还有1位用作错误检测 - 数据存取
顺序存取设备,磁带表面可能分若干块,没有寻址装置读取每个块,读取指定块需要按顺序通过其前面所有块 - 性能
速度比磁盘慢
光存储设备
使用光(激光)技术存取数据,设备有诸如:只读光盘(CD-ROM)、可刻录光盘(CD-R)、可重写光盘(CD-RW)、数字多功能光盘(DVD)
只读光盘(CD-ROM)
使用与CD(光盘)相同的技术,区别是增强程度不同,CD-ROM更健壮,纠错能力强
- 制造
a. 使用高能红外激光在塑料涂层上刻写位模式来制造主盘,使位模式变成一系列坑和纹间表面,坑通常表示0,纹间表面通常表示1;另一种方法是将过度部分表示1,非过度表示0
b. 依照主盘做成相应模盘,坑由凸起代替
c. 溶解的聚碳酸酯树脂注入到模盘中产生像主盘一样的坑,同时把一层非常薄的铝加到聚碳酸酯树脂上,在反射表面的上面加一层保护漆和标签 - 读
依靠计算机光驱的低能激光束读取信息,装在驱动器上的感应器对某个点是纹间表面时,应探测多一些的光信号,反之是坑时少一点,才能读出记录在原始主盘上的信息 - 格式
a. 使用汉明码的纠错技术将8位数据块转换成14位符号
b. 一个帧由42个符号组成(14位/符号)
c. 一个扇区由96个帧组成(2352个位) - 速度
- 应用
可刻录光盘(CD-R)
可以让用户自己制作一张或更多盘片,只需要一次写入信息就可以多次读取
- 制造
a. 不需要主盘或模盘
b. 反射层材料用金取代铝
c. 盘片聚碳酸酯树脂没有坑,盘片的坑和纹间表面时模拟出来的
d. 由刻录机所产生的高能激光束在染料层上烧制深色的点,用来模拟坑,没有被激光所照射的区域是纹间表面 - 读
可以由CD-ROM驱动器和CD-R驱动器读取 - 格式和速度
和CD-ROM相同 - 应用
可重写光盘(CD-RW)
- 制造
和可刻录光盘的原理相同,不同之处为:
a. 使用银、锢、锑和碲的合金,有两种稳定状态:晶体态和无定型态
b. 驱动器使用高能激光束在合金上创建模拟的坑 - 读
与CD-ROM和CD-R一样 - 擦除
使用中等能量的激光束将坑变成纹间表面,将该点从武定型态变为晶体态 - 格式和速度
与CD-ROM相同 - 应用
数字多功能光盘(DVD)
- 制造
a. 坑更小
b. 磁道间更紧密
c. 激光束用红激光代替红外激光
d. 使用1到2个存储层,可以是单面或双面 - 容量
- 压缩
使用MPEG压缩 - 应用
子系统的互连
CPU和存储器的连接
通常由称为总线的三组线路连接在一起,分别是:数据总线、地址总线和控制总线
数据总线
由多根线组成,每根线每次传送1个位的数据,线的数量取决于该字的大小
地址总线
允许访问存储器的某个字,线数取决于存储空间的大小
控制总线
负责在中央处理器和内存之间传送信息,线数取决于计算机所需的控制命令的总数
I/O设备的连接
通过输入/输出控制器或接口连接到总线
控制器(接口)
清除了输入/输出设备与CPU及内存在本质上的障碍,并行串行都可以,串行只有一根数据线连接到设备上,并行有数根数据线连接到设备上,使一次能同时传多个位
小型计算机系统接口SCSI
一个8、16或32线的并行接口,提供了菊花链连接,连接链的两端都必须有终结器,每个设备都必须有唯一地址(目标ID)
火线
高速的串行接口,采用数据包的形式传送数据,传输速度高达50MB/秒,可在一条菊花链或树型连接上连接多达63个设备
通用串行总线(USB)
串行控制器,用以连接与计算机相连的一些低速和高速的设备,多个设备可以被连接到一个USB控制器上,这个控制器称为根集线器,控制器能感知到树中其他集线器的存在,而其他集线器是被动的设备,只是简单地传送数据
热交换:设备可以不关闭计算机而很容易被移除或连接到树中
使用4根线的电缆,两根线(+5伏和地)用来为像键盘和鼠标这样的低压设备提供电压,高压设备要连接到电源上,集线器从总线获取电压,为低压设备提供电压;其他两根线(缠绕在一起,减小噪声)来传送数据、地址和控制信号,使用两种不同的连接头:A和B,A(下游连接器)是矩形的,用来连接到USB控制器或集线器,连接头B(上游连接器)是接近正方形的,用来连接到设备
以包的形式传输数据,每个包含有:地址部分(设备标识)、控制部分、要被传送到其他设备的数据部分,只有具有数据包中定义的地址的那些设备会接受
输入/输出设备的寻址
I/O独立寻址
读/写内存的指令和读/写输入/输出的指令完全不同,有专门的指令完成对输入/输出设备的读写操作、测试和控制,每个输入/输出设备有自己的地址
I/O存储器映射寻址
将输入/输出控制器中的每个寄存器看作内存中的某个存储字,没有单独的指令用来表示从内存或从输入/输出设备传送数据,有一个较小的指令集,所有对内存的操作指令都适用于输入/输出设备
程序执行
机器周期
利用重复的机器周期执行程序中指令,一步一条,从开始到结束,简化的周期包括:取指令、译码和执行
取指令
控制单元命令系统将下一条要执行的指令复制到CPU的指令寄存器中,被复制指令的地址保存在程序计数器中,复制完成后,程序计数器自动加1指向内存中的下一条指令
译码
当指令置于指令寄存器后,指令将由控制单元负责译码,结果是产生一系列系统可以执行的二进制代码
执行
译码后,控制单元发送任务命令到CPU的某个部件
输入/输出操作
CPU与输入/输出设备同步的方法:程序控制输入/输出、中断控制输入/输出、直接存储器存取(Direct Memory Access,DMA)
程序控制输入/输出
CPU等待I/O设备,数据传输通过程序中指令实现,当CPU遇到一条I/O指令就停止工作直到数据传输完毕,CPU不时地查询I/O驱动器状态;如果设备做好了传输准备,数据会被传送到CPU;否则,CPU继续查询I/O驱动器状态直到I/O驱动器准备好为止,数据在输入操作后被传送到内存,在输出操作前从内存取出
中断控制输入/输出
CPU告知I/O设备即将开始传输,不需要不停地查询I/O设备状态,I/O准备好时,中断CPU,在这个过程中,CPU还可以做其他事
直接存储器存取(DMA)
用于在高速I/O设备间传输大量的数据块,需要一个DMA控制器来承担CPU的一些功能,DMA控制器中有寄存器,可在内存传输前后保存数据块
CPU发送信息给DMA,包括传输类型、内存单元的起始地址以及传输的字节数,之后CPU可以做其他的事,准备好传输数据时,由DMA控制器通知CPU需要获取总线使用权,CPU停止总线并转交给DMA控制器使用,传输完成后,CPU继续进行正常操作,CPU只有在DMA和内存间传输数据时才空闲
不同的体系结构
复杂指令集计算机(CISC)
使用大量的指令,包括复杂指令,程序设计容易,CPU和控制单元的电路复杂,复杂指令被转化成一系列简单操作然后由CPU执行,需要一个被称为微内存的特殊内存,负责保存机器集中的每个复杂指令的一系列操作
微程序设计:使用微操作的程序设计
精简指令集计算机(RISC)
使用少量指令完成最少的简单操作,费时,复杂指令可以用简单指令模拟
流水线
改善吞吐量(单位时间内完成的指令总数),如果控制单元能同时执行两个或三个阶段,那下一条指令就可以在前一条指令完成前开始,当计算机在执行第一条指令的译码阶段时,还能执行第二条指令的取指令阶段
并行处理
可以拥有具有多个控制单元、多个算术逻辑单元和多个内存单元的计算机,能改善吞吐量
单指令流,单数据流(SISD)
一个控制单元、一个算术逻辑单元和一个内存单元,指令顺序执行,每条指令可以存取数据流中一个或多个数据项
单指令流、多数据流(SIMD)
一个控制单元、多个处理单元和一个内存单元,处理器单元从控制单元接收相同指令,在不同数据项操作
多指令流、单数据流(MISD)
多指令流、多数据流(MIMD)
多个指令流的多个指令作用于多个数据流,每条指令作用于一个数据项
简单计算机
三个组成部分:CPU、存储器和输入/输出子系统
CPU
三部分:数据寄存器、算术逻辑单元(ALU)和控制单元
数据寄存器
控制单元
具有电路,控制ALU的操作、对内存的存取和对I/O子系统的存取,有两个专用寄存器:程序计数器(PC、8位)和指令寄存器(IR、16位)
主存
有256个16位的存储单元,既有数据又有程序指令,前64个存储单元被专用于程序指令,任何程序的程序指令都存储在连续的内存单元中
输入/输出子系统
由一个键盘和一台监视器组成
指令集
具有16条指令集合的能力,指令由操作码和操作数两部分构成,操作码指明了在操作数上执行的操作的类型,每条指令由16位组成,被分成4个4位的域,最左边的域有操作码,其他3个域含有操作数或操作数的地址
处理指令
- 取指阶段
由PC决定的指令从内存中得到并被装入IR中,之后PC加1,指向下一条指令 - 译码阶段
IR中指令被译码,所需操作数从寄存器或内存中取到 - 执行阶段
指令被执行,结果被放入合适的内存单元或寄存器中
三个阶段结束后,控制单元开始新的周期,处理过程一直继续直到CPU遇到HALT指令
例子
计算:C = A + B
- 把内存M(40)的内容装入寄存器R(0)(R(0) ⬅ M(40))
- 把内存M(41)的内容装入寄存器R(1)(R(1) ⬅ M(41))
- 相加R(0)和R(1)的内容,结果放入R(2)中(R(2) ⬅ R(0) + R(1))
- 把R(2)的内容存入M(42)中(M(42) ⬅ R(2))
- 停机
存储程序和数据
把程序和数据存储在内存中,从内存单元(00)16到(04)16存储5行程序
指令周期
每条指令使用一个指令周期,需要5个指令周期
周期1
第一个周期开始时,PC指向程序的第一条指令,存放在内存单元(00)16中
- 控制单元取出存储在内存单元(00)16中的指令,放入IR中,PC的值加1
- 控制单元译码指令(1040)16为R(0) ⬅ M(40)
- 控制单元执行指令,存储在内存单元(1040)16中的整数的副本装入寄存器R(0)中
周期2
PC指向程序的第二条指令,在内存单元(01)16中
- 控制单元取出存储在内存单元(01)16中的指令,放入IR中,PC的值加1
- 控制单元译码指令(1141)16为R(1) ⬅ M(41)
- 控制单元执行指令,存储在内存单元(1141)16中的整数的副本装入寄存器R(1)中
周期3
PC指向程序的第三条指令,在内存单元(02)16中
- 控制单元取出存储在内存单元(02)16中的指令,放入IR中,PC的值加1
- 控制单元译码指令(3201)16为R(2) ⬅ R(0) + R(1)
- 控制单元执行指令,寄存器R(0)的内容加到寄存器R(1)的内容上(由ALU完成),结果放在R(2)中
周期4
PC指向程序的第四条指令,在内存单元(03)16中
- 控制单元取出存储在内存单元(03)16中的指令,放入IR中,PC的值加1
- 控制单元译码指令(2422)16为M(42) ⬅ R(2)
- 控制单元执行指令,寄存器R(2)中的整数副本存储到内存单元(42)16中
周期5
PC指向程序的第五条指令,在内存单元(04)16中
- 控制单元取出存储在内存单元(04)16中的指令,放入IR中,PC的值加1
- 控制单元译码指令(0000)16为Halt
- 控制单元执行指令,计算机停止
关键术语
- address bus(地址总线)
- address space(地址空间)
- arithmetic logic unit,ALU(算术逻辑单元)
- bus(总线)
- cache memory(高速缓冲存储器)
- central processing unit,CPU(中央处理单元)
- compact disk read-only memory,CD-ROM(只读光盘存储器)
- caompact disk rewritable,CD-RW(可重写光盘)
- complex instruction set computer,CISC(复杂指令集计算机)
- control bus(控制总线)
- control unit(控制单元)
- data bus(数据总线)
- decode(译码)
- digital versatile disk,DVD(数字多功能光盘)
- direct memory access,DMA(直接存储器存取)
- dynamic RAM,DRAM(动态RAM)
- electronically erasable programmable read-only memory,EEPROM(电可擦除可编程只读存储器)
- erasable programmable read-only memory,EPROM(可擦除可编程只读存储器)
- execute(执行)
- fetch(取(指令))
- Fire Wire(火线)
- input/output controller(输入/输出控制器)
- input/output subsystem(输入/输出子系统)
- instruction register(指令寄存器)
- interrupt driven I/O(中断控制输入/输出)
- intersector gap(扇区内间隔)
- intertrack gap(磁道内间隔)
- isolated I/O(I/O独立寻址)
- keyboard(键盘)
- land(纹间表面)
- machine cycle(机器周期)
- magnetic disk(磁盘)
- magnetic tape(磁带)
- main memory(主存)
- master disk(主盘)
- memory-mapped I/O(I/O存储器映射寻址)
- monitor(监视器)
- multiple instruction-stream,multiple data-stream,MIMD(多指令流,多数据流)
- multiple instruction-stream,single data-stream,MISD(多指令流,单数据流)
- non-storage device(非存储设备)
- optical storage device(光存储设备)
- parallel processing(并行处理)
- pipelining(流水线)
- pit(坑)
- polycarbonate resin(聚碳酸酯树脂)
- printer(打印机)
- program counter(程序计数器)
- programmable read-only memory,PROM(可编程只读存储器)
- programmed I/O(程序控制输入/输出)
- random access memory,RAM(随机存取存储器)
- read-only memory,ROM(只读存储器)
- read/write head(读写磁头)
- reduced instruction set computer,RISC(精简指令集计算机)
- register(寄存器)
- rotational speed(角速度)
- sector(扇区)
- seek time(寻道时间)
- single instruction-stream,multiple data-stream,SIMD(单指令流,多数据流)
- small computer system interface,SCSI(小型计算机系统接口)
- static RAM,SRAM(静态随机存取器)
- storage device(存储设备)
- throughput(吞吐量)
- track(磁道)
- transfer time(传送时间)
- Universal Serial Bus,USB(通用串行总线)
- write once,read many,WORM(写一次,读多次)
计算机网络
引言
网络是硬件和软件的组合,将数据从一个地方发送到另一个地方,硬件把信号从网络中一点传送到另一点的物理设备,软件由指令组成
网络标准
性能
传输时间:信息从一个设备传输到另一个设备所需的时间总量
响应时间:查询和响应间的时间间隔
可靠性
发生故障的频率、从故障恢复的时间等
安全
保护数据,防止非授权访问、损坏和修改,实现从数据破坏和数据丢失中回复的策略和程序
物理结构
连接类型
网络由两个或两个以上通过链路连接的设备构成
链路:数据从一个设备传输到另一个设备的通信通道
点对点连接:提供了两个设备间的专用链路,链路的整个容量为两个设备的传输所拥有
多点连接(多站连接):两个以上的指定设备共享一个链路,信道的容量在空间上和时间上共享
物理拓扑
网络在物理上的布置方式,是所有链路和设备(节点)间关系的几何表示
四种可能的基本结构为:网状型、星型、总线型和环型
星型拓扑:每个设备有专用的点对点链路,只与通常被称为集线器的中央控制器相连
总线拓扑:使用多点链路,一根长电缆(总线)起骨干作用,把网络所有设备连接在一起,节点使用分支线和连接头(连接器)与总线相连
环型拓扑:每个设备有专用的点对点链路,只与两边的设备相连,环中每个设备连接一个中继器
信号:以一个方向沿着环从一个设备传输到另一个设备
网络分类
局域网(LAN)
为个人计算机或工作站间的资源共享而设计,共享的资源包括硬件、软件或数据
大小可能由每个软件拷贝的许可用户数决定,或由访问操作系统的许可用户数决定
广域网(WAN)
提供长距离的数据、图像、音频和视频信息的传输
城域网(MAN)
大小介于LAN和WAN之间,为需要高速连接且终端点分布在一个城市或城市的一部分客户服务
互联网(internet)
两个或多个网络连接在一起,是一组连接在一起的通信设备
因特网(Internet)
由成千上万个相互连接的网络组成
TCP/IP协议族
原始为4层:主机到网络层(或链路层)、互联网层(网络层)、传输层和应用层,当今的TCP/IP在最后多了一层物理层
层
应用层
允许用于(人或软件)访问网络,负责向用户提供服务
客户/服务器体系结构
运行服务器程序的计算机称为服务器,运行客户端程序的计算机称为客户
客户端程序和服务端程序间的通信称为进程到进程的通信
应用层地址
帮助客户找到服务器计算机的实际地址,网络中每台计算机有一个逻辑地址(IP地址),服务器应用层地址能帮助客户端找到服务器计算机的IP地址
传输层
负责整个消息的进程到进程的传输,建立客户和服务器计算机的传输层的逻辑通信,负责客户和服务器进程间的消息的逻辑传输
传输层的地址(端口号)
表示服务器进程
多路复用和解多路复用
传输层的一个职责,为不同的进程做相同的工作,从进程中收集要发出的信息,并将到达的信息分发给进程,客户端进程使用传输层指定的临时端口号
拥塞控制
传输层负责实现,消息在发送前存储在缓冲区中,如果传输层检测到网络拥塞,就暂缓发送
流量控制
发送端的传输层监控接收端的传输层,检查接收者接收到的数据包是否过量
差错控制
确保消息被目的传输层正确接收,在缓冲区(临时存储)中保留消息的副本,直到从接收者那里接收到包无损坏到达和次序正确的确认
传输层协议
用户数据报协议(UDP)
完成多路复用和解多路复用,通过给包增加校验和检验差错控制,如果包损坏就丢弃该包,不通知发送者重新发送,传送更少的额外信息,是无连接协议,缺乏序号,每个包都是一个单独的实体
传输控制协议(TCP)
使用序号、确认号和校验和,具有多路复用、解多路复用、流量控制、拥塞控制和差错控制,是面向连接的协议,序号的使用维持了连接,数据包错误时,会重新发送,不适合音频和视频的实时传输
流控制传输协议(SCTP)
为一些预期的因特网服务而设计
网络层
负责源到目的地(计算机到计算机或主机到主机)的数据包发送,可能跨多个网络(链路),保证每个数据包从源点到最终目的地,负责单个数据包从源主机到目的主机的发送
网络层地址
使用路由表找到下一跳(路由器)的逻辑地址,把这个地址传给数据链路层,使用数据链路层需要的这个逻辑地址来找到下一个路由器的数据链路层地址
路由选择
确定数据包的部分或全部路径,路由基于目的地之和可用的最佳路径来选择,当路由器接收到数据包时,检查路由表,决定这个数据包到最终目的地的最佳路线,路由表提供了下一路由器的IP地址,当数据包到达下一路由器时,下一路由器在做出新的决定,路由选择协议主要有:RIP、OSPF和BGP
网络层协议
因特网协议(IP)
IPv4负责从源计算机到目的计算机的数据包发送,是32位的IP地址标识,用点分十进制记法表示,把32位地址分解成4个8位的部分,每个部分写成0~255的十进制数,用三个点来隔开,可定义2^32个不同设备
辅助协议
因特网控制消息协议(ICMP):报告一定数目的差错给源计算机,检查因特网节点的状态
因特网小组管理协议(IGMP):增加IP的多播能力
IP本质是单播传输的协议
同时还有地址解析协议(ARP)和反向地址解析协议(RARP)
数据链路层
从一个节点到另一个节点传输数据,用数据帧封装数据包
数据链路层地址
一个设备可以静态或动态地找到另一个设备的数据链路层地址
静态方法:创建具有两列的表,用于存储网络层和数据链路层地址对
动态方法:设备广播一个含有下一个设备IP地址的特定数据包,并用这个IP地址询问邻近节点,邻近节点返回它的数据链路层地址
以太网协议使用48位地址,通常被写成十六进制格式(分成6部分,每部分两位十六进制数)
数据链路层地址常被称为物理地址或介质访问控制(MAC)地址
差错控制和流量控制
从头至尾检查差错
物理层
完成在物理介质上传输二进制流所需要的功能,负责组成帧的单个二进制位从一个节点到另一个节点的传送,传送的单元是二进制位,帧中每个位被转化成电磁信号,通过物理介质传播,无需地址,传播方式为广播
层的总结
因特网应用
为用户提供服务
电子邮件(e-mail)
两个实体间的信息交换,接收者不能是相应的服务器,消息传送代理(MTA)的客户端安装在用户计算机上,服务器安装在邮件服务器上,完成MTA客户端和服务端工作的应用程序称为简单邮件传输协议(SMTP),取消息使用消息访问代理(MAA),MAA客户端安装在用户计算机,服务器安装在邮件服务器上
MTA客户端是推入程序,客户端推入(上载)消息
MAA客户端是拉出程序,客户端拉出(下载)消息
邮件访问协议
邮局协议版本3(POP3)
客户端POP软件安装在接收者的计算机,服务器POP软件安装在电子邮件服务器上
不允许用户在服务器上组织电子邮件
用户在服务器上不能有不同的文件夹
不允许用户在下载邮件前检查其内容
因特网邮件访问协议(IMAP)
在下载前检查电子邮件的头
在下载前检查电子邮件的内容
部分下载电子邮件,如果用户只有有限的容量,而电子邮件容量巨大,这一功能有用
在邮件服务器上创建、删除或重命名邮箱
为电子邮件的存储在文件夹中建立邮箱的层次结构
地址
由本地部分和域名组成,中间用@符号隔开
本地部分
指定文件的名字,即用户的邮箱,存储用户接收的所有电子邮件的地方,也是用户代理去除邮件的地方
域名
赋予IP地址的一个名字,一个组织经常选择一个或多个主机来接收和发送电子邮件,赋予每个邮件服务器的名字(域名)来自于成为域名系统(DNS)的通用命名系统
多用途因特网邮件扩充协议(MIME)
SMTP只能发送NVT(网络虚拟终端)7位ASCII格式的消息
允许非ASCII数据通过SMTP传输的补充协议,不是一个电子邮件协议,不能代替SMTP,只是SMTP的扩展
MIME在发送端把非ASCII数据转化成NVT ASCII数据,然后发送给SMTP客户端,再通过因特网发送,接收端的SMTP服务器接收到NVT ASCII数据,把它发送给MIME,MIME把它转化成原始数据
文件传输协议(FTP)
用于从一台计算机拷贝文件到另一计算机
在主机间建立两个连接:
- 用来传输数据
- 用来控制信息(命令和相应)
FTP客户端由三部分组成:用户接口、客户端控制进程和客户端数据传输进程
FTP服务端由两部分组成:服务器控制进程和服务器传输数据进程
控制连接建立在控制进程间,数据连接建立在数据传世进程间
两个FTP连接使用不同的策略和不同的端口号
限制式FTP和开放式FTP
站点是限制的或是对公众开放的
限制式FTP:允许指定的用户存取文件,通过账号和密码控制存取,公众不允许在这样的站点上存取文件
开放式FTP:允许任何人存取文件,站点提供匿名FTP,用户可使用anonymous作为用户名,guest作为密码,用户在系统上的参与有限,有些站点只允许用户使用命令的子集
远程登录(TELNET)
多用途的客户/服务器程序,允许用户访问远程计算机上的任何应用程序,允许用户登录远程计算机,可使用远程计算机上可用的服务,并把结果传回本地计算机上
可以建立与远程系统的连接,让本地终端看起来像直接连接到远程系统的终端一样
本地登录
用户登录本地分时系统
远程登录
给特殊字符赋予特殊的含义,TELNET客户端把每个字符转化为网络虚拟终端(NVT)字符的通用字符集中的字符,然后把字符发送本地TCP/IP栈
服务器端,TELNET服务器把每个NVT字符转回ASCII字符,然后传送给伪终端驱动程序
万维网(WWW)
连接分布在世界各地信息的知识库,是一种分布式客户/服务器服务,WWW提供的服务分布在许多地方,称为Web站点
超文本和超媒体
信息存储在一组用链接概念连接在一起的文档中,一个项通过链接与另一个文档相关,正在浏览文档的用户可通过选择链接到另一个文档的项,转到其他文档中
超文本文档只有文本,超媒体文档可有图片、图形和声音
Web上可用的超文本或超媒体的基本单元为页面,一个组织或个人主页面或跟页面是主页
WWW的组成
包括三个部件:浏览器、Web服务器和超文本传输协议(HTTP)
浏览器
由三部分构成:控制器、客户端程序和解释器
控制器接收输入,空户端程序存取文档,解释器处理在因特网上使用的语言
服务器
存储所有属于Web站点的页面
超文本传输协议(HTTP)
存取万维网中数据的协议,使用纯文本、超文本、音频、视频等形式传输数据,被称为超文本传输协议因为效率
地址
统一资源定位符(URL):一种用于指定因特网上任何类型的信息的标准
URL定义了四件事:方法、主机、端口号和路径
方法:存取文档使用的协议
主机:信息所在的计算机
端口号:服务器的端口号,被插在主机和路径之间,需要使用分号将它和主机名隔开
路径:信息所在文件路径名,路径本身可以含有斜杠
静态文档
WWW文档可分为三类:静态、动态和活动
静态文档:内容固定,被创建、存储在服务器上,客户端只能得到文档副本
超文本标记语言(HTML)
用于创建Web页面,允许文件本身中嵌入格式化指令,指令包含在文本中,任何浏览器都能读指令,并按浏览器运行其上指定计算机来格式化文本
Web页面由两部分组成:头和体
头包含页面的标题和浏览器要是用的其他参数
页面实际内容在体部分,包含文本和标签,文本是包含在页面的实际信息,标签定义文档的外观
图像标签定义了要存取的图像的地址(URL),制定了存取后图像应如何被插入
超链接标签用来把文档连接在一起,任何项都可以通过称为锚的机制来指向另一个文档,使用
可扩展标记语言(XML)
标签可以用来定义两个标签间文本的内容(类型)
标签定义类型,文本定义值
动态文档
任何只要浏览器请求文档的时刻,Web服务器就会创建动态文档,新文档是为每次请求创建的,动态文档的内容可以是随请求而变化的
通用网关接口(CGI)
创建和处理动态文档的技术,定义如何编写动态文档、如何将数据输入程序、如何使用输出结果的一种标准
动态文档的脚本技术
最常见的有:
使用Perl语言的超文本预处理程序(PHP)
使用Java作为脚本语言的Java服务器页面(JSP)
使用Visual Basic语言作为脚本语言的微软产品活动服务器页面(ASP)
在HTML中嵌入SQL数据库查询的ColdFusion
活动文档
在客户端运行程序和脚本的应用
Java小程序
创建活动文档的一种方式,使用Java编写,保存在服务器,编译好而准备运行,文档是字节编码(二进制)格式,客户端进程(浏览器)创建小程序的一个实例
两种方法运行小程序:
- 直接在URL中请求Java小程序,用二进制形式接收小程序
- 取得并运行内嵌小程序地址作为标签的HTML文件
Java Script
文档的活动部分较小
其他因特网应用
视频会议
提供两组或多组参与者间的交流,或一组参与者间(桌面视频会议)的交流
分组讨论(Listserv)
允许一组用户讨论感兴趣的共同话题,有两个服务器程序在服务器上运行:订阅者服务器和邮件服务器
订阅
订阅服务器接受组的成员资格,用户给服务器发送一个包含SUBSCRIBE请求的电子邮件,被订阅者服务器扫描,如果允许,那么用户被注册,通过返回电子邮件告诉用户注册情况,典型的订阅命令为:
SUBSCRIBE mailer-server-e-mail-address user-e-mail-address
发送电子邮件
订阅后,用户可以向组发送标有邮件服务器地址的电子邮件
取消订阅
用户向订阅者服务器发送UNSUBSCRIBE命令,典型的取消命令为:
UNSUBSCRIBE mailer-server-e-mail-address user-e-mail-address
聊天
双方或多方交换文本、音频和视频
关键术语
- active document(活动文档)
- Active Server Pages,ASP(活动服务器页面)
- application layer(应用层)
- backbone(骨干)
- best-effort service(尽力而为服务)
- bus topolopy(总线拓扑结构)
- chattin(聊天)
- frame(帧)
- header(头)
- hub(集线器)
- HyperText Markup Lanauage,HTML(超文本标记语言)
- Hypertext Preprocessor(超文本预处理器)
- Hyper Text Transfer Protocol,HTTP(超文本传输协议)
- client-server architecture(客户/服务器体系结构)
- Common Gateway Interface,CGI(通用网关接口)
- Internet(因特网)
- internet(互联网)
- congestion control(拥塞控制)
- Internet Mail Access Protocol,IMAP(因特网邮件访问协议)
- Internet Protocol,IP(因特网协议)
- Internet Service Provider,ISP(因特网服务提供商)
- connection-oriented protocol(面向连接的协议)
- connectionless protocol(无连接协议)
- internetwork(互联网)
- data link layer(数据链路层)
- data link layer address(数据链路层地址)
- demultiplexing(解多路复用)
- IP address(IP地址)
- Java applet(Java小程序)
- domain name(域名)
- Java Server Pages,JSP(Java服务器页面)
- JavaScript(一种高级语言)
- Listserv(一个分组讨论应用)
- Domain Name Server(域名服务器)
- dotted-decimal notation(点分十进制记法)
- dynamic document(动态文档)
- electronic mail(e-mail)(电子邮件)
- Local Area Network,LAN(局域网)
- encapsulate(封装)
- Extensive Markup Language,XML(可扩展标记语言)
- Medium Access Control Address,MACA(介质访问控制地址)
- mesh topology(网状拓扑结构)
- message transfer agent(消息传送代理)
- ring topology(环形拓扑)
- Metropolitan Area Network,MAN(城域网)
- router(路由器)
- multidrop connection(多点连接)
- multiplexing(多路复用)
- routing(路由选择)
- security(安全)
- Simple Mail Transfer Protocol,SMTP(简单邮件传输协议)
- Multipurpose Internet Mail Extension protocol,MIME(多用途因特网邮件扩充协议)
- star topology(星型拓扑)
- static document(静态文档)
- Stream Control Transmission Protocol,SCTP(流控制传输协议)
- network(网络)
- network layer(网络层)
- node(节点)
- peer-to-peer communication(对等通信)
- TCP/IP protocol suite(TCP/IP协议族)
- performance(性能)
- physical address(物理地址)
- terminal network(终端网络)
- trailer(报文尾)
- physical layer(物理层)
- physical topology(物理拓扑)
- point-to-point connection(点对点连接)
- Transmission Control Protocol,TCP(传输控制协议)
- transport layer(传输层)
- port number(端口号)
- Uniform Resource Locator,URL(统一资源定位符)
- Post Office Protocol,POP(邮局协议)
- process(进程)
- user agent(用户代理)
- process-to-process communication(进程到进程的通信)
- User Datagram Protocol,UDP(用户数据包协议)
- process-to-process delivery(进程到进程的分发)
- videoconferencing(视频会议)
- reliability(可靠性)
- ring(环)
- Wide Area Network,WAN(广域网)
- World Wide Web,WWW(万维网)
操作系统
引言
- 介于计算机硬件和用户(程序或人)之间的接口
- 是一种用来使得其他程序更加方便有效运行的程序(或一个程序集)
- 作为通用管理程序管理计算机系统中每个部件的活动,确保计算机系统中的硬件和软件资源能够更有效地使用,出现资源使用冲突时,操作系统应进行仲裁,排除冲突
设计目标:
- 有效地使用硬件
- 容易地使用资源
自举过程
计算机被加电时,CPU计数器被设置为自举程序的第一条指令,并执行程序中的指令,把操作系统本身(需要启动计算机的那部分)装入RAM内存,装入完成后,CPU中程序计数器被设置为RAM中操作系统的第一条指令
演化
批处理系统
用穿孔卡片进行输入数据,用行式打印机输出结果,用磁带设备作为辅助存储介质,每个运行的程序叫做一个作业,保证计算机所有资源被从一个作业转换到另一个作业
分时系统
将多个作业同时装入内存,并仅当该资源可用时分配给需要它的作业,资源可以被不同作业分享,每个作业可以分到一段时间使用资源
调度:给不同的程序分配资源,决定哪一个程序什么时候使用哪一种资源
个人系统
单用户操作系统,例如:DOS
并行系统
在一个计算机中安装多个CPU,每个CPU可以处理一个程序或程序的一部分
分布式系统
程序可以在一台计算机上运行一部分而在另一台计算机上运行另一部分
实时系统
在特定时间限制内完成任务
组成部分
现代操作系统至少有四个功能:内存管理器、进程管理器、设备管理器和文件管理器,用户界面(命令解释程序)不归任何管理,负责操作系统与外界通信
用户界面
接收用户(进程)的输入并向操作系统解释这些请求的程序,一些操作系统也称为命令解释程序或窗口
内存管理器
分为单道程序和多道程序两大类
单道程序
大多数内存用来装在单一的程序(数据作为程序的一部分),仅一小部分装在操作系统,运行结束后,程序区域被其他程序取代
多道程序
同一时刻可以装入多个程序并且能够同时被执行,CPU轮流服务
非交换范畴:程序在运行期间始终驻留在内存中
交换范畴:程序可以在内存和硬盘间多次交换数据
分区调度
内存被分为不定长的及各分区,每个部分或分区保存一个程序,交替服务,一个程序开始,执行一些指令,直到有输入/输出操作或分配给程序的时限到达为止
- 分区大小由内存管理器预先决定
- 随着新程序的交换载入内存后有可能出现空闲区
- 空闲区过多时,内存管理器能紧缩分区并删除空闲区和创建新区
分页调度
内存被分成大小相等的若干部分,称为帧,程序被分成大小相等的部分,称为页,页和帧的大小通常一样,并且与系统用于从存储设备中提取信息的块大小相等,程序在内存中可以不连续,连续的页可以占用不连续的帧
请求分页调度
程序被分成页,页可以依次载入内存、运行,被另一个页代替,内存可以同时载入多个程序的页,同一个程序的连续页可以不载入同一个帧,一个页可以载入任何一个空闲帧
请求分段调度
程序按程序员角度划分成段,可被来自同一程序或其他程序的模块代替
请求分页和分段调度
内存分为多个帧,一个模块分为多个页,依次装入内存运行
虚拟内存
程序运行时,一部分程序驻留在内存中,一部分放在硬盘上,实行请求分页调度、请求分段调度或两种都有
进程管理器
程序、作业和进程
程序
由程序员编写的一组稳定的指令,存在硬盘或磁带上,可能不会成为作业
作业
从一个程序被选中执行,到其运行结束并再次成为一个程序的过程中,该程序称为作业,不是所有程序都是作业,但作业都是程序
进程
一个执行中的程序,在内存中运行的作业,每个进程都是作业,但作业未必是进程
状态图
- 程序被操作系统选中时成为作业并变为保持状态直到载入内存中
- 当内存可以整体或部分载入程序时,作业变为就绪状态并变为进程直到CPU运行它
-
当CPU运行程序时,程序变为运行状态,并可能出现以下三种状态之一:
- 进程运行直到它需要I/O资源,并进入等待状态,直到输入/输出结束
- 进程可能耗尽所分配的时间片,并进入就绪状态
- 进程终止,并进入终止状态
调度器
讲一个作业或进程从一个状态改变为另一个状态,进程管理器使用两个调度器:作业调度器和进程调度器
作业调度器
将一个作业从保持状态转入就绪状态,或从运行状态转入终止状态,从作业中创建一个进程和终止一个进程
进程调度器
其他调度器
一些操作系统使用其他类型的调度器使进程之间转换更为有效
队列
进程管理器使用队列(等待列表)处理多个进程和作业,与每一作业或进程相关的是存有这些作业和进程信息的作业控制块或进程控制块,作业或进程仍保存在内存或硬盘中,一个操作系统有多个队列
作业队列保存等待内存的作业,就绪队列保存已经在内存中准备好运行但等待CPU的进程,I/O队列保存正在等待I/O设备的进程
进程管理器按照某种策略从队列中选择下一个作业或进程
进程同步
资源可以被多个用户(进程)同时使用,会产生两个问题状态:死锁和饿死
死锁
发生在操作系统允许一个进程运行,而不用检查所必须的资源是否准备好,是否允许进程占有资源直到不需要为止
一种解决方法是当所需资源不空闲时,不允许进程运行,另一种解决方法是限制进程占有资源的时间
死锁发生的条件为:
- 互斥:一个资源只能被一个进程占有
- 资源占有:一个进程占有一个资源
- 抢先:操作系统不能临时对资源重新分配
- 循环等待:所有进程和资源包含在一个循环里
饿死
发生在操作系统对进程分配资源有太多限制的时候
设备管理器(输入/输出管理器)
负责访问输入/输出设备
- 不停监视所有输入/输出设备,保证程序能正常运行
- 为每一个输入/输出设备维护一个队列,或为类似的输入/输出设备维护一个或多个队列
- 访问输入/输出设备的不同策略
文件管理器
- 控制文件的访问
- 管理文件的创建、删除和修改
- 给文件命名
- 管理文件的存储
- 负责归档和备份
主流操作系统
UNIX
- 多用户、多道程序、可移植操作系统,可以不经过较大的改动从一个平台移植到另一个平台,使用C编写
- 拥有功能强大的工具(命令),能组合起来(在可执行文件中被称为脚本)解决许多问题
- 具有设备无关性,可以方便配置运行人和设备
由四个主要部分构成:内核、命令解释器、一组标准工具和应用程序
内核
UNIX系统的核心,包含操作系统做基本的部分:内存管理、进程管理、设备管理和文件管理
命令解释器
对用户最可见的部分,接收和解释用户输入的命令,需要请求内核运行
工具
UNIX标准程序,为用户提供支持过程,常用的三个工具为:文本编辑器、搜索程序和排序程序
应用
由系统管理员、专职程序员或用户编写,提供对系统的扩展能力
Linux
组成
- 内核
负责处理所有属于内核的职责 - 系统库
有一组被应用程序使用的函数(包括命令解释器),用于与内核交互 - 系统工具
使用系统库提供的服务,执行管理任务的各个程序
网络功能
支持套接字接口、协议驱动和网络设备驱动三层
安全
提供了传统上为UNIX定义的安全特性
Windows NT/2000/XP
设计目标
- 可扩展性
具有多层的模块化体系结构 - 可移植性
用C或C++编写 - 可靠性
能处理包括防止恶意软件的错无条件,NT使用NT文件系统(NTFS),从文件-系统错误中恢复 - 兼容性
- 性能
对运行在操作系统顶层的应用程序具有快速响应时间
体系结构
- 硬件抽象层(HAL)
为上层隐藏硬件差异 - 内核
操作系统的心脏,是面向对象软件的一个片段,把任何实体都看成对象 - 执行者
为整个操作系统提供服务,由六个子系统构成:对象管理器、安全引用监控器、进程管理器、虚拟内存管理器、本地过程调用工具和输入/输出(I/O)管理器 - 环境子系统
允许NT运行那些为NT、其他操作系统或NT早起版本设计的应用程序,运行在用户态
关键术语
- batch operating system(批处理操作系统)
- bootstrap(自举)
- circular waiting(循环等待)
- monoprogramming(单道程序)
- multiprogramming(多道程序)
- mutual exclusion(互斥)
- deadlock(死锁)
- demand paging(请求分页调度)
- native NT file system,NTFS(本地NT文件系统)
- demand paging and segmentation(请求分页和分段调度)
- demand segmentation(请求分段调度)
- no-preemption(非抢占)
- operating system(操作系统)
- device manager(设备管理器)
- page(页)
- paging(分页调度)
- distributed system(分布式系统)
- parallel system(并行系统)
- frame(帧)
- partitioning(分区调度)
- Graphic User Interface,GUI(图像用户界面)
- process(进程)
- hold state(保持状态)
- process scheduler(进程调度器)
- job(作业)
- program(程序)
- job scheduler(作业调度器)
- queuing(排队)
- kernel(内核)
- ready state(就绪状态)
- Linux(Linux操作系统)
- real-time system(实时系统)
- memory manager(内存管理器)
- resource holding(资源持有)
- Microsoft Disk Operating System,MS-DOS(微软磁盘操作系统)
- running state(运行状态)
- scheduler(调度器)
- scheduing(调度)
- UNIX(UNIX操作系统)
- shell(命令解释器)
- user interface(用户界面)
- single-user operating system(单用户操作系统)
- utility(工具)
- virtual memory(虚拟内存)
- software(软件)
- waiting state(等待状态)
- starvation(饿死)
- Windows(Windows操作系统)
- terminal state(终止状态)
- time sharing(分时)
- Windows2000(Windows2000操作系统)
- Windows NT(Windows NT操作系统)
- Windows XP(Windows XP操作系统)
算法
概念
非正式定义
三种结构
顺序结构、判断和循环
算法的表示
统一建模语言(UML)
伪代码
更正式的定义
算法是一组明确步骤的有序集合,产生结果并在有限的时间内终止
有序集合
算法必须是一组定义完好并且排列有序的指令集合
明确步骤
算法每一步都必须有清晰的定义
产生结果
算法必须产生结果,否则算法没有意义,结果可以使被调用的算法返回的数据或其他结果
在有限时间内终止
算法必须能够终止(停机)
基本算法
求和
- 将和初始化
- 循环,在每次迭代中将一个新数加到和上
- 退出循环后返回结果
乘积
- 将乘积初始化
- 循环,在每次迭代中将一个新数与乘积想乘
- 退出循环后返回结果
最大和最小
通过判断结构找到两个数中的较大(较小)值,并把这个结构放在循环中
排序
选择排序
数字列表分为两个子序列:已排序和未排序的,找到未排序子列表中最小的元素并把它和未排序数据中第一个元素进行交换,通过每次选择和交换,这样每次排序列表中将增加一个元素而未排序列表中将减少一个元素,每次把一个元素从未排序列表移到已排序列表就完成了一次分类扫描,一个含有n个元素的列表需要n-1次扫描完成数据的重新排列,使用两重循环
冒泡排序
数字列表分为两个子序列:已排序和未排序的,未排序的子列表中,最小的元素通过冒泡的方法选出来并移到已排序的子序列中,含有n个元素的列表需要n-1次扫描完成数据的重新排列,使用两重循环
插入排序
数字列表分为两个子序列:已排序和未排序的,每次扫描中,未排序子列表的第一个元素被取出,转换到已排序的子列表中,并插入到合适的位置,含有n个元素的列表需要n-1次扫描完成数据的重新排列,使用两重循环
其他排序算法
根据需要排序的数据类型来进行排序算法的选择
查找
在列表中确定目标所在位置的算法
顺序查找
用于查找无序的列表,可以用来查找较小的列表或不常用的列表,从表头开始查找,当找到目标元素或确信查找目标不在列表中时,查找过程结束
折半查找
用于查找有序的列表,需要使用三个引用:first、mid和last,每次需要计算mid,并将目标与mid相比较,直到目标等于mid对应的值或first大于last
子算法
将算法分成几个单元
子算法至少有两个优点:
- 程序更易理解
- 子算法可在主程序中不同地方调用,无需重写
结构图:是一种编程工具,一种高层设计工具,显示算法中不同模块之间的关系,一般在设计阶段使用
递归
算法自我调用的过程
迭代的定义
算法的定义没有包含算法本身
递归的定义
算法的定义包含算法本身,直接或间接调用本身
关键术语
- algorithm(算法)
- binary search(折半查找法)
- bubble sort(冒泡排序)
- searching(查找)
- selection(选择)
- selection sort(选择排序)
- decision(判断)
- input data(输入数据)
- insertion sort(插入排序)
- sequence(顺序)
- sequential search(顺序查找)
- loop(循环)
- sort pass(分类扫描)
- output data(输出数据)
- sorting(排序)
- structure chart(结构图)
- product(乘积)
- subalgorithm(子算法)
- pseudocode(伪代码)
- summation(求和)
- recursion(递归)
- repetition(重复)
- Unified Modeling Language,UML(统一建模语言)
程序设计语言
演化
计算机语言:编写程序时,根据事先定义的规则(语法)而写出的预定语句的集合
机器语言(第一代编程语言)
由“0”和“1”的字符串组成,计算机唯一识别的语言,依赖于计算机
汇编语言(符号语言)
用带符号或助记符的指令和地址代替二进制代码,汇编程序用于将汇编语言代码翻译成机器语言
高级语言
必须被转化为机器语言,转化过程称为解释或编译
翻译
高级语言程序被称为源程序,被翻译成的机器语言程序称为目标程序
编译
把整个源程序翻译成目标程序
解释
把源程序中的每一行翻译成目标程序中相应的行,并执行,解释的两种趋势:Java语言之前被有些程序使用的和Java使用的解释程序
- 解释程序的第一种方法
Java语言之前的有些解释式语言,源程序的每一行被翻译成被其使用的计算机上的机器语言,该行机器语言被立即执行 - 解释程序的第二种方法
首先被编译,创建字节代码,是一种虚拟机的目标代码,然后被任何运行模拟器的计算机编译或解释
翻译过程
- 词法分析器
一个符号接一个符号地读源代码,创建源语言中的助记符表 - 语法分析器
分析一组助记符,找出指令 - 语义分析器
检查语法分析器创建的句子,确保不含有二义性 - 代码生成器
每条指令转化为一组程序将要在其上运行的计算机的机器语言
编程模式
过程式模式(强制性模式)
把程序看成是操纵被动对象的活动主体,主体使用称为数据或数据项的被动对象,作为被动对象的数据项存储在计算机的内存中,活动主体通过发布动作(过程)操纵数据
由三部分构成:对象创建部分、一组过程调用和每个过程的一组代码
- FORTRAN
具有高精度算法、处理复杂数据能力和指数运算的特征 - COBOL
作为商业编程语言使用 - Pascal
通过强调结构化编程方法教初学者编程 -
C语言
- 有一个结构化的高级编程语言应有的所有高级指令
- 具有一些低级指令,使程序员能直接快速访问硬件,更接近汇编语言
- 是非常有效的语言,指令短
-
Ada
成为DoD和工业的流行语言- 有其他过程式语言一样的高级指令
- 有允许实时处理的指令
- 拥有并行处理的能力,可以再具有多处理器的主机上运行
面向对象模式
处理活动对象,对象只需要接收合适的外部刺激执行其中一个动作能把所有的被文件执行的过程(方法)打包在一起,方法被相同类型的所有对象共享,也被从这些对象继承的其他对象共享
类
- 方法
有头、局部变量和语句 - 继承性
一个对象能从另一个对象继承 - 多态性
定义一些具有相同名字的操作,这些操作在相关类中做不同的事情
一些面向对象语言
- C++
用类定义相似对象的通用属性以及可以应用于它们本身的各种操作,遵循三条基本原则特性:封装、继承和多态 - Java
可以使一个应用程序也可以是一个小程序,应用程序是可以完全独立运行的程序,小程序是嵌入在超文本标记语言中的程序,自带丰富的类库,允许多线程执行
函数式模式
程序被看成是一个数学函数,把一组输入映射到一组输出的黑盒子
主要实现的功能:
- 定义一系列可供任何程序员调用的原始(原子)函数
- 允许程序员通过若干原始函数的组合创建新的函数
支持模块化编程并允许程序员使用已经存在的函数开发新的函数
- 表处理解释语言(LISP)
把表作为处理对象的语言 - Scheme
定义了一系列原始函数,函数名和函数的输入列表写在括号内,结果是一个可用于其他函数输入的列表
说明式模式
依据逻辑推理的原则响应查询,后来发展成为一阶谓词演算
最著名的说明性语言:Prolog
共同概念
标识符
允许给程序中的数据和其他对象命名
数据类型
定义了一系列值以及应用于这些值的一系列操作,每种数据类型值的集合称为数据类型的域
-
简单数据类型(原子类型、基本类型、标量类型或内建类型)
不能分解成更小数据类型的数据类型- 整型类型:不包括小数部分的完整的数
- 实数类型:带小数部分的数字
- 字符类型:语言使用的潜在字符集中的符号
- 布尔类型:只取两个值(真或假)的数据类型
-
复合数据类型
一组元素,每个元素是简单数据类型或复合数据类型- 数组:每个元素具有相同类型
- 记录:元素可以具有不同的类型
变量
存储单元的名字,每个存储单元(或字)在计算机中都有一个地址,变量有类型
- 变量声明
警告计算机被赋予名字和类型的变量将在程序中使用 - 变量初始化
在变量声明和定义时进行初始化,在变量中存储一个值
字面值
程序中使用的预定义的值,大多数语言中,可以有整数、实数、字符和布尔字面值,还可以有字符串字面值
常量
是一个可以存储值的命名位置,值在程序开始处被定义后就不能改变,常量有类型,当常量被声明时,要定义它的类型
输入和输出
- 输入
数据或通过语句或通过预先定义的函数来完成输入 - 输出
数据或通过语句或通过预先定义的函数来完成输出
表达式
由一系列操作数和运算符简化后的一个单一数值
-
运算符
用来完成一个动作的特定语言的语法记号
算数运算符运算符 定义 例子 + 加 3 + 5 - 减 2 - 4 * 乘 num * 5 / 除(商) sum / count % 除(余数) count % 4 ++ 递增(变量值加1) count++ -- 递减(变量值减1) count-- 关系运算符
运算符 定义 例子 < 小于 num < 5 > 大于 num > 5 >= 大于等于 num >= 5 <= 小于等于 num <= 5 == 等于 num == 5 != 不等于 num != 5 逻辑运算符
运算符 定义 例子 ! 非 !num && 与 num1 && num2 或 num1 num2 - 操作数
接收一个运算符的动作
语句
- 赋值语句
给变量赋值,存储一个值在变量中,在声明部分已经被创建 - 复合语句
一个包含0个或多个语句的代码单元,被称为块,使一组语句成为一个整体,一般包括一个左大括号、一个可选语句段以及一个右大括号 -
控制语句
在过程式语言中的程序时语句的集合,语句通常逐句执行,但有时需要改变顺序执行- 大多数强制性语言都有两路和多路选择语句,两路通过if-else,多路通过switch语句取得
- 大多数强制性语言都定义了1~3个能实现重复的循环语句,如:while、do-while和for
子程序
在过程式语言中极为重要,使程序更结构化、更容易,在增量程序开发中,程序员可以通过在每一步增加一个子过程一步步测试程序
- 局部变量
子程序能调用预定义的过程,在局部对象上操作,当子过程每次被调用时,局部对象或局部变量被创建,当控制从子程序返回时被销毁,局部对象属于子程序 - 参数
大多数主程序需要子程序作用于由主程序创建的一个对象或一组对象,程序和子程序使用参数,主程序中称为实际参数,子程序中称为形式参数,可以通过传值或传引用来个子程序传递参数 - 传值
主程序和子程序创建两个不同的对象,程序中创建的对象属于程序,子程序中创建的对象属于子程序,相应的对象可以有相同的名字或不同的名字,主程序和子程序的通信时单方向的,从主程序到子程序,从子程序到主程序没有参数的通信,子程序不能改变主程序中变量的值 - 传引用
被设计来允许子程序改变主程序中变量的值,变量被主程序和子程序共享,相同的变量可能在主程序和子程序中有不同的名字,但两个名字指向同一个变量 - 返回值
子程序返回一个值或几个值 - 实现
子程序被实现为函数
关键术语
- actual parameter(实际参数)
- Ada(Ada语言)
- assignment statement(赋值语句)
- applet(小程序)
- C language(C语言)
- arithmetic operator(算数运算符)
- C++ language(C++语言)
- assembler(汇编程序)
- class(类)
- assmbly language(汇编语言)
- code generator(代码生成器)
- Common Business-Oriented Language, COBOL(COBOL语言)
- compilation(编译)
- local variable(局部变量)
- logical operator(逻辑运算符)
- compiler(编译器)
- composite type(复合类型)
- machine language(机器语言)
- compound statement(复合语句)
- computer language(计算机语言)
- machine language(机器语言)
- method(方法)
- multithreading(多线程)
- object program(目标程序)
- object-oriented language(面向对象语言)
- object-oriented paradigm(面向对象模式)
- constant(常量)
- control statement(控制语句)
- data type(数据类型)
- operand(操作数)
- operator(运算符)
- declarative paradigm(说明式模式)
- expression(表达式)
- Pascal(Pascal语言)
- formal parameter(形式参数)
- pass by reference(传引用)
- pass by value(传值)
- FORmula TRANslation,FORTRAN(FORTRAN语言)
- polymorphism(多态)
- functional language(函数式语言)
- functional paradigm(函数式模式)
- procedural paradigm(过程式模式)
- PRogramming in LOGic,PROLIG(Prolog语言)
- high-level language(高级语言)
- identifier(标识符)
- relational operator(关系运算符)
- imperative paradigm(强制性模式)
- semantic analyzer(语义分析器)
- inheritance(继承)
- input(输入)
- simple type(简单类型)
- interpretation(解释)
- interpreter(解释器)
- source program(源程序)
- statement(语句)
- Java(Java语言)
- subprogram(子程序)
- lexical analyzer(词法分析器)
- syntax(语法)
- syntax analyzer(语法分析器)
- LISt Programming Language,LISP(表处理解释语言)
- token(助记符)
- variable(变量)
- literal(字面值)
软件工程
软件生命周期
在软件生命周期中,开发过程包括四个阶段:分析、设计、实现和测试
开发过程模型
- 瀑布模型
开发过程只有一个方向的流动,前一个阶段不结束,后一个阶段不能开始,下一个阶段开始前每个阶段已经完成,难于定位,如果过程的一部分有问题,必须检查整个过程
- 增量模型
首先完成整个系统的简化版本,不包括具体的细节
分析阶段
生成规格说明文档,说明软件要做什么,可以使用两种独立的方法,依赖于实现阶段使用的是过程式编程语言,还是面向对象语言
面向过程分析(结构化分析或经典分析)
- 数据流图
显示系统中数据的流动,使用4种符号:方形盒表示数据源或数据目的,带圆角的矩形表示过程(数据中的动作或操作),末端开口的矩形表示数据存储的地方,箭头表示数据流
- 实体关系图
- 状态图
通常用于当系统中的实体状态在相应时间时将会改变的情况下
面向对象分析
- 用例图
给出系统的用户视图,显示用户与系统间的交互,使用四种组件:系统、用例、动作者和关系,系统(用矩形表示)执行功能,系统中的行动由用例显示,用圆角的矩形表示,动作者是使用系统的某人或某事 - 类图
- 状态图
为每个类准备
设计阶段
定义系统如何完成在分析阶段所定义的需求,系统所有的组成部分都被定义
面向过程设计
既要有设计过程,也要有设计数据,整个系统被分解成一组过程或模块
- 结构图
说明模块间关系 -
模块化
将大项目分解成能互相通信的小程序,以便容易理解和处理,主要关心两点:耦合和内聚- 耦合
对两个模块互相绑定紧密程度的度量,耦合度越高,独立性越差,应该让模块尽可能独立,需要让它们松散,使它们更可能被重用,不容易在相关模块中产生错误,允许只修改需要改变的模块,不会影响到不需要改变的模块 - 内聚
程序中处理过程相关紧密程度的度量,需要尽可能使软件系统间的内聚最大化
- 耦合
面向对象设计
类是由一组变量(属性)和一组方法组成
实现阶段
为面向过程设计中的模块编写程序或编写程序单元,实现面向对象设计中的类
语言的选择
面向过程开发中,通常使用纯过程语言;在面向对象情况下,使用面向对象语言
软件质量
高质量的软件系统是一个能满足用户需求、复合组织操作标准和能高效运行在其开发的硬件上的一个软件,如果需要取得高质量的软件系统,必须定义质量的一些属性
软件质量可以划分成三个广义的度量:可操作性、可维护性和可迁移性
-
可操作性
度量方法:准确性、高效性、可靠性、安全性、及时性和适用性- 不准确的系统比没有系统更糟糕,准确性通过诸如平均时间、每千行代码错误数、用户请求变更数这样的测量指标来度量
- 高效性是个主观的术语
- 可靠性综合了其他各种因素
- 一个系统的安全是以未经授权的人得到系统数据的难易程度为参照
- 及时性意味着系统是否及时传递它的输出;对于在线系统,相应时间是否满足用户需求
- 适用性看用户如何使用这个系统
-
可维护性
保持系统正常运行并及时更新为参照- 可变性是主观因素
- 可修正性的一种度量是恢复正常的平均时间,即程序发生故障后使程序恢复运行所花费的时间,是反应性定义
- 适应性是定性的属性,试图度量进行变动的难易程度
-
可迁移性
把数据和(或)系统从一个平台移动到另一个平台并重用代码的能力- 如果编写的模块可在其他系统中使用,那么具有很好的重用性
- 互用性是发送数据给其他系统的能力
- 可移植性是一种把软件从一个硬件平台转移到另一个硬件平台的能力
测试阶段
目的为了发现错误,需要良好的测试策略
白盒测试(玻璃盒测试)
基于软件内部结构,检查软件所有的部分是否全部设计出来,假定测试者知道软件的一切,使用白盒测试至少保证以下4条标准:
- 每个模块中的所有独立的路径至少被测试过一次
- 所有的判断结构(两路的或多路的)每个分支都被测试
- 每个循环被测试
- 所有数据结构都被测试
- 基本路径测试
在软件中每条语句至少被执行一次的方法,使用图论和圈复杂性找到必须被走过的独立路径 -
控制结构测试
- 条件测试
应用于模块中的任何条件,简单条件是关系表达式,复合条件是简单条件和逻辑运算符的组合,用来检查是否所有的条件都被正确设置 - 数据流测试
基于通过模块的数据流,选择测试用例,这些用例涉及检查被用在赋值语句左边的变量的值 - 循环测试
使用测试用例检查循环的正确性
- 条件测试
黑盒测试
不知道程序的内部也不知道程序如何工作情况下的测试
- 穷尽测试
用输入域中的所有可能的值测试软件 - 随机测试
选择输入域的值的子集来测试,子集的选择方式很重要 - 边界值测试
当遇到边界值时,错误经常发生
文档
是一个持续的过程
用户文档(用户手册)
告诉用户如何一步步使用软件包,通常包含一个教程指导用户熟悉软件包的各项特性
系统文档
定义软件本身,让原始开发人员之外的人能够维护和修改软件包,在系统开发的所有4个阶段都应该存在
- 分析阶段,收集的信息应该仔细地用文档记录,定义信息的来源
- 设计阶段,最终版本中用到的工具必须记录在文档中
- 实现阶段,代码的每个模块都应记录在文档中,代码应使用注释和描述头尽可能详细形成自文档化
- 测试阶段,对最终产品使用的每种测试,连同它的结果都要记录在文档中
技术文档
描述了软件系统的安装和服务
关键术语
- analysis phase(分析阶段)
- basis path testing(基本路径测试)
- black box testing(黑盒测试)
- class diagram(类图)
- cohesion(内聚)
- control structure testing(控制结构测试)
- coupling(耦合)
- data flow diagram(数据流图)
- design phase(设计阶段)
- development process(开发过程)
- documentation(文档)
- entity-relationship diagram(实体关系图)
- implementation phase(实现阶段)
- incremental model(增量模型)
- maintainability(可维护性)
- modularity(模块化)
- object-oriented analysis(面向对象分析)
- object-oriented design(面向对象设计)
- operability(可操作性)
- procedure-oriented analysis(面向过程分析)
- procedure-oriented design(面向过程设计)
- software engineering(软件工程)
- software life cycle(软件生命周期)
- software quality(软件质量)
- state chart(状态图)
- state diagram(状态图)
- structure chart(结构图)
- testing phase(测试阶段)
- transferability(可迁移性)
- use case diagram(用例图)
- waterfall model(瀑布模型)
- white-box testing(白盒测试)
数据结构
数组
元素的顺序集合,通常元素具有相同的数据类型,索引表示元素在数组中的顺序号,顺序号从数组开始处计数,数组元素通过索引被独立给出地址,可以使用循环读写和处理数组中元素,有些语言从0开始数组索引
数组名与元素名
- 数组名:整个结构的名字
- 元素名:允许查阅某个元素
存储配置
一维数组索引定义了元素在实际存储上的相对位置,二维数组表示行和列,大多数计算机使用行主序存储
数组操作
- 查找元素
可以对未排序的数组使用顺序查找,对排序的数组使用折半查找 -
元素的插入
- 尾部插入
- 开始或中间插入
- 元素的删除
需要移动元素 - 检索元素
随机地存取一个元素,达到检查或拷贝元素中数据的目地 - 数组的遍历
被应用于数组中每个元素上的操作
数组的应用
当需要进行的插入和删除操作数目较少,而需要大量的查找和检索操作时,数组是合适的结构
记录
一组相关元素的集合,可能是不同的类型,但整个记录有一个名称,记录中每个元素称为域,域是具有含义的最小命名数据,有类型且存在内存中,可以被赋值、被选择和操纵,域是记录的一部分,记录中元素都是关联的
记录名和域名
- 记录名:整个结构的名字
- 域名:存取域的名字
记录数组
定义元素的集合同时定义元素的属性
数组与记录数组
数组和记录数组都表示数据项的里列表,数组是记录数组的一种特例,每个元素只带一个域的记录
链表
有序数据的集合,每个元素包含下一个元素的地址,数据部分包含可用信息,并被处理,链将数据连在一起,包含一个指明列表中下一个元素的指针,一个指针变量标识该列表中的第一个元素,列表的名字就是该指针变量的名字
头指针为空的链表是空链表
链表中元素称为节点,节点至少包括两个域的记录:一个包含数据,另一个包含链表中下一个节点的地址
数组与链表
区别是数据项连接在一起的方式,记录数组中,连接工具是索引;链表中,连接工具是指向下一个元素的链(或指向下一元素的地址)
数组的元素在内存中时一个接一个中间无间隔存储的,列表是连续的;链表中节点的存储中间是有间隔的,节点的链部分把数据项连接在一起
链表名与节点名
- 链表名:头指针的名字,指向表中第一个节点
- 节点名:节点在链表中没有明显的名字,只有隐含的名字,与指向节点的指针有关
链表操作
- 搜索链表
只能是顺序的,使用两个指针:pre(先前的)和cur(当前的) -
插入节点
首先使用搜索算法;如果搜索算法返回假,则允许插入;否则,终止插入,可能会发生4种情况:- 在空表中插入,新数据线作为第一个元素插入
- 在表的开始处插入,搜索算法返回假,pre指针指向空
- 在表的末尾插入,搜索算法返回假,cur指针值为空
- 在表中间插入,搜索算法返回假,两个指针都不为空
-
删除节点
首先进行搜索算法,如果返回真,则删除节点;否则,什么都不做,可能发生2种情况:- 删除首节点,pre指针为空,首节点被删除,cur指针指向首节点
- 删除中间或末尾节点
- 检索节点
检查或复制节点中所含数据的目的而随机访问节点;在检索前,链表需要被搜索,如果找到数据,那么被检索;否则,终止过程 - 遍历链表
需要一个步行指针,当元素被处理时,从一个节点移到另一个节点,开始遍历时,把步行指针指向链表中的首节点,然后使用循环,直到所有数据都被处理
链表的应用
链表是一种动态数据结构,表从没有节点开始,然后当需要新节点时,逐渐增长,节点容易删除,不需要移动其他节点,额外的开销是为每个节点含有一个额外的指针域,如果需要大量的插入和删除,那么链表是合适的结构,但搜索一个链表比搜索一个数组要慢
关键术语
- array(数组)
- column-major storage(列主序存储)
- data structure(数据结构)
- field(域)
- index(索引)
- link(链)
- linked list(链表)
- multi-dimensional array(多维数组)
- node(节点)
- null pointer(空指针)
- one-dimensional array(一维数组)
- pointer(指针)
- record(记录)
- row-major storage(行主序存储)
- two-dimensional array(二维数组)
抽象数据类型
背景
数据类型的定义和应用操作定义是抽象数据类型(ADT)背后的一部分概念,隐藏数据上的操作时如何进行的
简单抽象数据类型
许多编程语言已经定义了一些简单的抽象数据类型作为语言的整数部分
复杂抽象数据类型
对于一个ADT,用户不用关心任务是如何完成的,而关心能做什么,包含了一组允许程序员使用的操作的定义,这些操作的实现是隐藏的
抽象意味着:
- 直到一个数据类型能做什么
- 如何去做是隐藏的
定义
与对改数据类型有意义的操作封装在一起的数据声明
- 数据的定义
- 操作的定义
- 封装数据和操作
抽象数据类型的模型
应用程序只能通过接口访问公有操作,接口是公有操作和传给或从这些操作返回的数据的列表,私有操作是抽象数据类型内部用户使用的
实现
使用抽象数据类型,首先要实现,把它们存储在库中
栈
一种限制线性列表,表的添加和删除操作只能在一端实现,称为栈顶,如果插入一系列数据到栈中,然后移走它们,那么数据的顺序将被倒转,这种倒转属性也正是栈被称为后进先出(LIFO)数据结构的原因
栈的操作
-
建栈
stack(stackName)
stackName是要创建的栈的名字
-
入栈
在栈顶添加新的元素push(stackName, dataItem)
stackName是栈的名字,dataItem是要插在栈顶的数据
-
出栈
pop(stackName, dataItem)
stackName是栈的名字,dataItem是从栈中移走的数据
-
空
empty(stackName)
stackName是栈的名字
栈的抽象数据类型
定义:一种只能在一端存取的数据项表,该端称为栈顶
操作:
- stack:建立一个空栈
- push:在栈顶插入一个元素
- pop:删除栈顶元素
- empty:检查栈的状态
栈的应用
- 倒转数据
需要一组给定的数据,重新排序,使得首尾元素互换,中间所有元素也相应进行交换 - 配对数据
编译器使用栈来检查所有的开括号都与闭括号配对
栈的实现
既可以使用数组也可以使用链表来实现
队列
一种线性列表,表中数据只能在尾部的一端插入,在头部的一端删除,是先进先出(FIFO)结构
队列的操作
-
建队列
queue(queueName)
queueName是建立的队列的名字
-
入列
enqueue(queueName, dataItem)
queueName是队列的名字,dataItem是要在队列尾部插入的数据
-
出队
dequeue(queueName, dataItem)
queueName是队列的名字,dataItem是从队列中删除的数据
-
空
empty(queueName)
queueName是队列的名字
队列的抽象数据类型
定义:队列是一种线性列表,该表中的数据只能在称为头部的一端删除,并且只能在称为尾部的一端插入
操作:
- queue:创建一个空的队列
- enqueue:在尾部插入一个元素
- dequeue:在头部删除一个元素
- empty:检查队列的状态
队列的应用
在所有的操作系统以及网络中都有队列的身影,例如完成对作业或对系统设备的处理
队列的实现
可以使用数组或者链表来实现
数组实现中,有三个域的记录:
- 存储队列的信息
- 含有队首元素序号的一个整数
- 含有队尾元素序号的一个整数
广义线性表
插入和删除等操作可以再任何地方进行的表
具有以下特性:
- 元素具有相同类型
- 元素按顺序排列
- 除了第一个元素以外每个元素都有唯一的前驱;除了最后一个元素以外每一个元素都有后继
- 每个元素是一个带有关键字段的记录
- 元素按关键字值排序
广义线性表的操作
-
建表
list(listName)
listName是要建立的广义表的名字
-
插入
insert(listName, element)
必须保持元素顺序的方式下进行
-
删除
delete(listName, target, element)
target是与表中元素关键字具有相同类型的数据值
-
检索
retrieve(listName, target, element)
-
遍历
traverse(listName, action)
-
空
empty(listName)
广义线性表的抽象数据类型
定义:一个有序的数据项表,所有的项具有相同的类型
操作:
- list:创建一个空表
- insert:在表中插入一个元素
- delete:从表中删除一个元素
- retrieve:从表中检索一个元素
- traverse:顺序地遍历表
- empty:检查表的状态
广义线性表的应用
可应用于元素被随机存取或顺序存取的情况
广义线性表的实现
既可以使用数组也可以使用链表来实现
数组实现中,有两个域的记录:
- 存储数组的信息
- 表中当前数据项的数目
树
一组有限的元素,称为节点(或顶点),同时包括一组有限的有向线段,用来连接节点,称为弧,有一个节点没有进入的弧,称为根,其他节点都可以沿着从根开始的唯一路径到达,该路径是指一系列相邻连接的节点序列
顶点可以分成三类:根、叶子和内部
从一个给定节点可以直接到达的节点称为子节点;从其出发子节点可以直接到达的节点称为双亲;具有相同双亲的节点称为兄弟节点;节点的子孙是指从该节点出发可以到达的所有节点,从其出发所有的子孙都可以到达的节点称为祖先
二叉树
没有一个节点所含有的子树的个数超过两个,任何一个节点只可能有0、1或2棵子树,这些子树被称为左子树和右子树
二叉树的递归定义
二叉树是一颗空树或由一个根节点和两棵子树构成,而每棵子树也是二叉树
二叉树的操作
二叉树的遍历
-
深度优先遍历
- 前序遍历 按照根、左子树和右子树的顺序访问,前缀pre表示根在子树前面被处理
- 中序遍历 按照左子树、根和右子树的顺序访问,前缀in表示根在子树之间被处理
- 后序遍历 按照左子树、右子树和根的顺序访问,前缀post表示根在子树之后被处理
- 广度优先遍历
先处理节点的所有子节点,然后进行下一层
二叉树的应用
- 赫夫曼编码
一种压缩技术,使用二叉树生成一个符号串的可变长度的二进制编码 - 表达式树
一个算术表达式可以使用三种格式表示:中缀、后缀和前缀来表示,三者之间的转换的一种方法就是建立表达式树,根和内部节点为操作符,叶子是操作数
二叉树的实现
既可以使用数组实现也可以使用链表实现
二叉搜索树(BST
一种具有额外特性的二叉树,每个节点的关键字值大于左子树中所有节点的关键字值,而小于右子树中所有节点的关键字值
采用中序遍历时,被访问的元素以升序排列
可以对二叉搜索树使用折半查找
二叉搜索树的抽象数据类型
与具有相同操作的广义线性表所定义的抽象数据类型类似
二叉搜索树的实现
即可以使用数组也可以使用链表来实现,链表更为常见并效率更高,使用带有两个指针的节点:左指针和右指针
图
由一组节点(称为顶点)和一组顶点间的连线(称为边或弧)构成的一种抽象数据类型,节点可以有一个或多个双亲,可能是有向的或无向的
有向图:连接两个顶点的边都有一个从顶点到另一个顶点的方向
无向图:边没有方向
关键术语
- abstract data type,ADT(抽象数据类型)
- ancestor(祖先)
- arc(弧)
- binary search tree,BST(二叉搜索树)
- binary tree(二叉树)
- breadth-first traversal(广度优先遍历)
- child(孩子节点)
- depth-first traversal(深度优先遍历)
- dequeue(出列)
- descendant(子孙)
- digraph(有向图)
- directed graph(有向图)
- edge(边)
- enqueue(入列)
- first in,first out,FIFO(先进先出)
- front(头部)
- general linear list(广义线性表)
- graph(图)
- Huffman coding(赫夫曼编码)
- infix(中缀)
- inorder traversal(中序遍历)
- interface(接口)
- internal node(内部节点)
- last in,first LIFO(后进先出)
- leaf(叶子)
- node(节点)
- parent(双亲)
- path(路径)
- pop(出栈)
- postfix(后缀)
- postorder traversal(后序遍历)
- prefix(前缀)
- preorder traversal(前序遍历)
- push(入栈)
- queue(队列)
- rear(尾部)
- root(根)
- sibling(兄弟节点)
- stack(栈)
- subtree(子树)
- tree(树)
- undirected graph(无向图)
- vertex(顶点)
文件结构
文件是作为一个单元看待的外部相关数据的集合,主要作用是存储数据,文件存储在辅助存储设备或二级存储设备中
存取方法
决定了如何检索记录:顺序的或随机的
顺序存取
顺序地存取记录(一个接一个,从头到尾),使用顺序文件结构
随机存取
存取某一特定记录而不用检索其之前的所有记录,使用随机存取的文件结构,两种文件结构都允许随机存取:索引文件和散列文件
顺序文件
记录只能按照顺序从头到尾一个接一个地进行存取,记录被一个接一个地存储到辅助存储器(磁带或磁盘)中,并在最后的记录加上EOF(文件末尾)的标志
更新顺序文件
必须定期更新,反映信息的变化
-
需要更新的文件
一共有4个文件:新主文件、旧主文件、事务文件和错误报告文件,根据关键字值分类这些文件,更新完成之后,新主文件要被送到脱机存储器中,直到再次需要为止,当文件被更新时,主文件将从脱机存储器中检索返回,称为旧文件- 新主文件:新的永久数据文件,包含大部分当前数据
- 旧主文件:需要更新的永久文件,在更新后,旧主文件作为参考将继续保留
- 事务文件:包含将要对主文件作的改变,一共有三种基本类型的改变。添加事务包含将要追加到主文件中的新数据;删除事务把将要从文件中删除的记录标识出来;更新事务包含对文件中特定记录的修改,处理事务需要键,就是文件中一个或多个能唯一标识数据的字段
- 错误报告文件,发生错误时,应向用户报告错误,包含在数据更新时所发现的错误清单,并且提供给用户以进行纠错操作
-
文件更新过程
- 如果事务文件的键小于主文件的键,事务就是一个增加,则将事务追加到新主文件中
- 如果事务文件的键与主文件的键相同,则:
a. 如果事务是修改,则修改主文件数据
b. 如果事务是删除,则将数据从主文件中删除 - 如果事务文件的键大于主文件的键,则将旧主文件记录写入新主文件
- 有几种情况可能产生一个错误,错误被记录在错误报告文件中:
a. 如果事务定义追加一个旧主文件中已经存在的记录(相同键值)
b. 如果事务定义删除或修改一个旧主文件中不存在的记录
索引文件
由数据文件组成,是带索引的顺序文件,索引本身很小,只占两个字段:顺序文件的键和在键盘上相应记录的地址
- 整个索引文件都载入到内存中
- 搜索项目,用高校的算法查找目标键
- 检索记录的地址
- 按照地址,检索数据记录并返回给用户
散列文件
用一个函数来完成索引到地址的映射,无需额外的文件,用函数来寻找地址,不需要索引和伴随它的所有开销
散列方法
- 直接法
键是未经算法处理的数据文件地址,文件必须对每个可能的键都包含一个记录,保证没有其他方法所存在的同义词或冲突问题 - 求模法(除余散列法)
用文件大小去除键后,将余数加1作为地址,适用于任何列表大小,但一个为素数的列表大小要比其他的列表大小产生更小的冲突 - 数字析取法
选择从键中析取得数字作为地址 - 其他方法
平方中值法、折叠法、旋转法和伪随机法
冲突
有多于一个的键被散列为地址中的同一个地址,将列表中一些映射为同一地址的键称为同义词,由散列算法产生的地址称为内部(起始)地址,包含所有内部(起始)地址的区域称为主区
- 开放寻址
当发生冲突时,主区地址将查找开放的或空闲的记录来用于存放新数据,对于不能在内部地址中存放的地址,把该数据存储在内部地址的下一个地址中去 - 链表解决法
第一条记录存储在起始地址,包含了一个指向下一条记录的指针 - 桶散列法
桶是一个能接纳多个记录的节点 - 组合方法
组合多种方法
目录
用来组织文件,被表示为含有其他文件信息的一种特殊文件类型,告诉操作系统文件在辅助存储设备上的位置,以及文件的其他信息
目录被组织成树的抽象数据类型(ADT),除根目录外每个目录都有双亲,包含在另一个目录中的目录称为包含目录的子目录
UNIX操作系统中的目录
目录结构的顶部是一个称为根的目录,名字是根,但在与目录有关的命令中,被输入为正斜杠(/),每个目录可以包含子目录和文件
-
特殊目录
- 根目录:文件系统层次结构的最高层,是整个文件结构的根,没有父目录,属于系统管理员,只有系统管理员才能修改
- 主目录:首次登陆系统中,使用主目录,包含在其中创建的任何文件以及个人系统文件,也是个人目录结构的开始
- 工作目录(当前目录):用户会话中在任一点所在的目录
- 父目录:工作目录的直接上层目录
- 路径和路径名
绝对路径名:从根目录到文件的文件路径,是斜线字符(/)分隔的所有目录的列表
相对路径名:相对于工作目录的路径
文本文件与二进制文件
存储在存储设备上的文件是一个位的序列,可被应用程序翻译成一个文本文件或二进制文件
文本文件
一个字符文件,在内存存储器中不能包含整数、浮点数或其他数据结构,必须把它们转换成对应的字符格式
二进制文件
用计算机的内部格式存储的数据集合,数据可以是整型(包含其他表示成无符号整数的数据类型)、浮点型、字符型或其他数据结构(除了文件),只有当被程序正确地解释时才有意义
关键术语
- absolute pathname(绝对路径名)
- access method(存取方法)
- auxiliary storage device(辅助存储设备)
- binary file(二进制文件)
- bucket(桶)
- bucket hashing(桶散列法)
- collision(冲突)
- collision resolution(散列冲突解决法)
- current directory(当前目录)
- data file(数据文件)
- digit extraction hashing(数字析取散列法)
- direct hashing(直接散列法)
- directory(目录)
- division remainder hashing(除余散列法)
- error report file(错误报告文件)
- hashed file(散列文件)
- hashing method(散列文件)
- home address(内部(起始)地址)
- home directory(主目录)
- index(索引)
- indexed file(索引文件)
- inverted file(倒排文件)
- key(键)
- linked list resolution(链表解决法)
- modulo division(求模)
- new master file(新主文件)
- old master file(旧主文件)
- open addressing resolution(开放寻址解决法)
- parent directory(父目录)
- path(路径)
- prime area(主区)
- random access(随机存取)
- relative pathname(相对路径名)
- root directory(根目录)
- secondary storage(二级存储设备)
- sequential access(顺序存取)
- sequential file(顺序文件)
- synonym(同义词)
- text file(文本文件)
- transaction file(事务文件)
- working directory(工作目录)
数据库
引言
数据的存储传统上是使用单独没有关联的文件,有时称为平面文件,现在将所有这些平面文件组合成一个实体——一个数据库
定义
数据库是一个组织内被应用程序使用的逻辑相一致的相关数据的集合
数据库的优点
- 冗余较少
平面文件中存在大量冗余 - 避免不一致性
如果相同的信息被存储在多个地方,那么对数据的任何修改都需要在数据存储的所有地方进行 - 效率
数据库通常比平面文件的效率要高,因为数据库中信息存储在更少的地方 - 数据完整性
数据库系统更容易维护系统的完整性 - 机密性
如果数据是集中存放在一个地方,就更容易维护信息的机密性
数据库管理系统(DBMS)
定义、创建、维护数据库的一种工具,允许用户控制数据库中数据的存取,由5部分构成:硬件、软件、数据、用户和规程
- 硬件
允许物理上存取数据的计算机硬件系统 - 软件
允许用户存取、维护和更新物理数据的实际程序,可以控制哪些用户可以对数据库中的哪部分数据进行存取 - 数据
独立于软件的一个实体,使得组织可以在不改变物理数据及其存取方式的情况下,更换所应用的软件 -
用户
- 最终用户
直接从数据库中获取信息的用户,又可分为数据库管理员(DBA)和普通用户,数据库管理员拥有最大的控制权限,可以控制其他用户以及对数据库的存取,可以将一些特权授予其他用户并保留随时收回特权的能力,普通用户只能使用部分数据库和有限的存取 - 应用程序
数据库中数据的其他使用者,需要存取和处理数据
- 最终用户
- 规程
必须被明确定义并且由数据库用户遵循的规程或规则的集合
数据库体系结构
包含三层:内层、概念层和外层
内层
决定了数据在存储设备中实际存储位置,处理低层次的数据存取方法和如何在存储设备间传输字节,内层直接与硬件交互
概念层(公用层)
定义数据的逻辑视图、数据模式,数据库管理系统的主要功能都在该层,把数据内部视图转化为用户所看到的外部视图,是中阶层,使用户不必与内层打交道
外层
直接与用户(最终用户或应用程序)交互,将概念层的数据转化为用户所熟悉的格式和视图
数据库模型
定义了数据的逻辑设计,描述了不同数据之间的联系
层次模型
数据被组织成一颗倒置的树,每个实体可以有不同的节点,但只能有一个双亲,最顶端有一个实体,称为根
网状模型
实体通过图来组织,部分实体可通过多条路径来访问,没有层次关系
关系模型
数据组织成称为关系的二维表,没有任何层次或网络结构强加于数据上,但表或关系相互关联
关系数据库模型(RDBMS)
数据通过关系的集合表示
关系
关系是二维表,数据的外部视图就是关系或表的集合,但并不代表数据以表的形式存储,数据的物理存储与数据的逻辑组织的方式毫无关系
关系数据库管理系统的关系的特征:
- 名称:每一种关系具有唯一的名称
- 属性:每一列都称为属性,属性在表中是列的头,每个属性表示了存储在该列下的数据的含义,每列在关系范围内有唯一的名称,属性总数称为关系的度,属性名不存储在数据库中,概念层中使用属性给每列赋予一定的意义
- 元组:关系中的行,元组定义了一组属性值行的总数叫关系的基数,当增加或减少元组时,关系的基数会改变。实现了动态数据库
关系的操作
描述成在数据库查询语言SQL(结构化查询语言)中定义
结构化查询语言(SQL)
用于关系数据库上的标准化语言,是一种描述性语言,使用者不需要一步步编写详细的程序而只需声明
插入
是一元操作,应用于一个关系,在表中插入新的元组
insert into RELATION-NAME
values(..., ...., ...)
value子句定义了要插入的相应元组的所有属性,字符串的值要用引号括起来
删除
是一元操作,根据要求删除表中相应的元组
delete from RELATION-NAME
where criteria
删除条件是由where子句定义的
更新
是一元操作,应用于一个关系,用来更新元组中的部分属性值
update RELATION-NAME
set attribute1 = value1, attribute2 = value2, ...
where criteria
要改变的属性值定义在set子句中,更新的条件定义在where子句中
选择
是一元操作,应用于一个关系并产生另一个新关系,元组(行)是原关系元组的子集,根据要求从原表中选择部分元组
select *
from RELATION-NAME
where criteria
*(星号)代表所有的属性都被选择
投影
是一元操作,应用于一个关系并产生另一个新关系,属性是原表中属性的子集,得到的信管系中的元组属性减少,元组的数量保持不变
select attribute-list
from RELATION-NAME
新关系的列名被显式地列出
连接
是二元操作,基于共有的属性把两个关系组合起来
select attribute-list
from RELATION1, RELATION2
where criteria
属性表是两个输入关系的属性组合,条件明确定义作为相同属性的属性
并
是二元操作,将两个关系组合并成一个新的关系,两个关系必须有相同的属性
select *
from RELATION1
union
select *
from RELATION2
交
是二元操作,两个关系必须有相同的属性,新关系中的每个元组必须是两个原关系中共有的成员
select *
from RELATION1
intersection
select *
from RELATION2
差
是二元操作,应用于具有相同属性的两个关系,新关系是那些存在第一个关系中而不在第二个关系中的元组
select *
from RELATION1
minus
select *
from RELATION2
数据库设计
- 与数据库潜在用户面谈,收集需要存储的信息和每个部门的存取需求
- 建立一个实体关系模型(ERM)
实体关系模型
建立实体关系(E-R)图表示那些信息需要保存的实体和实体间的关系
- 矩形表示实体集
- 椭圆形表示属性
- 菱形表示关系集
关系可以是一对一、一对多、多对一和多对多
从E-R图到关系
- 实体集上的关系
对于E-R图中的每个实体集,都要创建一个关系(表),这些关系有n个列,对应于这个集合所定义的n个属性 - 关系集上的关系
对E-R图中的每个关系集,都创建一个关系(表),这个关系中有一个列对应于这个关系所涉及的每个实体集的关键字,如果关系有属性的话,这个关系可以有关系本身的属性对应的列
规范化
是一个处理过程,通过此过程给定的一组关系转化成一组具有更坚固结构的新关系,允许数据库中表示的任何关系,允许像SQL使用由原子操作组成的回复操作,要移出插入、删除和更新操作中的不规范,减少新的数据类型被加入时对数据库重建的需要
定义了一组层次范式
- 第一范式(1NF)
把实体或关系转换成表格式的关系时,可能有些关系的行或列的交集有多个值 - 第二范式(2NF)
在每个关系中,需要有一个关键字(主键),所有其他属性都依赖于它,如果每一个非关键字属性都依赖于整个复合关键字,那么这个关系就是第二范式的 - 其他范式
使用属性间更复杂的依赖关系
其他数据库模型
分布式数据库
基于关系模型,数据库中的数据存储在一些通过因特网(或一些私有的广域网)通信的计算机上,每台计算机(或站点)拥有部分或全部数据库,数据或是分别存储在每个站点或是为每个站点所复制
- 不完全的分布式数据库
数据是本地化的,本地使用的数据存储在相应站点上,访问大部分情况下是本地的,但偶尔又是全局的,虽然站点对存储的本地数据具有完全控制权,但通过因特网,还存在一个全局的控制 - 复制式的分布式数据库
每个站点都有其他站点的一个完全副本,对一个站点数据的修改会在其他站点的副本数据上重复
面向对象数据库
试图保留关系模型优点的同时允许应用存取结构化数据,定义了对象和它们的关系,每个对象可以具有属性并以域的形式表达,通常使用的查询语言是XML
关键术语
- attribute(属性)
- cardinality(基数)
- conceptual level(概念层)
- database(数据库)
- database management system,DBMS(数据库管理系统)
- database model(数据库模型)
- delete operation(删除操作)
- difference operation(差操作)
- distributed database(分布式数据库)
- Entity-Relation(E-R)diagram(实体关系图)
- Entity-Relationship Model,ERM(实体关系模型)
- external level(外层)
- fragmented distributed database(不完全的分布式数据库)
- hierarchical model(层次模型)
- insert operation(插入操作)
- internal level(内层)
- intersection operation(交操作)
- join operation(连接操作)
- network model(网状模型)
- Normal Form,NF(范式)
- normalization(规范化)
- object-oriented database(面向对象数据库)
- project operation(投影操作
- relation(关系)
- relation database management system,RDBMS(关系数据库管理系统)
- relational model(关系模型)
- replicated distributed database(复制式的分布式数据库)
- select operation(选择操作)
- tuple(元组)
- union operation(并操作)
- update operation(更新操作)
数据压缩
发送或存储更少的位数,一般有两类方法:无损压缩和有损压缩
无损压缩
数据的完整性受到保护,原始数据与压缩和解压后的数据完全一样,并且是完全相反的两个过程,处理过程中没有数据丢失,冗余的数据在压缩时被移走,在解压时再加回去
游程长度编码
最简单的压缩方法,可压缩由任何符号组成的数据,不需要知道字符出现频率的有关知识(赫夫曼编码需要),当数据中由0和1表示时十分有效
将数据中连续重复出现的符号用一个字符和这个字符重复的次数代替,使用固定位数的数字(2位)来表示数
赫夫曼编码
对出现更为频繁的字符分配较短的编码,对出现较少的字符分配较长的编码,在给每个字符分配位模式前,首先根据每个字符的使用频率给它们分配相应的权值
- 将全部字符排成一列,每个字符都是树的最底层节点
- 找出权值最小的两个节点并由它们合成第三个节点,产生一棵简单的二层树,新节点的权值由最初的两个节点的权值结合而成,这个节点在叶子结点的上一层,可以再与其他节点结合
- 重复步骤2,直到各个层的所有节点结合成为一棵树
给每个分支分配1位,从根开始,给左分支分配0,给右分支分配1,然后在其他各个节点重复这一模式
- 编码
没有一个编码是其他编码的前缀,在编码过程中不会产生二义性 - 译码
当接收方收到前两位数的时候,不必等到收到下一个位就可以译码,译码器可以即时明确地翻译出编码(在最小位数下)
Lempel Ziv编码(LZ)
基于字典的编码的一类算法的例子,是用其发明者的名字命名的,在通信会话的时候将产生一个字符串字典(一个表),如果接收和发送双方都有这样的字典,那么字符串可以由字典中的索引代替,减少通信的数据传输量
- 压缩
建立字典索引和压缩字符串,算法从未压缩的字符串中选取最小的子字符串,这些子字符串在字典中不存在,然后将这个子字符串复制到字典中并为它分配一个索引值,除了最后一个字母之外,其他所有字符被字典中索引代替,然后将索引和最后一个字母插入压缩字符串 - 解压
压缩的逆过程,从压缩的字符串中取出子字符串,尝试按照字典中所列出的记录还原相应的索引号对应的字符串
有损压缩
图像压缩:JEPG
一幅图像可以通过一个二维数组(表)来表示图像元素(像素),一张灰度图像被分成许多8×8的像素块,减少计算量,将图像变换成一个数的线性(矢量)集合来揭示冗余,这些冗余(缺乏变化的)可以通过使用前学过的无损压缩的方法除去
- 离散余弦变换(DCT)
每个64像素块都要用离散余弦变换进行变换,改变了64个值以使相邻像素之间的关系得以保持,但同时又能揭示冗余,P(x, y)定义了每个块上的值,T(m, n)定义了变换后的块的值
T(0, 0)是其他值的平均值,称之为DC值(直流)
T(m, n)中其余的值称为AC值
- 量化
生成T表后,值被量化以减少需要编码的位数,量化过程用一个常量来除位数,舍弃小数部分,通过一张量化表(8×8)定义如何量化每个值,除数取决于T表位置上的值,对每个特殊的应用程序优化位数和0的个数,过程不可逆 - 压缩
将表中的值读出并去掉多余的0,整个压缩过程以之字型斜角读取表,通常使用游程长度编码压缩以线性化之字形读取的位模式
视频压缩:MPEG
运动图像专家组(MPEG)用于压缩视频,一个运动的图像是一系列快速帧的序列,没个帧都是一幅图像,帧是像素在空间上的组合,视频是一幅接一幅发送的帧的时间组合,对每帧空间上的压缩和对一系列时间上的压缩
- 空间压缩 每一帧的空间压缩使用JPEG(或它的改进版),每一帧都是一幅图,可以单独压缩
- 时间压缩 多余的帧被丢弃
MPEG方法将帧分成三类:I-帧、P-帧、B-帧
- I-帧:内部编码帧,是一个独立帧,与其他任何帧无关,以周期性间隔出现
- P-帧:预帧,每个P-帧都从前面帧变化而来,变化不能覆盖大的部分
- B-帧:双向帧,与前面和后续的I-帧和P-帧有关,与过去和将来有关系,不会与另一个B-帧有关系
音频压缩
- 预测编码
样本间的差别被编码,通常用在语音上,已经定义的标准有:GSM、G.729和G.723.3 - 感知编码:MP3
用来创建CD质量音频,基于心理声学,在频率掩盖中,一个频率范围的高的声音可以部分或完全掩盖另一个频率范围的轻的声音;在时间掩盖中,一个高音可以短时间内降低听觉的灵敏度,甚至在声音停止之后
关键术语
- AC value(AC值)
- bidirectional frame,B-fame(双向帧)
- data compression(数据压缩)
- DC value(DC值)
- dictionary-based encoding(基于字典的编码)
- Discrete Cosine Transform,DCT(离散余弦变换)
- frequency masking(频率掩盖)
- Huffman encoding(赫夫曼编码)
- intracoded frame,I-fame(I-帧)
- Joint Photographic Expert Group,JPEG(联合图像专家组)
- Lempel Ziv(LZ)encoding(LZ编码)
- Lempel Ziv Welch(LZW)encoding(LZW编码)
- lossless data compression(无损数据压缩)
- lossy data compression(有损数据压缩)
- Motion Picture Expert Group,MPEG(运动图像专家组)
- MPEG audio layer 3,MP3(MPEG第三代音频压缩格式)
- perceptual encoding(感知编码)
- predicted frame(P-fame)(预帧)
- predictive encoding(预测编码)
- run-length encoding(游程长度编码)
- spatial compression(空间压缩)
- temporal compression(时间压缩)
- temporal masking(时间掩盖)
安全
引言
安全目标
- 机密性
保护信息机密,防止非授权访问,信息安全中最常见的方面 - 完整性
信息需要不停变化,应该由授权用户通过授权机制完成 - 可用性
一个组织创建和存储的信息需要对授权用户和应用程序是可用的
攻击
- 威胁机密性的攻击
包括嗅探和流量分析,嗅探是对数据的非授权访问和侦听数据;流量分析是入侵者通过再现流量监控收集其他类型的信息 - 威胁完整性的攻击
包括修改、假冒、回放和否认
修改是攻击者修改信息,使得信息对他们有利
回放是攻击者得到用户发送的消息的副本,过后设法回放它
否认是一种不同于其他类型的攻击,由通信双方中的一个来进行:发送者或接收者 - 威胁可用性的攻击
拒绝服务(DoS)攻击可能减慢或完全中断系统的服务,可能使系统变得非常忙碌而崩溃,或在一个方向上侦听消息的发送,使得发送系统相信涉及通信或消息的一方丢失了信息,需要再次发送这些信息
安全服务
- 数据机密性:用来保护数据,防止嗅探和流量分析
- 数据完整性:用来保护数据,防止攻击者修改、插入、删除和回复,可以保护整个信息或部分信息
- 验证:位于通信另一端的一方,提供了在连接建立时发送者和接收者的验证,也验证数据源
- 不可否认:防止数据的发送者或接收者的否认
- 访问控制:保护数据,防止非授权访问
技术
- 密码术
为向入侵者隐藏消息的含义而进行消息转换的科学和艺术
被定义为涉及三个不同的机制:对称密钥密码、非对称密钥密码和散列 - 隐写术
通过在消息上覆盖其他内容而隐藏消息
对称密钥密码术
- 明文:原始消息
- 密文:通过信道发送的消息
- 创建密文:使用加密算法和共享的密钥
- 从密文创建明文:使用解密算法和相同的密钥
- 加密和解密算法称为密码,密钥是密码操作在其上的一组值(数字)
传统的对称密钥密码术分为两大类:传统对称密钥密码和现代对称密钥密码
传统密码
- 替换密码
用一个符号替换另一个符号,如果明文中的符号是字母表的字符,用另一个字符代替,最简单的替换密码是移位密码 - 置换密码
改变符号的位置,符号的重新排序
现代对称密钥密码
面向二进制位,明文、密文和密钥都是二进制位的串
- 数据加密标准(DES)
美国国家标准技术研究院于1997年发布的一种对称密钥块密码,在加密点,DES用64位明文并建立64位密文;在解密点,DES用64位密文建立64位明文,加密和解密密码替换和重复了十次的移位单元的复杂组合 - 高级加密标准(AES)
目的为了克服DES缺点
非对称密钥密码术
有不同的密钥:私钥和公钥
- 明文/密文
被当作整数来对待,加密前,消息必须被编码成一个长整数(或一组长整数),在解密之后整数(或一组整数)必须被译码成信息,通常被用来加密或译码少量信息 - 加密/解密
应用于表示明文和密文的数字上的数学函数,最常用的公钥算法是RSA算法
对称密钥方法和非对称密钥方法的比较
密码记号的数目
对称密钥密码术中,秘密的记号必须双方共享
非对称密钥密码术中,记号不共享,每一方创建自己的记号
两个系统的一个共同需要
在对称密钥密码术中,符号被置换或替代
在非对称密钥密码术中,对数字进行操作
其它安全服务
消息完整性
一种方法是通过使用指纹,文件和指纹对的电子等价物就是消息和摘要对,消息要通过一个称为密码散列函数的算法保证消息的完整性
文件/指纹和消息/消息摘要是相似的,文件和指纹在物理上链接在一起,消息和消息摘要可以单独不链接
消息验证
由密码散列函数创建的摘要通常称为修改检测码,代码能检测出消息中的任何修改,对于消息验证,需要消息验证码
数字签名
作为消息发送者的身份
- 通常的签名是包含在文档里的,是文档的一部分,数字签名把签名作为一个单独的文档发送,发送者发送两个文档:消息和签名,接收者收到两个文档,验证签名是否属于假定的发送者
- 通常的签名,接收者接收一个文档,比较文档上的签名与文件中的签名;对于数字签名,接收者接收到消息和签名,签名的副本不再保存,接收者需要应用验证技术组合消息和签名,验证发送者身份
- 一个人使用的签名签署许多文档,每条消息独有自己的签名,一条消息的数字签名不能用在另一条消息上
- 通常签名允许签署文档的副本与文件中的原始件有点不同,对于数字签名,除非在文档有时间因子,否则没有这样的不同
- 数字签名的过程
发送者使用签名算法部署信息,消息和签名被发送给接收者,接收者收到消息和签名,使用验证算法结合,如果结果为真,消息被接受,否则消息被拒绝
数字签名需要公钥系统,签署者用私钥签署,验证着使用签署者的公钥验证
密码系统使用接收者的私钥和公钥;数字签名使用发送者的公钥和私钥 - 签署摘要
比消息本身短得多,一个仔细选择的消息摘要与消息具有一对一的关系,身份证可以签署消息摘要,接收者可以验证消息摘要 -
服务
- 消息验证
也称为数据起源验证 - 消息完整性
如果消息变了,就不可能抽取相同的签名 - 不可否认性
可以通过可信的第三方来保证 - 机密性
数字签名不提供机密通信
- 消息验证
实体验证
使得一方证明另一方身份的一种技术,一个实体可以是一个人、一个过程、一个客户端或一个服务器,身份需要证明的实体称为要求者,试图证明要求者身份的一方称为证明者
-
数据起源与实体验证
- 消息验证(数据起源验证)可能不会实时发生,而实体验证会
- 消息验证简单地验证一则消息,这个过程需对每则新消息重复,实体验证可在一整个会话期间内验证要求者
-
验证分类
要求者必须向证明者标识自己- 所知道的:一种只有要求者直到的秘密,证明着可以通过它来检查要求者
- 所拥有的:能证明要求者的身份
- 所固有的:要求者内在固有的特性
- 口令
要求者知道的一些东西 - 质询-响应
要求者能证明他知道秘密而不需要暴露,质询是一个随时间变化的值 - 零知识
要求者不暴露任何危机秘密的机密性东西 -
生物测定
标识一个人的生理上或行为上特征的测量,使用内在固有的东西进行身份验证,生物测定测量的特性是不能猜测的、被偷的或共享的,生物测定需要几个部件:捕捉设备、处理器和存储设备,捕捉设备像阅读器或感应器测量生物的特性,处理器把测量的特性转变成适合保存的数据类型,存储设备保存身份验证的处理结果
注册:使用任何生物技术作为身份验证之前,在授权团体中每个人相应的特性必须已经在数据库中
生物监测技术可以分成两类:物理上的和行为上的- 物理上的技术测量人体物理特征,用作证明或标识
- 行为上的技术测量某些人的行为特性,需要被监控,保证要求者行为正常,没有刻意模仿他人,包括:签名识别和击键识别
密钥管理
每个实体需要创建一对密钥,并把公钥安全地分发给团体,定义了创建密钥的过程和安全密钥分发
对密钥的分发
使用可信的第三方,被称为密钥分发中心(KDC),每个人与KDC建立一个共享的密钥,一个双方间的会话对称密钥只被使用一次
公钥分发
公钥密码术中,每个人有权访问每个人的公钥,公钥对公众可用
- 公开声明
不安全,可能被伪造 - 可信中心
保持公钥目录,每个人可以选择一个私钥和一个公钥,保存好私钥,递交公钥,插入目录中,要求每个人在中心注册并证明身份,相应有关公钥的任何查询 - 认证机构
建立公钥证书
认证机构(CA),是一个把公钥和实体捆绑在一起并处理认证的政府机构,本身有不能伪造的众所周知的公钥
关键术语
- access control(访问控制)
- Advanced Encryption Standard,AES(高级加密标准)
- asymmetric-key cryptography(非对称密钥密码术)
- asymmetric-key encipherment(非对称密钥密码)
- authentication(验证)
- availability(可用性)
- biometrics(生物测定)
- Caesar cipher(凯撒密码)
- certification authority(认证机构)
- cipher(密码)
- ciphertext(密文)
- confidentiality(机密性)
- cryptographic hash function(密码散列函数)
- cryptography(密码术)
- data confidentiality(数据机密性)
- Data Encryption Standard,DES(数据加密标准)
- data integrity(数据完整性)
- decryption algorithm(解密算法)
- denial of service(拒绝服务)
- digital signature(数字签名)
- encryption algorithm(加密算法)
- entity authentication(实体验证)
- hashing(散列)
- integrity(完整性)
- key-distribution center(密钥分发中心)
- masquerading(假冒)
- message authentication code(消息验证码)
- message digest(消息摘要)
- modification(修改)
- National Institute of Standards and Technology,NIST(美国国家标准技术研究院)
- nonrepudiation(不可否认)
- password-based authentication(基于口令的验证)
- plaintext(明文)
- public-key certificate(公钥证书)
- replaying(回复)
- repudiation(否认)
- secret key(密钥)
- security attack(安全攻击)
- shift cipher(移位密码)
- snooping(嗅探)
- something inherent(所固有的)
- something possessed(所拥有的)
- something known(所知道的)
- steganography(隐写术)
- substitution cipher(替换密码)
- symmetric-key encipherment(对称密钥密码)
- symmetric-key encryption(对称密钥加密)
- traffic analysis(流量分析)
- transposition cipher(置换密码)
- verifying algorithm(验证算法)
- zero-knowledge authentication(零知识验证)
计算理论
简单语言
可仅用三条语句定义一种语言,包括:递增语句、递减语句和循环语句
递增语句
对变量加1,格式为:
incr (x)
递减语句
对变量减1,格式为:
decr (x)
循环语句
在变量值不为0时,重复进行一个动作(或一系列动作),格式为:
while (x)
{
decr (x)
Body of the loop
}
简单语言的威力
-
简单语言中的宏
把每次模拟称为一个宏,并在其他模拟中使用时不需要再重复其代码- 第一个宏:x ← 0,有时叫做清空变量
- 第二个宏:x ← n,清空变量x,然后对x递增n次
- 第三个宏:y ← x
- 第四个宏:y ← y + x
- 第五个宏:y ← y * x
- 第六个宏:y ← y^x
- 第七个宏:if x then A
- 其他宏
- 输入和输出
Read x语句可以使用(x ← n)来模拟
图灵机
图灵机组成部件
- 磁带
任何时候只能保存一系列顺序字符,该字符来源于计算机所能接收的字符集中 - 读/写头
任何时刻总是指向磁带上的一个符号,称为当前符号,每次在磁带上读写一个符号,每读写完一次后,向左移、向右移或者留在原地,读、写和移动都是在控制器指令下进行的 - 控制器
类似于现代计算机中央处理单元的一个部件,是一个有限状态的自动机,有预定的有限个状态并能根据输入从一个状态转移到另一个状态,但任何时候只能处于这些状态中的一种
对简单语言的模拟
- 递增语句
控制器有4个状态,从S1到S4,状态S1是开始状态,状态S2是右移的状态,状态S3是左移的状态,状态S4是停机状态,如果机器到达停机状态,机器就停止,没有指令从这个状态开始 - 递减语句
控制器有3个状态,从S1到S3,状态S1是开始状态,状态S2是检查语句,检查当前符号是1还是b,如果是b,进入停机状态,如果是1,第二条语句把它改成b,然后进入停机状态 - 循环语句
假定x和循环体处理的数据存储在磁带上,中间以单个空白符号相隔
控制器有3个状态,从S1到S3,通过判断x的值,如果x=0,就退出循环,状态MR把读/写头移过在每次重复中在处理数据开始时定义了数据开始位置的空白符号,状态ML把读/写头移过在每次重复中处理数据结束时定义了x的开始位置的空白符号,状态BS定义了循环体的开始状态,状态BH定义了循环体的停机状态
邱奇-图灵论题
如果存在一个能完成一个符号操纵任务的算法,那么也存在一台完成这个任务的图灵机
哥德尔数
一个无符号数能被分配给任何用特定语言编写的程序,这个数称为哥德尔数
- 程序可以作为单一数据项输入给其他程序
- 程序可以通过它的整数表示来引用
- 该编号方式可以用来证明有一些问题计算机并不能解决,从而说明世界上问题的数量远远比曾经编写的程序数量要多得多
表示一个程序
可以通过唯一的正整数来表示用简单语言编写的任何程序
- 将每一个符号用表中所给的对应十六进制代码替代
- 将最后的结果(十六进制)转化为无符号整数
翻译一个数字
- 将数字转换成十六进制数
- 用表将每个十六进制数翻译成对应的符号(忽略0)
并不是所有的数字都能解释为合法程序
停机问题
停机问题无法解决
可解问题和不可解问题
不可解问题
无法用计算机解决的问题
可解问题
能够用计算机解决的问题
可解问题的复杂度
依赖于输入的数目
- 大O表示法
关心程序总体的数量级 - 多项式问题
如果程序的复杂度为O(logn)、O(n)、O(n²)、O(n³)、O(n^4)或O(n^k),则被称为多项式问题 - 非多项式问题
复杂度远比多项式问题复杂
关键术语
- big-O notation(大O表示法)
- Church-Turing thesis(邱奇-图灵论题)
- controller(控制器)
- decrement statement(递减语句)
- finite state automation(有限状态自动机)
- Godel number(哥德尔数)
- halting problem(停机问题)
- increment statement(递增问题)
- loop statement(循环语句)
- unsolvable problem(不可解问题)
- Turing machine(图灵机)
- tape(磁带)
- state(状态)
- solvable problem(可解问题)
- read/write header(读/写头)
- polynomial problem(多项式问题)
- non-polynomial problem(非多项式问题)
- macro(宏)
人工智能
引言
什么是人工智能
人工智能是对程序系统的研究,该程序系统在一定程度上能模仿人类活动,如感知、思考、学习和反应
图灵测试
提出了机器具有智能的一个定义,该测试的方法是简单地比较人类的智能行为和计算机的智能行为
智能体
能够智能地感知环境、从环境中学习并与环境进行交互的系统
- 软件智能体
一组用来完成特殊人物的程序 - 物理智能体
一个用来完成各项任务的可编程系统
编程语言
- LISP
一种操纵表的编程语言,把数据和程序都当成表,能改变自身,与智能体的理念相吻合,智能体能从环境中学习并改善自身行为 - PROLOG
一种能建立事实数据库和规则知识库的编程语言,能使用逻辑推理来回答那些可以从知识库中推导出来的问题
知识表示
语义网
使用有向图表示知识,顶点表示概念,边表示两个概念之间的关系
- 概念
被看成一个集合或一个子集,对象是集合中的成员 - 关系
一条边可以定义一个“子类”关系,这条边从子类指向超类;一条边可以定义一个“实例”关系,这条边从实例指向它所属的集合;一条边可以定义一个对象的属性;一条边可以定义一个对象的所有权
框架
数据结构用来表示相同的知识
- 对象
语义网中一个节点变成了一组框架中的一个对象,一个对象可以定义一个类,一个子类或类的一个实例 - 槽
语义网中的边被翻译成“槽”,槽的名字定义了关系的类型和构成关系的槽的值
谓词逻辑
表示复杂的事实
-
命题逻辑
由对世界进行逻辑推理的一组句子组成的一种语言- 运算符
包括五种:非、或、与、如果……那么、当且仅当 -
句子
递归定义如下:- 大写字母表示自然语言中的一个语句,他们是一个句子
- 两个常数值中的任意一个都是句子
- 如果P是句子,则非P也是句子
- 如果P和Q是句子,则PVQ、P^Q、P→Q和P←→Q都是句子
- 推演
从已知的事实中推导出新的事实
合法的推断指的是它的结论是前提的必然延续
当找不到反例时,论断就是合法的
- 运算符
-
谓词逻辑
表示句子的符号是原子的,不能分隔开它而发现各个组成部分中所含的信息,句子分成谓词和参数-
句子
定义为:- 一个带有n个参数的谓词,参数可以是一个常数、一个变量、一个函数
- 两个常数值(真和假)中的人一个都是句子
- 如果P是句子,则非P也是句子
- 如果P和Q是句子,则PVQ、P^Q、P→Q和P←→Q都是句子
-
量词
- 全称量词:表明变量所表示的全部对象某些事为真
- 存在两次:表明变量所表示的一个或多个对象某些事为真
- 推演
如果没有量词,一个论断的真假确认与命题逻辑完全相同,有量词时,判断变复杂
-
-
超谓词逻辑
- 高阶逻辑
扩展了谓词逻辑中全称量词和存在两次的范围,量词把变量x和y绑定到实例,可以使用量词捆绑那些代表属性和关系的变量 - 模态逻辑
包含了“could”、“should”、“may”等的表达式,表达句子中语法上的语气 - 时态逻辑
用一套时态运算符扩展了谓词逻辑 - 默认逻辑
假定判断的默认结论可以被接收,只要论断与知识库中内容相一致即可
- 高阶逻辑
基于规则的系统
使用一组规则来表示知识,能用来从已知的事实中推导出新的事实,表示当指定条件满足时什么为真,是一组“if……then……”语句,形式为:
if A then B 或 A → B
A为前提,B为结论,每条规则都是独立处理的,与其他规则没有关联
- 组成
由三部分组成:知识库、事实库和解释器
知识库:规则的数据库,包含一组预先建立的规则,这些规则能从给定事实中得出结论
事实库:包含知识库中的规则要使用的一组条件
解释器:一个处理器或控制器,把规则和事实组合在一起,有两种类型:正向推理和反向推理 - 正向推理
解释器用一组规则和一组事实来执行一个行动,这个行动可能是向事实库增加一条新的事实,或处理其他一些命令,解释器解释和执行规则,直到不再有要解释的规则
如果发生任何冲突,有两条不同的规则可以应用到一个事实上,或一条规则可以应用到两个事实上,系统要调用冲突处理过程解决,保证只有一个输出能被加到事实库中或一个行动被采取 - 反向推理
面对给出的结论,所有的规则检查所有的事实
过程从一个结论开始,如果结论已在事实库中,过程停止,结论得到验证,如果不在事实库中,系统查找结论在规则结论中的规则,验证这条规则中的每个事实,如果规则中的所有事实都在事实库中,那么得到验证
专家系统
抽取知识
专家系统建立在预先定义的相应领域专家经验基础上,从人类专家身上抽取知识,通常由知识工程师完成
- 知识工程师
专家拥有的知识通常是启发式的,是基于概率的,不确定的
专家常常用可以存放在知识库中的规则形式来描述知识是艰难的
知识获取只能通过与专家个人会面才能进行
抽取事实
基于事例,在事例中事实被收集或度量,然后进入系统,被推理机使用
-
体系结构
专家系统由7部分构成:用户、用户界面、推理机、知识库、事实库、解释系统和知识库编辑器- 用户
使用系统,从所提供的专家经验中获益的实体 - 用户界面
允许用户与系统交互 - 推理机
专家系统的心脏,使用知识库和事实库推导出要采取的动作 - 知识库
基于与相关领域专家的会面而得到的知识的集合 - 事实库
在专家系统中时基于事例的,对于每个事例,用户输入可用的或度量的数据进入事实库,推理机为这特殊的事例使用这些数据 - 解释系统
用来解释推理机得出的结论的合理性 - 知识库编辑器
- 用户
感知
理解通过感官接收到了什么
图像处理
人工智能的一个研究领域,处理通过像摄像机这样的智能体的人工眼睛而获得的对对象的感知,从外部世界获得二维图像,然后创建在场景中的这个对象的三维描述
- 边缘探测
图像处理的第一部,查找图像中的边缘在哪里,边缘定义了图像中的对象和背景间的边界,边缘显示了在表面、深度或亮度方面的不连续
利用像素点的亮度值从背景中找到对象的边界,最简单的方法是分异亮度矩阵 - 分段
把图像分成同构的段或区域,同构的定义随着方法的不同而不同,通常同构的区域是其中像素点亮度值变化平滑的区域,对象中两个不同区域的边界被找到
可以通过阈值化、分割和合并来进行分段 -
查找深度
帮助智能体测量对象距它多远,通常采用立体视觉和运动方法- 立体视觉(立体影像)
使用人类眼睛的技术来发现对象的深度 - 运动
当图中一个或多个对象移动时建立多幅图像,在场景中移动对象与其他对象间的相对位置能给出对象距离的提示
- 立体视觉(立体影像)
-
查找方向
- 光照
如果一个对象的不同表面的光学特性是相同的,那么反射光线的总量取决于反射光源的物体表面的方向 - 纹理
对查找方向或表面的曲率有所帮助
- 光照
- 对象识别
假定要识别的对象是一个复合的对象,由一组简单的几何形状体组成,原始的形状能在智能体的记忆中创建并存储 - 应用
应用领域有制造业,特别是在组装生产线上
语言理解
分成四个连续的步骤:语音识别、语法分析、语义分析和语用分析
- 语音识别
语音信号被分析,其中所含的单词序列被提取出来,输入的是连续的信号,输出的是单词的序列,信号需要被分割成不同的声音,有时称为“音素”,声音还需要组合到单词中 -
语法分析
定义单词在句子中如何组织 - 语义分析
在句子被语法分析之后提取出句子,建立了句子中所涉及的对象的表示方法、它们的关系以及它们的属性 - 语用分析
前面三个步骤能创建口语句子的知识表示,语用分析用来进一步明确句子的意图和消除歧
搜索
使用状态集合来求解问题,开始于一个起始状态,经过中间状态,最后到达目标状态,搜索过程所使用的的全部状态的集合称为搜索空间
搜索方法
-
蛮力搜索
对搜索没有任何先验的知识- 广度优先搜索:从树的根开始,在走向下一层前,检查当前层中的所有节点
- 深度优先搜索:从树的根开始,做一个向前搜索,直至发现目标或到达一个死端,如果到达了死端,回溯到最近的分支,然后再次向前搜索
- 启发式搜索
给每个节点赋一个称为启发值(h值)的定量值,这个定量值显示了该节点与目标节点间的相对远近
神经网络
试图使用神经元网络模仿人脑的学习过程
生物神经元
神经元有三部分组成:胞体、轴突和树突
胞体中含有细胞核:是处理器
树突起到输入设备的作用:接收其他神经元的输入
轴突起到输出设备的作用:把输出送到其他神经元
神经键是神经元的轴突和其他神经元的树突的连接点
神经元具有两种状态:兴奋和抑制,如果接收的信号总量达到一个阈值,身体就兴奋,触发一个输出信号,该信号传给轴突,最终传给其他的神经元,否则,神经元仍然处于抑制状态,不触发或产生输出
感知器
一个类似于单个生物神经元的人工神经元,带有一组具有权重的输入,对输入求和,把结果与阈值进行比较,如果结果大于阈值,感知器触发,输出1;否则,不触发,输出0
多层网络
几个层次的感知器组合起来,每一层的输出变成下一层的输入,第一层称为输入层,中间层称为隐藏层,最后一层称为输出层,输入层中的节点不是神经元,是分配器,隐藏的节点通常用来给上一层的输出加上权重
关键术语
- artificial intelligence(人工智能)
- axon(神经元)
- brute-force search(蛮力搜索)
- default logic(默认逻辑)
- dendrite(树突)
- image processing(图像处理)
- intelligence agent(智能体)
- LISP(LISP语言)
- modal logic(模态逻辑)
- neural network(神经网络)
- neuron(神经元)
- parser(词法分析器)
- perceptron(感知器)
- physical agent(物理智能体)
- pragmatic analysis(语用分析)
- predicate logic(谓词逻辑)
- PROLOG(PROLOG语言)
- propositional logic(命题逻辑)
- quantifier(量词)
- Turing test(图灵测试)
- thresholding(阈值)
- temporal logic(时态逻辑)
- syntactic analysis(语法分析)
- synapse(神经键)
- speech recognition(语音识别)
- soma(胞体)
- software agent(软件智能体)
- semantic network(语义网络)
- semantic analysis(语义分析)
- segmentation(分段)
- search space(搜索空间)
- rule-based system(基于规则的系统)
- high-order logic(高阶逻辑)
- heuristic search(启发式搜索)
- frames(框架)
- expert system(专家系统)
- edge detection(边缘检测)
《计算机科学导论》课后题答案: https://wenku.baidu.com/view/...