计算机科学常识整理

计算机科学(Computer Science)

计算机科学(CS; Computer Science)是系统性研究信息与计算理论基础以及它们在计算机系统中如何实现与应用的学科包含众多研究领域与数学工程学认知科学等联系密切

英国作家理查德·布雷斯韦特(Richard Braithwait)最早使用计算机一词以指示一种职业即负责计算的人之后才逐渐开始代表机器

计算机(Computer)指接受输入处理和存储数据并根据一系列指令产生输出的多用途设备狭义的计算机指个人计算机(PC; Personal Computer)即广泛应用于商业家庭和办公服务的计算机通用性强体积小且价格相对较低

算盘(Abacus)是公认最早的计算设备发明于美索不达米亚社会的规模超出个人心算的能力是制造算盘的原因算盘大致可分为沙盘算板和穿珠算盘三类算盘的进步体现于其拥有一套完整算术法则且具有存储功能

算盘属于手动式计算器需要使用者自行记录算法而机械式计算器可以大幅减少使用者的思考帕斯卡计算器(Pascaline; Pascal's Calculator)是由法国科学家布莱兹·帕斯卡发明的机械式计算器可以直接对两个数字进行加减运算并能通过重复加减运算以达到乘除运算的目的

莱布尼兹计算器(Leibniz's Calculator)又称步进计算器(Stepped Reckoner)则是最早能完成四则运算的机械式计算器德国数学家戈特弗里德·莱布尼兹因发明步进计算器和二进制计数系统被认为是第一个计算机科学家步进计算器的设计非常成功以至于沿用了三个世纪

查尔斯·巴贝奇(Charles Babbage)

英国数学家兼发明家计算机先驱计算之父

查尔斯·巴贝奇发明的差分机(Difference Engine)是一台由蒸汽驱动的更复杂的机器能够近似多项式差分机项目最终因不能制造出满足精度需求的齿轮而放弃但后人根据其草稿制作完成并能正常运行

查尔斯·巴贝奇的分析机(Analytical Engine)是通用目的计算机不只是进行一种特定运算分析机在当时过于超前也没有建造成功但其思想包含了许多现代计算机的概念激励了第一代计算机科学家

阿达·洛芙莱斯(Ada Lovelace)

英国数学家兼作家

阿达·洛芙莱斯为分析机编写了假想的程序详细说明了使用分析机计算伯努利数的方法被认为是史上第一位程序员她主张计算机不只可以用来算数也因此被认为是史上第一位认识计算机完全潜能的人

阿达·洛芙莱斯建议分析机用二进制存储

国际商用机械(IBM; International Bussiness Machines)

生产并销售计算机硬件及软件其前身为制表机器公司

哈佛马克1(Harvard Mark 1)又称自动序列控制计算器(ASCC; Automatic Sequence Controlled Calculator)是最大的机电计算机之一使用十进制的表示方式IBM为二战同盟国制造哈佛马克1号最早的用途是为曼哈顿计划模拟其指令集非常原始甚至没有跳转指令如果需要执行循环需要将纸带的两端连接起来

电子数值积分计算机(ENIAC; Electronic Numerical Integrator and Calculator)于宾夕法尼亚大学诞生是第一个真正的通用可编程电子计算机

计算理论(Theory of Computation)

即研究计算机基础能力和限制到何种程度的数学领域

可判定性问题(Decision Problem)

阿隆佐·邱奇(Alonzo Church)

美国数学家对计算理论的系统发展做出巨大贡献

可判定性问题即研究是否存在一种算法使输入逻辑语句后输出准确的是否判断阿隆佐·邱奇提出能表示任何计算的算子并证明了这样的算法存在

阿兰·马蒂森·图灵(Alan Mathison Turing)

计算机科学之父

阿兰·马蒂森·图灵的图灵机(Turing Machine)是一种理论计算设备将人的计算行为抽象化图灵证明了图灵机可以实现任何计算即计算能力等同于算子就可计算和不可计算而言没有计算机比图灵机更强大

人们用纸笔进行数学运算的过程可以看作如下两种简单动作在纸上写下或擦除某个符号将注意力从纸的一个位置移动到另一位置这又依赖于此人当前关注的纸上的某个位置的符号与此人当前思维的状态以此为基础图灵机由以下几个部分组成无限长的纸带读写头控制规则状态寄存器

如果一系列操作数据的规则可以用来模拟任何图灵机称为图灵完备(Turing Complete)

停机问题(Halting Problem)即是否存在程序对任意输入的程序能判定其会在有限时间结束(即停机)或死循环停机问题是一种可判定性问题图灵证明了存在解决停机问题的通用算法精要如下假设有能够判断停机问题的程序若输入的程序能停机则进入死循环若输入的程序不能停机则该程序进入停机状态将此程序作为此程序的输入则导致悖论

停机问题证明了不是所有问题都能用计算解决邱奇和图灵指出计算机的能力有限无论有多少时间或内存有些问题是计算机无法解决的进而起步了可计算性理论即邱奇-图灵论题(Church-Turing Thesis)

自动机(Automaton)

编译原理知识点整理

硬件(Hardware)

早期计算机使用机械继电器(Mechanical Relay)即用电控制的机械开关通过线圈产生的电磁场吸引金属臂而闭合电路其限制如下继电器内的机械臂有质量因此无法快速开关机械会随时间磨损随继电器数量增加故障概率也会增加

分立元件(Discrete Components)

分立元件即只有一个电路元件的组件可以是被动的(电阻电容电感等)或主动的(真空管晶体管等)提升性能需要追加大量部件而导致复杂设计的现象称为数字暴政(Tyranny of Numbers)

真空管(Vacuum Tube)是一种在电路中控制电子流动的电子元件每个真空管都能被设置为01两种状态之一真空管因比机械继电器反应快而计算速度更快但消耗大量的电能

第一支真空管是热电子管(Thermionic Valve)最简单的真空管即二极管(Diode)仅允许电流由单一方向流过即电子从阴极到达阳极三极真空管(Triode Vacuum Tube)取代机械继电器成为电子设备的基础

晶体管(Transistor)取代易碎的真空管通过门电路控制半导体材料的导电性半导体(Semiconductor)如硅和锗是处于导体和绝缘体之间的物质虽然晶体管更快更小更便宜且耗电更低更可靠但其出现并没有解决数字暴政的问题

集成电路(IC; Integrated Circuits)

集成电路是指将电路集中制造在半导体晶圆表面的小型化方式许多早期集成电路将很小的分立元件封装成一个独立单元其载体具有保护作用一些封装形式如下

  • 直插式封装(DIP; Dual Inline Package)通常具有两排针脚
  • 针脚网格阵列(PGA; Pin Grid Array)针脚分布于同心正方形上通常用于微处理器的封装

杰克·基尔比(Jack Killby)

德州仪器工程师集成电路的发明者

杰克·基尔比提出用锗制作集成电路但锗稀少且不稳定

罗伯特·诺伊斯(Robert Noyce)

仙童半导体和英特尔的共同创始人之一发展近代实用集成电路

仙童半导体使用蕴藏量丰富的硅制作集成电路也更稳定可靠

印刷电路板(PCB; Printed Circuit Board)通过刻蚀金属线的方式将零件连接可大规模生产集成电路焊接于印刷电路板上而印刷电路板是集成电路的载体

光刻(Photolithography)技术用光将复杂图案印到如半导体的材料上光刻的工艺步骤如下

  • 晶圆(Wafer)即半导体晶体圆形薄切片是集成电路的载体基片
  • 在硅层顶部加一层薄的氧化层(Oxide Layer)作为保护层
  • 然后加一层特殊化学品光刻胶(Photoresist)光刻胶被光照射后可溶
  • 光掩模(Photomask)与光刻胶配合使用包含转移到晶圆上的图案
  • 强光照射光照处光刻胶发生化学变化冲洗后暴露出氧化层
  • 冲洗氧化层露出的部分使刻蚀至硅层
  • 冲洗光刻胶

为使暴露的硅层导电性更好需要掺杂(Doping)通常使用高温气体例如磷生产复杂集成电路的工艺过程可能需要进行多次光刻流程

将光掩模聚焦到极小的区域制作出非常精细的细节晶体管越小要移动的电荷量越少能更快切换状态耗电更少电路更紧凑还意味着信号延迟更低时钟速度更快

戈登·摩尔(Gordon Moore)

英特尔的共同创始人之一提出摩尔定律

摩尔定律(Moore's Law)指出集成电路上可容纳的晶体管数目约每隔两年便会增加一倍

然而摩尔定律存在极限晶体管进一步小型化将面临如下问题由于光的波长光刻技术精度已达极限需要研制波长更短的光源以投射更小的图案晶体管非常小时电极之间可能只距离几个原子电子会跳过间隙导致晶体管漏电称量子隧穿效应(Quantum Tunneling)

软件(Software)

软件(Software)指计算机系统中的程序及其文档是一种逻辑实体不是有形的系统原件没有类似硬件的机械磨损和老化问题软件可分为如下几类

  • 系统软件(System Software)最靠近硬件的一层如操作系统编译器等
  • 支撑软件(Supporting Software)支撑软件开发维护和运行的软件如中间件数据库等
  • 应用程序(Application)特定领域专用的软件如浏览器等

编程语言(Programming Language)产生于计算机发明之前能够准确地定义指令以便执行

早期的计算机编程形式

约瑟夫·玛丽·雅卡尔(Joseph Marie Jacquard)发明可编程纺织机即雅卡尔纺织机(Jacquard Machine)是计算机历史的重要一步雅卡尔纺织机每一行的图案由可打孔的纸卡决定根据打孔的有无控制线的关系以达到编制不同花式的目的

自动演奏钢琴使用钢琴纸卷(Piano Roll)记谱其打孔位置与钢琴谱相符根据打孔的有无以控制钢琴的演奏

穿孔纸卡(Punch Card)用于记录数据和程序信息便宜且可靠过去曾用于美国人口普查

装载穿孔纸卡读取器的计算机将卡片内容写进内存程序和内容写入完毕即开始执行程序的输出也可以是穿孔纸卡即使简单程序也有数百条指令需要一叠纸卡存储为避免混乱会在一叠纸卡的侧面画对角线贤者系统(SAGE; Semi-Automatic Ground Environment)是供北美防空司令部使用的半自动地面防空系统是使用穿孔纸卡的最大型程序

穿孔纸带(Punch Tape)是穿孔纸卡的改良

可插拔插线板(Plugboard)供程序员插拔电线让机器的不同部分互相传输数据和信号编程复杂

面板编程(Panel Programming)即使用开关按钮和指示灯达到编程的效果面板编程流行于早期家用计算机因为外围设备(如穿孔纸卡读取器)是昂贵的

漏洞(Bug)得名于从哈佛马克2(Harvard Mark 2)故障继电器中拔出的死虫现在泛指软件出现的各种错误(Error)具体而言有如下的概念

根据语境的不同错误可指不正确的系统状态也可指程序员在编码过程中犯的错误即程序设计错误心智模式(Mental Model)指人们深植心中对于周遭世界如何运作的看法和行为而程序设计错误实际上反映的是程序程序员对该程序的心智模式两者的相异之处

  • 缺陷(Defect)多指存在于软件中的偏差静态地存在于软件内部可被某种条件激活是错误的成因通常被程序员或缺陷定位技术观察
  • 故障(Fault)软件运行时出现的意料外的状态
  • 失效(Failure)软件执行过程中的异常表现表现为与用户需求不一致因此是可被用户观察的

缺陷被激活可能导致故障而故障可能导致失效通常缺陷难以根据失效定位

葛丽丝·霍普(Grace Hopper)

美国海军军官哈佛马克1号的首批程序员之一

葛丽丝·霍普设计了高级语言A-0(Arithmetic Language version 0)创造了第一个编译器然而霍普的想法遭受质疑没有任何A-0的代码遗留下来A-0和之后的版本没有广泛使用

约翰·巴科斯(John Backus)

FORTRAN发明小组的组长巴科斯范式的提出者之一

FORTRAN(Formula Translation)编程语言由IBM发布主宰早期计算机编程最初FORTRAN代码只能在IBM计算机上执行

COBOL(Common Business-Oriented Language)CODASYL打造的通用编程语言CODASYL(Committee on Data Systems Languages)由葛丽丝·霍普担任顾问致力于开发能在不同机器上使用的通用编程语言

汇编语言(Assembly Language)

All discussed below are based on x86-64.

x86-64整数寄存器

Usage 64-bit Register Lower 32 Bits Lower 16 Bits Lower 8 Bits
Return Value %rax %eax %ax %al
Arguments %rdi
%rsi
%rdx
%rcx
%r8
%r9
%edi
%esi
%edx
%ecx
%r8d
%r9d
%di
%si
%dx
%cx
%r8w
%r9w
%dil
%sil
%dl
%cl
%r8b
%r9b
Caller-Saved
Temporaries
%r10
%r11
%r10d
%r11d
%r10w
%r11w
%r10b
%r11b
Callee-Saved
Temporaries
%rbx
%r12
%r13
%r14
%ebx
%r12d
%r13d
%r14d
%bx
%r12w
%r13w
%r14w
%bl
%r12b
%r13b
%r14b
- %r15 %r15d %r15w %r15b
- %rbp %ebp %bp %bpl
Stack Pointer %rsp %esp %sp %spl

Operand types are as follows.

  • Immediate: Constant integer data prefixed with $ such as $0x400, $-533;
  • Register: One of 16 integer registers such as %rax, %r13;
  • Memory: such as (%rax).

移动(Move)

The x86-64 mov instructions cover wide range of data movement forms.

x86-64移动指令的常见形式

Note that cannot do memory-memory transfer with a single instruction.

Src. Dest. Assembly C Analog
Immediate Register movq $0x4, %rax temp = 0x4;
Immediate Memory movq $-147, (%rax) *p = -147;
Register Register movq %rax, %rdx temp2 = temp1;
Register Memory movq $rax, (%rdx) *p = temp;
Memory Register movq (%rax), %rdx temp = *p;

x86-64寻址模式

Wherein, is called scale factor and can be 1, 2, 4 or 8. Also form like (, %rcx, 4) is allowed.

Modes Example Description
Immediate movq $-500, %rax
Register movq %rdx, %rax
Direct Addressing movq 2000, %rax
Indirect Addressing movq (%rdx), %rax
Base Displacement movq 40(%rdx), %rax
Scaled Index movq (%rdx, %rcx, 4), %rax
Scaled Index Displacement movq 80(%rdx, %rcx, 2), %rax

Some C expression can be optimized by arithmetic operations. An example is as follows.

Wherein, the statement is y = x * 48;.

1
2
leaq    (%rdi, %rdi, 2), %rax
salq $4, %rax

控制(Control)

Single bit registers are as follows.

Not set by lea instructions.

  • CF(Carry Flag): Set if carry out from most significant bit (unsigned overflow);
  • OF(Overflow Flag): Set if twos complement overflow (signed overflow);
  • ZF(Zero Flag): Set if result equals to zero;
  • SF(Signed Flag): Set if result less than zero.

Condition codes are usually related to the following instructions.

  • cmpq b, a: Like computing without setting destination;
  • testq b, a: Like computing without setting destination.

set instructions set low-order byte of destination to 0 or 1 based on combinations of condition codes. For example, setl means "less" and its condition is "SF xor OF". Also there exists synonym(同义指令), like setg and setnle.

set instructions do not alter remaining bytes, so typically use movzbl to finish job in condition codes. An example is as follows.

Wherein, the statement is return x > y;, x uses regiser %rdi and y uses regiser %rsi.

1
2
3
4
cmpq      %rsi, %rdi    # Compare x:y
setq %al # Set when >
movzbl %al, %eax # Zero rest of %eax (and rest of %rax)
ret

jmp instructions can jump to different part of codes. They help to build conditional branches. Assume that there exists conditional branches as follows.

1
2
3
4
5
long fun(long x, long y) {
long res;
if(x > y) res = x - y; else res = y - x;
return res;
}

The corresponding assembly code is as follows.

Wherein, x uses regiser %rdi and y uses regiser %rsi.

Require gcc settings –fno-if-conversion.

1
2
3
4
5
6
7
8
fun:    cmpq    %rsi, %rdi    # Compare x:y
jle .L4 # Jump when <=
movq %rdi, %rax
subq %rsi, %rax # x - y
ret
.L4: movq %rsi, %rax
subq %rdi, %rax # y - x
ret
1
2
3
4
5
6
7
fun:    movq      %rdi, %rax
subq %rsi, %rax # res = x - y
movq %rsi, %rdx
subq %rdi, %rdx # tmp = y - x
cmpq %rsi, %rdi # Compare x:y
cmovle %rdx, %rax # res = tmp, when <=
ret

Therefore, bad cases for conditional move are as follows.

  • Expensive Computations: value = c ? Hard1() : Hard2();;
  • Risky Computations: value = p ? *p : 0;;
  • Side Effects: value = x > 0 ? x *= 7 : x += 3;.

Assume that there exists switch statements as follows.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
long sw_ex(long x, long y, long z) {
long w = 1;
switch(x) {
case 1: // L3
w = y * z; break;
case 2: // L5 to L6
w = y / z;
/* Fall Through */
case 3: // L9 to L6
w += z; break;
/* No case 4 */
case 5: // L7
case 6:
/* Multiple Labels */
w -= z; break;
default: // L8
w = 2;
}
return w;
}

The corresponding jump table is as follows.

1
2
3
4
5
6
7
8
9
10
.section    .rodata
.align 8
.L4
.quad .L8 # x = 0
.quad .L3 # x = 1
.quad .L5 # x = 2
.quad .L9 # x = 3
.quad .L8 # x = 4
.quad .L7 # x = 5
.quad .L7 # x = 6

The corresponding assembly code is as follows.

Wherein, x uses regiser %rdi, y uses regiser %rsi and z uses register %rdx.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sw_ex:     movq     %rdx, %rcx         # Note that w not initialized here
cmpq $6, %rdi # Compare x:6
ja .L8 # Jump when x > 6 and x < 0 (unsigned)
jmp *.L4(, %rdi, 8) # Jump table
.L3: movq %rsi, %rax # case 1: w = y;
imulq %rdx, %rax # w *= z;
ret
.L5: movq %rsi, %rax # case 2: w = y;
cqto
idivq %rcx # w /= z;
jmp .L6 # goto merge;
.L9: movl $1, %eax # case 3: w = 1;
.L6: addq %rcx, %rax # merge: w += z;
ret
.L7: movl $1, %eax # case 5: case 6: w = 1;
subq %rdx, %rax # w -= z;
ret
.L8: movl $2, %eax # default: w = 2;
ret

Sparse(稀疏的) switch statements may use decision trees.

Usually put some bias to make sure that the first case is at value 0.

过程(Procedure)

The x86-64 stack is usually related to the following instructions.

  • pushq src: Decrement %rsp by 8, and write src at %rsp address;
  • popq dest: Increment %rsp by 8, and store value given by %rsp at dest(Must be a register).

push and pop are used to support procedure call and return.

The instruction pointer register %rip points to the next instruction to execute. Use call instruction to do procedure call. Caller invokes callee.

A stack frame is a memory management technique used in some programming languages for generating and eliminating temporary variables, and it consists of two parts as follows (From top to bottom).

  • Callee Stack Frame(Current Stack Frame): Stack pointer %rsp points here, an unused address block;
    • Argument Build Area(Optional): Parameters for function about to call;
    • Local Variables(If cannot keep in registers);
    • Saved Register Context;
    • Old Frame Pointer(Optional): Frame pointer %rbp points here.
  • Caller Stack Frame;
    • Return Address(Pushed by call instruction);
    • Arguments for this call.

Caller saves temporary values in its frame before the call. Callee saves temporary values in its frame before using and restores them before returning to caller.

Assume that there exists a function as follows.

1
2
3
4
5
long caller(long x) {
long v1 = 100;
long v2 = callee(&v1, 200);
return x + v2;
}

The corresponding assembly code is as follows.

Wherein, x uses regiser %rdi and the first parameter of callee reuses %rdi.

1
2
3
4
5
6
7
8
9
10
11
caller:    pushq    %rbx             # Callee-Saved
subq %16, %rsp
movq %rdi, %rbx # Puts x in %rbx
movq $100, 8(%rsp)
movl $200, %esi
leaq 8(%rsp), %rdi
call callee
addq %rbx, %rax
addq $16, %rsp
popq %rbx # Restore
ret

Assume that there exists a recursive function as follows.

1
2
3
4
long pcount(unsigned long x) {
if(x == 0) return 0;
else return (x & 1) + pcount(x >> 1);
}

The corresponding assembly code is as follows.

Wherein, x uses regiser %rdi.

1
2
3
4
5
6
7
8
9
10
11
pcount:    movl     $0, %eax
testq %rdi, %rdi
je .L6
pushq %rbx
movq %rdi, %rbx
andl $1, %ebx
shrq %rdi
call pcount
addq $rbx, %rax
popq %rbx
.L6: rep; ret

函数式编程(Functional Programming)

函数式编程将计算过程视为函数并避免使用程序状态或可变对象函数可大致分为如下两类

  • 纯函数(Pure Function)函数与外界交换数据只能通过参数和返回值
  • 非纯函数(Impure Function)具有副作用(Side Effect)函数通过参数和返回值以外的渠道和外界进行数据交换例如捕获外部变量修改参数或修改全局变量等

函数式编程重视使用纯函数

算子(Lambda Calculus)是形式化的数学逻辑系统也是函数式编程的基础只使用如下规则来建构算子

  • 变量(Variable)形如用字符或字符串来表示参数或者数学上的值或者表示逻辑上的值
  • 抽象(Abstraction)形如即函数定义其中为形式参数为函数体
  • 应用(Application)形如即以为参数调用函数

算子的规约(Reduction)操作如下

  • -变换(-Conversion)即重命名操作
  • -规约(-Reduction)即调用操作

操作系统(OS; Operating System)

操作系统知识点整理

软件工程(Software Engineering)

软件工程知识点整理

开源软件(Open Source Software)

开源软件向想要修改或改进软件的程序员公开软件的源代码且受版权保护自由软件(Free Software)与开源软件存在很多共性开源软件与自由软件都是可以不受限制地自由使用复制研究修改和分发的软件

常见的软件许可协议

常见的软件许可协议如下

  • 麻省理工学院(MIT; Massachusetts Institute of Technology)他人修改后可闭源不必须声明版权衍生软件的广告可以用作者的名字促销
  • Apache他人修改后可闭源每一个修改后的文件必须放置版权说明
  • 伯克利软件分发(BSD; Berkeley Software Distribution)他人修改后可闭源不可以用作者名和原产品名做市场推广
  • 通用公共许可证(GPL; General Public License)他人修改后不可闭源新增代码即软件的派生物要求采用同样许可证
  • Mozilla他人修改后不可闭源需要对源代码修改之处提供说明文档

·诺依曼结构(Von Neumann Architecture)

约翰··诺伊曼(John Von Neumann)

匈牙利裔数学家和物理学家曾参与曼哈顿计划和早期电子计算机项目

·诺依曼结构又称普林斯顿结构(Princeton Architecture)是一种将程序指令存储器和数据存储器合并在一起的计算机设计概念结构依此结构设计出的计算机又称存储程序式计算机一般具有如下基本特点

  • 计算机由运算器控制器存储器输入设备和输出设备等部分组成
  • 采用存储程序方式程序和数据放在同一个存储器中并以二进制形式表示
  • 指令由操作码和地址码组成在存储器中按执行顺序存放由程序计数器指明要执行的指令所在的存储单元地址

电子延迟存储自动计算器(EDSAC; Electronic Delay Storage Automatic Calculator)又称Manchester Baby是第一台实际运行的冯·诺依曼体系的电子计算机

中央处理器(CPU; Central Processing Unit)

解释计算机指令以及处理计算机软件中的数据

指令集架构(ISA; Instruction Set Architecture)是处理器系列独有的是一组指令的集合包含特定处理器执行的基本命令计算机依指令集复杂程度可分为如下两类

  • 复杂指令集计算机(CISC; Complex Instruction Set Computer)IntelAMDx86架构CPU
  • 精简指令集计算机(RISC; Reduced Instruction Set Computer)ARMIBM Power

单一指令的执行过程称指令周期(Instruction Cycle)这个循环包括取指令翻译指令执行指令和寻找下一指令等步骤微处理器时钟(Microprocessor Clock)意味着处理器执行指令的速度通常以千兆赫(GHz)为单位

CPU高速缓存(Cache)允许处理器更快访问数据分为几个级别一级缓存(L1; Level 1 Cache)是最快的而二级缓存(L2; Level 2 Cache)和三级缓存(L3; Level 3 Cache)则稍慢些但仍快于访问内存或磁盘存储

英特尔(Intel)

得名于集成电子(Integrated Electronics)世界上最大的芯片制造商

英特尔推出的Intel 4004是世界上第一个微处理器x86泛指一系列基于Intel 8086且向后兼容的中央处理器指令集架构IA-32(Intel Architecture, 32-bit)x86-64英特尔的其他重要产品如下

  • 8086First 16-bit Intel processor, 1MB address space;
  • 386First 32-bit Intel processor, referred to IA32;
  • Pentium 4EFirst 64-bit Intel processor, referred to x86-64;
  • Core 2First multi-core Intel processor;
  • Core i7Four cores.

基于x86技术的处理器常见于台式计算机和笔记本电脑的内部基于ARM技术的处理器则主导平板电脑和智能手机

运算器(PU; Process Unit)

运算器负责算术运算和逻辑运算又称处理单元/逻辑通路包含算术逻辑单元(ALU; Arithmetic/Logic Unit)寄存器(Register)ALU使用寄存器保存正在处理的数据经典的的冯诺依曼计算机以运算器为中心

字长(Word Size)指微处理器能同时处理的位数取决于寄存器的大小以及与寄存器相连的线路的容量

控制器(CU; Control Unit)

控制器包含指令寄存器(IR; Instruction Register)和程序计数器(PC; Program Counter)用于读取指令控制程序流程譬如条件跳转等数据被加载到寄存器中控制器给ALU发送信号并开始处理控制器部件逐渐由操作系统取代

x86代码段(CS; Code Segment)和指令指针(IP; Instruction Pointer)PC的实现设施

存储器(Memory)

存储器的设计目标是高速度大容量和低成本现代冯诺依曼计算机以存储器为中心

端序(Endianness)得名于格列佛游记中小人国为水煮蛋从何处剥开而争执的故事内容如下

  • 大端(Big Endian)低位放在较大的地址处代表如SunPPC Mac
  • 小端(Little Endian)低位放在较小的地址处代表如x86ARM

端序的具体示例

假设有变量int a = 15213;且位于0x100 ~ 0x103的地址范围

端序 0x100 0x101 0x102 0x103
大端 00 00 3B 6D
小端 6D 3B 00 00

利用电能方式存储信息的存储设备可大致分为随机存取存储器和只读存储器两类

随机存取存储器(RAM; Random Access Memory)

又称内存数据应用程序指令和操作系统的暂存区

RAM is traditionally packaged as a chip. Its basic storage unit is normally a cell(one bit per cell). Multiple RAM chips form a memory.

RAM comes to two varieties, SRAM(Static RAM) and DRAM(Dynamic RAM).

SRAMDRAM的对比

RAM Trans. per Bit Access Time Needs Refresh? Cost Applications
SRAM 4 or 6 No Cache Memories
DRAM 1 Yes Main Memories & Frame Buffers

SRAM and DRAM are volatile memories(Lose data when the power goes off). Nonvolatile memories like ROMs retain value even if powered off.

只读存储器(ROM; Read Only Memory)

永久而稳定的存储电路主要任务是引导设备

存储在ROM的程序称为固件(Firmware)或引导加载程序(Boot Loader)当一个计算机系统通电后它会运行存储在ROM中的固件如称为基本输入/输出系统(BIOS; Basic Input/Output System)的小型指令集执行自测试以查明硬件是否能正常运行并验证基本程序是否损坏然后将操作系统加载到RAM

通常ROM可分为如下几类虽然有的ROM类型可读也可写但由于历史原因整体上都称为ROM

  • PROM(Programmable ROM)只能被编程一次
  • EPROM(Eraseable PROM)利用紫外线将位清除为零
  • EEPROM(Electronically EPROM)可直接在印制电路卡上编程

闪存(Flash Memory)由一系列EEPROM组成又称固态存储器采用固态存储技术的存储器如下

  • 固态硬盘(SSD; Solid State Drive)由一系列闪存芯片构成具有很快的传输速率
  • U(USB Flash Drive)是一种便携式存储设备可直接插拔使用
  • 内存卡(Memory Card)多为卡片或方块状其类型有快闪内存(CF; Compact Flash)多媒体卡(MMC; Multi Media Card)安全数字(SD; Secure Digit)卡等

磁存储(Magnetic Storage)

通过磁化磁盘表面上的微观粒子来存储数据粒子保持其磁化方向直到方向改变为数据提供永久但可修改的存储

磁盘(Disk)又称机械硬盘是以坚硬旋转盘片为基础的非易失性存储器

磁盘包括数个盘片(Platter)每个盘片有两面每一面包括数个称为磁道(Track)的同心圆磁道由外至内的标号依次为0 ~ 对齐的磁道形成圆柱圆柱的中心轴称为主轴(Spindle)每一磁道包括数个被间隙(Gap)分隔的扇区(Sector)而间隔不含数据

磁盘总容量的计算式如下 磁盘容量的评价方式如下

  • 记录密度(Recording Density)磁道一英寸的段能存储的位数
  • 磁道密度(Track Density)从盘片中心出发半径上一英寸的段内的磁道数
  • 面密度(Areal Density)记录密度磁道密度

磁盘用读写头(Read-Write Head)来读写存储在磁性表面上的位读写头连接至一个转动臂(Actuator Arm)的一端在紧贴表面的一层薄薄的气垫上滑动读写头垂直排列一致行动读写头冲撞(Crash)指碰到灰尘而停下与盘面接触这很可能损坏盘面并破坏其存储的数据

磁盘时间性能的评价方式如下

其中旋转速率(PRM; Revolution per Minute)指盘片固定的转速需要留意单位通常旋转速率为5400 ~ 15000PRM

  • 寻道时间(Seek Time)移动转动臂所需要的时间通常是3 ~ 9ms

  • 旋转时间(Rotation Time)目标扇区的第一个位转动到头下的时间旋转延迟和寻道时间大致相等估算时可利用这一特性

  • 传送时间(Transfer Time)读取目标扇区的位的时间

访问扇区中的第一个字节耗时长但相比之下访问剩下的数据几乎不耗时

廉价/独立磁盘冗余阵列(RAID; Redundant Arrays of Inexpensive/Independent Disks)即磁盘阵列将多个硬盘组合成一个逻辑硬盘目的为提升性能或资料冗余即提高并行性和可靠性成本较低

光存储(Optical Storage)

使用光盘表面的亮点和暗点表示数据如下是使用光存储技术的介质

  • 激光唱片(CD; Compact Disc)容量0.7 ~ 0.9GB
  • 数字多功能光盘(DVD; Digital Versatile Disc)容量4.7 ~ 17GB
  • 蓝光光盘(BD; Blu-ray Disc)容量超过25GB

光学技术根据内容可变性可分为如下三类

  • 只读(ROM)批量生产内容不能改变
  • 可录制(R; Recordable)数据可由用户设备写入可刻录光盘但一旦写入数据就不能改变
  • 可重写(RW; Rewritable)数据可以在写入光盘后进行更改但光盘寿命更短

输入/输出设备(I/O Device)

输入(Input)是指提交或传输到计算机系统的一切数据输出(Output)则是计算机产生的结果输入/输出设备是计算机与用户或其他设备通信的桥梁

显示器(Display)

即显示文本和图像的计算机显示设备

液晶显示器(LCD; Liquid Crystal Display)通过过滤经过一层液体晶状单元的光线产生图像标准的LCD的光源通常是不环保的冷阴极荧光灯管(CCFL; Cold Cathode Fluorescent Lamp)现在通常使用低功耗的发光二极管(LED; Light-Emitting Diode)替代

触摸屏(Touchscreen)

各类触摸屏的工作原理如下

  • 电阻式(Resistive)屏幕由基础面板和小空间分隔的柔性顶层组成轻按顶层使其与底层接触接触点收集并传递位置信息不易受灰尘或水的影响但可能会被尖锐的物体磨损
  • 电容式(Capacitive)屏幕内含涂有导电材料薄层的透明面板由于人体是导电体触摸屏幕会产生电流变化

打印机(Printer)

各类打印机的工作原理如下

  • 喷墨式(Ink Jet)打印头由一系列喷嘴组成每个喷嘴有对应的墨盒
  • 激光式(laser)在光敏滚筒上涂上光点静电荷油墨被应用到滚筒上然后转移到纸上

图形处理器(GPU; Graphics Processing Unit)

图形处理器的类型如下

  • 集成式(Integrated)内置于主板上
  • 独立式(Discrete)或称专用显卡拥有更强劲的性能

图形处理器有专用的内存通常称为显存(Video Memory)

总线(Bus)

总线是计算机组件规范化交换地址数据和控制信号的方式总线通常为多个设备所共享前端总线(FSB; Front Side Bus)是指与微处理器交换数据的电路

计数系统(Numeral System)

即使用一组数字符号来表示数的体系理想计数系统具有如下功能有效地描述一组数(如整数实数)所有的数对应唯一的表示反应数的代数和算数结构

数字(Numerals)

数字是计数系统的基础

计算机领域中有时数字一词的含义与数码(Digital)相近其词根是数(Digit)源于拉丁语的手脚趾(digitus)一词通常用于形容数字技术的事物

巴比伦楔形数字(Babylonian Cuneiform Numerals)

巴比伦数字为目前已知的最早的的位值制数字系统没有表示0的符号因为这一概念未被发明

巴比伦楔形数字符号

常见的巴比伦楔形数字符号如下

符号 数字 符号 数字 符号 数字 符号 数字 符号 数字
- 0 𒐕 1 𒐖 2 𒐗 3 𒐘 4
𒐙 5 𒐚 6 𒐛 7 𒐜 8 𒐝 9
𒌋 10 𒌋𒌋 20 𒌍 30 𒐏 40 𒐐 50

罗马数字(Roman Numerals)

同古巴比伦数字一样罗马数字中也没有表示0罗马数字的规则如下

  • I表示1V表示5X表示10L表示50C表示100D表示500M表示1000
  • 相同的字符连写时表示相加所得之数III1+1+1=3
  • 小的字符写在大的字符右边时表示相加所得之数VIII5+1+1+1=8
  • 小的字符写在大的字符左边时大数减小数所得之数IV5-1=4此处小的字符仅限IVC且左侧最多仅一个同时限制I右边最大字符为XX右边最大字符为CC右边最大字符为M99表示为XCIX100-10+10-1而不是指示100-1IC
  • 字符上若有横线表示增值1000
  • 满足上述规则的情况下用最少的字符表示相同的字符不超过三个然而古罗马中4较为特殊其表示有IIIIIV两种

在中国数字编码解码的规则是乘法而在罗马解码的规则是加减法从编码的有效性上看中国人的做法比罗马人高明

阿拉伯数字(Arabic Numerals)

阿拉伯数字真正的发明者是印度人其发明标志着数字和文字的分离

干支纪年法(Sexagenary Cycle)

干支是天干地支的合称两者经一定的组合方式搭配成60为一个周期

  • 十天干(Ten Heavenly Stems)甲乙丙丁戊己庚辛壬癸
  • 十二地支(Twelve Earthly Branches)子丑寅卯辰巳午未申酉戌亥

下例代码通过给定的年份输出天干地支纪年

1
2
3
4
5
6
const wstring s1 = L"庚辛壬癸甲乙丙丁戊己";
const wstring s2 = L"申酉戌亥子丑寅卯辰巳午未";
int year;
cin >> year;
(void)wcout.imbue(locale("chs")); // 中文输出设置
wcout << s1[year % 10] << s2[year % 12] << endl;

二进制(Binary)

2为底数的计数系统最早由德国数学家戈特弗里德·莱布尼兹提出(Bit)是二进制数字(Binary Digit)的缩写通常以小写字母b表示字节(Byte)是位的组合一个字节由8个位组成通常以大写字母B表示

计算机硬件不区分无符号数据和有符号数据而由程序即指令来区分

无符号编码(Unsigned)

无符号数只表示非负数位二进制数用无符号编码表示的值如下式

原码(Sign-Magnitude)

分配一个符号位以表示有符号数位二进制数用原码表示的值如下式 由上式可知原码的符号位决定其他位的权的正负

反码(Ones' Complement)

又称一的补码修正原码使正数的反码等于其原码而负数的反码则可以通过保留其符号位将原码的数值位取反得到位二进制数用反码表示的值如下式 原码和反码都使数字两种形式因而加减法运算存在问题

补码(Two's Complement)

位二进制数用补码表示的值如下式 由上式可知补码的符号位含义即负权重

负数的补(原)码即其原(补)除符号位外取反后加一取相反数的操作是取反后加一注意补码所能表示的最小值取反后加一仍是即表达式-INT_MIN == INT_MIN永真

由一个正数得到其对应负数的补码的方法如下

  1. 从右边起找到第一个出现的1
  2. 对由这个1开始(除这个1外)到最左边所有的位取反

移码(Offset Binary)

移码即将二进制原码无符号整数所代表的值减去一个预设值

移码没有标准预设值通常取这种移码使一个数的移码和补码的最高位相反其余各位均相同

二进制浮点数算术标准(IEEE754)

定点数(Fixed Point Number)即固定小数点在二进制位中的位置形式过于僵硬不利于同时表示特别大和特别小的数浮点数(Float Point Number)使用类似科学计数法的表示形式灵活

IEEE754标准规定单精度浮点数(float)和双精度浮点数(double)内容如下

  • 单精度符号位占指数位小数位
  • 双精度符号位占指数位小数位

IEEE754标准的浮点数具有如下数学形式 上式右端各符号的说明如下

  • 符号(Sign)表示
  • 尾数(Mantissa)表示规格化时的范围为非规格化时的范围为
  • 阶码(Exponent)表示使用的特殊移码对浮点数加以的权重

IEEE754标准规定的浮点数类型如下

其中表示位于小数点后的小数区域即定点小数

  • 正零和负零全为0
  • 非规格化数全为0不全为0此时有
  • 规格化数不全为0也不全为1此时有
  • 无穷大全为1全为0
  • NaN全为1不全为0

由上述可知浮点数的可能取值在附近密集在非规格化数与规格化数的不同定义使得浮点数在最大非规格化数与最小规格化数间平滑过渡

非负浮点数的示例

描述 备注
最小非规格化数
最大非规格化数
最小规格化数
最大规格化数
无穷大

浮点数运算不具备结合性见下例

1
2
double x = (3.14 + 1e10) - 1e10; // 0.0
double y = 3.14 + (1e10 - 1e10); // 3.14

词头(Prefix)

国际单位制词头(Metric Prefix)使用10的幂次表示度量衡单位的倍数和分数二进制乘数词头(Binary Prefix)则使用2的幂次表示大的数字引入带的缩写符号以与国际单位制词头区分然而二进制乘数词头未被广泛采用非正式的场合可在二进制领域使用国际单位制词头因此上述二者容易混淆

国际单位制词头与二进制乘数词头

Prefix Character Symbol Symbol
Yotta
Zetta
Exa
Peta
Tera
Giga
Mega
Kilo
Deci - -
Centi - -
Milli - -
Micro - -
Nano - -
Pico - -
Femto - -
Atto - -
Zepto - -
Yocto - -

对于DRAMSRAM容量相关的计量单位通常使用对于像磁盘网络一类的I/O设备的容量通常使用

字符编码(Character Encoding)

早期编码系统(Early Encoding System)

  • EBCDIC(Extended Binary Coded Decimal Interchange Code)扩增二进式十进交换码IBM推出英文字母不连续排列中间出现多次断续
  • ASCII(American Standard Code for Information Interchange)美国信息交换标准码是最常用的编码系统正确读音是/ˈæski/使用7位表示一个字符
  • 扩展ASCII(Extend ASCII)ASCII的超集使用8位表示一个字符ISO8859-1是常用的扩展ASCII字符集标准

中文编码系统(Chinese Encoding System)

支持中文的编码系统如下

  • GB23121980年发布基于ASCII英文字符1字节汉字2字节
  • GBK(K扩展)1995年发布向下兼容GB2312
  • GB180302005年发布基本兼容GBK完全兼容GB2312
  • UTF-8灵活性强1 ~ 4字节表示一个字符英文字符1字节汉字3字节衍生的UTF-8 BOM(Byte Order Mark)主要是微软的习惯BOM才是标准格式
  • UTF-16UTF-8彻底不同一个字符2字节或4字节
  • UTF-32一个字符一律4字节

乱码(Mojibake; 文字化け)指编码系统不相互兼容而引发的问题

常见的由软件解码错误导致的中文乱码情况

其中例句为我能吞下玻璃而不伤身体

案例 特点 原因
鎴戣兘鍚炰笅鐜荤拑鑰屼笉浼よ韩浣3 生僻汉字居多且夹杂日文 使用国标码读取UTF-8的文本
�������²������������� 问号方块居多 使用UTF-8读取国标码的文本
我能吞下玻璃而不伤身体 注音小写符号居多 使用ISO8859-1读取UTF-8的文本
ÎÒÄÜÍÌϲ£Á§¶ø²»ÉËÉíÌå 注音大写符号居多 使用ISO8859-1读取国标码的文本
我能吞下玻璃而不伤身�? 字符串长度为偶数时正常
而长度为奇数时结尾异常
使用国标码读取UTF-8的文本后
UTF-8再次读取
锟斤拷锟斤拷锟斤拷锟铰诧拷锟斤拷
锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷
锟斤拷居多 使用UTF-8读取国标码的文本后
用国标码再次读取

编译器的中文乱码情况

Visual Studio未初始化的栈空间用0xCC填充而未初始化的堆空间用0xCD填充0xCCCC0xCDCDGB2312中分别对应两个汉字因此烫烫烫的情况可能意味着栈溢出屯屯屯的情况可能意味着堆溢出

校验码(Check Digit)

校验码通常是一组数字的最后一位由前面的数字通过某种运算得出用以检验该组数字的正确性

古犹太人抄写圣经将每一个希伯来字母对应一个数字每行文字加起来就得到一个特殊的数字这个数字便是这一行的校验码犹太学者每抄写一页就会检查校验码是否与原文相同

奇偶校验位(Parity Bit)是最简单的校验码偶校验补充一个位使得总的1的个数为偶数(奇校验则为奇数)偶校验实际上是循环冗余校验中生成多项式为的特例

汉明校验码(Hamming Code)

理查德·汉明(Richard Hamming)

美国数学家发明汉明校验码在计算机科学和电讯领域有重要贡献

汉明校验码的实现原理是在个数据位中加入个校验位并将每一个数据位分配在若干奇偶校验组中使不仅能发现出错还能指出出错的位置

个校验位能表示个状态其中一个状态表示没有错误而其余的个状态指出错误发生在哪一位错误也可能发生于校验位因此有个状态用于纠正数据的一位错即下式 若能检测并自动纠正一位错并发现两位错则需满足下式 校验位通常被安排在的位置其覆盖范围为数据位置和该校验位位置的二进制与的值不为0的数据

海明码的数据位位置和校验位位置案例

其中假设数据位位数式得有最小值

海明码位号 数据位/校验位 海明码位号与校验位位号之和的关系

要检查某一位的错误则需检查某一位所包含的所有奇偶校验位

循环冗余校验(CRC; Cyclic Redundancy Check)

个比特的数据后追加位冗余码计算的方法如下

  1. 在二进制数据的后面追加0得到位二进制数据
  2. 除以事先规定的位的除数得到余数
  3. 将余数拼接在原数据后

常用的CRC版本如下

其中表示二进制除数的第称为生成多项式

  • CRC-8
  • CRC-12
  • CRC-16
  • CRC-CCITT

通信(Communication)

通信即发送者通过某种媒体以某种格式来传递信息到接收者以达成某个目的

数据通信(Data Communication)

即通信技术与计算机技术结合而产生的通信方式

消息(Message)在数据通信中指由计算机本身发送而属于其人类用户之间或不同程序/同一程序的不同组件互相发送的内容

信号(Signal)是数据的电气或电磁的表现可分为如下两类

  • 模拟信号(Analog Signal)消息的参数取值是连续的
  • 数字信号(Digital Signal)消息的参数取值是离散的

数据通信的目的是将消息以信号的形式传递给接收者使接收者获得最多的信息一个数据通信系统可划分为如下三部分

  • 源系统又称发送端或发送方
    • 信源(Source)产生传输的数据来自信源的信号称基本频带信号(Baseband Signal)或基带信号
    • 发送器如调制器调制(Modulation)即使基带信号能够在信道中传输的操作
  • 传输系统又称传输网络或信道(Channel)即向某一方向传送消息的媒体
  • 目的系统又称接收端或接收方
    • 接收器如解调器解调(Demodulation)即调制的逆过程
    • 信宿(Destination)接收数字比特流

调制可分为如下两类

  • 基带调制又称编码(Encoding)将数字信号转为另一种数字信号变换后的信号仍是基带信号

    常见编码方式

    其中自同步能力即能从信号波形本身提取信号时钟频率

    编码方式 0的描述 1的描述 说明
    不归零制 负电平 正电平 没有自同步能力
    曼彻斯特(Manchester)编码 位中心向上跳变 位中心向下跳变 有自同步能力中心必跳变
    差分曼彻斯特编码 位开始边界有跳变 位开始边界无跳变 有自同步能力中心必跳变
  • 带通调制将基带信号的频率搬移到更高频段并转为模拟信号变换后的信号称为带通信号一般情况的讨论下调制就是指带通调制

    常见带通调制方式

    带通调制方式 示例
    调幅(AM; Amplitude Modulation) 01分别对应无载波或有载波输出
    调频(FM; Frequency Modulation) 01分别对应频率
    调相(PM; Phase Modulation) 01分别对应相位0°或180°

根据通信双方交互的方式通信可以有如下三种基本方式

  • 单工(Simplex)只有一个方向的通信而没有反方向的交互如无线电广播等
  • 半双工(Half Duplex)双方都能发送消息但不能同时如电话短信等
  • 全双工(Full Duplex)双方可以同时发送和接收消息

数据(Data)是未经处理没有意义的对现实世界客观事物的符号表示数据是载荷信息的媒体是运送消息的实体码元(Symbol)是数字信号中的概念代表不同离散数值的基本波形即矩形脉冲在使用二进制编码时只有两种不同的码元一种表示0状态另一种表示1状态

波特率(Baud)又称调制速率或码元传输速率指每秒传送的码元状态数码元周期即传送一个码元状态所需的时间

失真(Distortion)指信号在传输过程中发生扭曲和变化接收端波形失真的因素可能如下码元传输速率快信号传输距离远传输媒体质量差噪声干扰

奈奎斯特-香农采样定理(Nyquist-Shannon Sampling Theorem)又称奈氏准则该准则指出在任何信道中码元传输的速率是有上限的传输速率超过此上限就会出现严重的码间串扰(接收端收到的信号波形失去了码元间的清晰界限)的问题使接收端对码元的识别成为不可能

奈奎斯特指出信道的极限传输速率(单位为bps)如下

其中为信道的带宽(单位为Hz)为码元的不同状态数

香农指出信道的极限传输速率如下

其中为信道的带宽为信道内所传信号的平均功率为信道内部的高斯噪声功率

上式中又称信噪比(SNR; Signal-to-Noise Ratio)以分贝形式表示时为

信道的带宽或信道中的信噪比越大信息的极限传输速率就越高

奈氏准则的意义在于只要信息传输速率低于信道的极限传输速率就一定可以找到某种方法实现可靠传输

信息论(Information Theory)

克劳德·香农(Claude Shannon)

美国数学家信息论创始人

信息论是应用数学的分支主要研究的是对信号包含信息的多少进行量化信息论的基本想法如下

  • 不太可能的事情居然发生要比非常可能的事情发生能提供更多的信息今天早上会有日食今天早上太阳升起的信息更为丰富
  • 独立事件应具有增量的信息投掷的硬币两次正面朝上传递的信息量应该是投掷的硬币一次正面朝上的信息量的两倍

信息(Information)是数据的内涵对数据语义的解释泛指人类社会传播的一切内容当数据以人类能够理解和使用的形式表现时就成为了信息

香农认为信息是用来消除随机不定性的东西为满足信息论的基本想法对随机变量的事件自信息(Self-Information)即随机变量的某个事件发生所带来的信息量作出如下定义 知识(Knowledge)是起预示作用的经过验证的有组织的信息

信息熵(Information Entropy)

又称香农熵(Shannon Entropy)即自信息关于概率分布的期望用以表示信息的价值的含量信息的不确定性越大信息熵也就越大对于任意一个随机变量它的信息熵定义如下

已知的信息越多随机事件的不确定性就越小假设还存在随机变量定义条件熵(Conditional Entropy)如下 可证明当已知信息和所研究信息没有任何关系时等号成立

推广至多维随机变量的分布定义联合熵(Joint Entropy)如下 联合熵相当于条件熵与已知信息单独的信息熵之和即有下式

KL散度(Kullback-Leibler Divergence)

又称相对熵衡量两个取值为正数的函数的相似性定义如下

其中是同一随机变量的两个单独的概率分布

KL散度具有如下性质

  • 对于两个完全相同的函数而言它们的KL散度等于零
  • KL散度越大两个函数差异越大
  • 概率分布概率密度函数取值均大于零时KL散度可以度量两个随机分布的差异性

交叉熵(Cross Entropy)

交叉熵与KL散度类似其定义如下

其中是同一随机变量的两个单独的概率分布

计算机网络(Computer Network)

计算机网络

移动互联网(Mobile Internet)

移动设备(Mobile Device)又称移动终端即小型的手持的智能设备移动互联网是以移动网络作为接入网络的互联网及服务包括移动设备移动接入网络和移动应用服务等有时又称蜂窝网络(Cellular Network)重要的移动网络技术如下

  • 1G使用模拟技术支持语音通信
  • 2G利用数字技术替代了模拟技术并增加了对文本消息形式基本数据传输的支持主流的标准有全球移动通讯系统(GSM; Global System for Mobile Communications)
  • 3G同时支持语音和数据信号的数字传输主流的标准有宽频码分多址(W-CDMA; Wideband CDMA)
  • 4G更高的数据吞吐量主流的标准有长期演进技术(LTE; Long Term Evolution)

无线应用协议(WAP; Wireless Application Protocol)将互联网丰富信息及先进业务引入到移动电话等无线移动终端无线接入点(WAP; Wireless Access Point)也称WAP使设备通过无线网络连接至有线网络

移动接入网络(Mobile Access Network)包括如下三类技术移动网络接入技术移动组网技术分布式组网动态灵活移动网络管理技术不同网络的无缝切换实现异构融合

无线热点(Wi-Fi)基于IEEE802.11标准的无线局域网技术为公众提供互联网接入Wi-Fi一词没有任何意义也没有全写无线接入点每100ms都会将服务集标识(SSID; Service Set Identifier)广播一次用户可以借此决定是否要和这一SSID的无线接入点连接

自组织无线网络(Ad-Hoc)是无中心的自组织动态拓扑网络Ad-Hoc一词源自拉丁语引申为特地的某种目的Ad-Hoc没有集中的接入点一些可移动的设备发现其附近有其他的可移动设备并且要求和其他的可移动设备进行通信从而形成Ad-Hoc网络Ad-Hoc路由协议分为如下几种

  • 先验式(Proactive)每个结点维护其至网络中其他结点的路由信息表当网络拓扑结构发生变化时结点通过交互信息来实时地维护到网络中其他结点的路由路由延迟小但路由开销大
  • 按需式(On-Demand)源结点根据需要通过路由发现过程来确定路由路由开销小但路由延迟大
  • 混合式(Hybrid)

物联网(IoT; Internet of Things)

传感器(Sensor)感受被测量的信息并变换为所需形式的信息输出的检测装置是物联网得以实现的关键传感器一般由敏感元件转换元件变换电路和辅助电源四部分组成

惯性测量单元(IMU; Inertial Measurement Unit)属于传感器的一种用于需要进行运动控制的设备或用姿态进行精密位移推算的场合其封装的三种常见传感器如下

  • 加速度计(Accelerometer)感知任意方向上的加速度测量设备的受力情况
  • 陀螺仪(Gyroscope)感知角速度旋转角度的变化测量设备的旋转运动
  • 磁力计(Magnetometer)测量磁场以定位设备的方位

物联网又称传感网是随机分布的集成传感器数据处理单元和通信单元的微小结点通过一定的组织和通信方式构成的网络用以实现智能化识别定位跟踪监控和管理

物联网被称为继计算机互联网后世界信息产业发展的第三次浪潮物联网基本架构可分为如下三层识别物体采集信息的感知层信息传输的网络层信息处理的应用层

适用于物联网的无线技术

Wi-Fi相当耗电适合作为物联网无线技术而适用于物联网的无线技术如下

  • 射频识别(RFID; Radio Frequency Identification)非接触的自动识别技术是条码识别的代替品可分为主动半被动和被动三种类型其系统的基本工作方式可分为全双工半双工系统和时序系统
  • 近场通讯(NFC; Near-Field Communication)RFID的演变
  • 蓝牙低功耗(Bluetooth Low Energy)用于物联网的蓝牙技术相较经典蓝牙保持同等通信范围且同时显著降低功耗和成本
  • ZigBee一种各业界共同通用的低速短距无线通信技术

无线传感器网络(WSN; Wireless Sensor Network)

WSN是分布式传感网络其末梢是可以感知和检查外部世界的传感器WSN由部署在区域内大量廉价微型传感器结点组成协作地感知采集和处理网络覆盖区域中被感知对象的信息并发送给观察者WSN通信技术和计算机技术共同构成信息技术的三大支柱

传感器感知对象和观察者是WSN的三个要素

微机电系统(MEMS; Micro-electro-mechanic System)

微机电系统即尺寸很小的高科技电子机械器件微机电系统由微传感器微执行器和微电子器件三部分组成

全球卫星导航系统(Global Navigation Satellite System)

现有的全球卫星导航系统如下

  • 美国全球定位系统(GPS; Global Position System)
  • 俄罗斯全球卫星定位系统(GLONASS)
  • 中国北斗卫星导航系统(BDS)
  • 欧洲伽利略卫星导航系统(GALILEO)

云计算(Cloud Computing)

云计算是以资源租用应用托管服务外包为核心的全新互联网应用模式根据云计算所提供服务的不同云计算可分为如下几种服务模式

  • 软件即服务(SaaS; Software as a Service)
  • 平台即服务(PaaS; Platform as a Service)
  • 基础设施即服务(IaaS; Infrastructure as a Service)

云计算的演化有如下四个阶段电厂模式阶段效用计算阶段资源打包计费按照计算和存储分别计量费用网格计算阶段由松散耦合的计算机集群执行大型任务云计算阶段

Google文件系统(GFS; Google File System)是由Google提出的专用分布式文件系统GFS旨在以廉价且不可靠的硬件上构建可靠的分布式文件系统应对大型文件处理并支持大量用户同时访问

GFS集群由一个主服务器(Master)和多个块服务器(Chunk Server)组成每个文件拆分为若干个64兆字节的文件块(Chunk)每个文件块都由主服务器根据其创建时间指定的块句柄存储于块服务器的本地磁盘中并多处热备份块文件客户端可与主服务器和块服务器通信向主服务器索取块句柄并根据块句柄于块服务器查找数据

每个文件块又被划分为64千字节的若干小块(Block)每小块对应一个32字节的校验码

面向服务架构(SOA; Service Oriented Architecture)

SOA指软件的部分组件即调用者可以通过网络通用协议调用另一个软件组件以获得服务企业服务总线(ESB; Enterprise Service Bus)是实现企业级SOA的核心支撑手段云计算技术体系可分为如下四层物理资源层资源池层管理中间件SOA构建层

数据仓库(DW; Data Warehouse)

强调利用某些特殊资料存储方式有利于分析处理以产生有价值的信息并依此作决策

数据仓库具有主题导向(Subject-Oriented)集成化(Integrated)相对稳定(Nonvolatile)等的特性数据库面向事务符合范式要求数据仓库面向主题允许冗余

大数据(Big Data)

数据的容量获取速度或数据的表示限制了使用传统关系方法对数据的分析处理能力需要使用水平扩展机制来提高处理效率

大数据的四个显著特点即4V内容如下数据容量(Volume)巨大数据多样(Variety)处理速度(Velocity)价值(Value)密度低

大数据处理方式可分为如下两种

  • (Stream)式处理数据以流的方式连续到达由于流携带大量数据小部分数据流被保存在有限的内存中通常工作在毫秒级别用于在线应用
  • (Batch)处理数据先被存储然后再分析广泛应用于各个领域

MapReduceGoogle提出的批处理模型其核心思想是将数据块并行处理并以分布方式产生中间结果最后这些中间结果被合并产生最终结果程序员只需执行简单计算不必关心已封装的并行化容错数据分布负载均衡等细节

人工智能(AI; Artificial Intelligence)

人工智能是研究人类智能活动的规律构造具有一定智能的人工系统研究如何让计算机去完成以往需要人类智慧才能胜任的工作人工智能的发展路径如下

  • (Weak)AI只能做特定任务即模仿人类智力活动的某些方面
  • (Strong)AI真正通用的像人类一般思考的智能系统
  • 超级AI其能力超越人类且能不断自我学习和进化

人工智能的四个能力特征如下感知外部世界的能力对外部刺激信息进行获取和加工记忆与思维能力学习与自适应能力从样例或从与环境的交互进行学习行为能力即对外界的智能化反应

图灵测试(Turing Test)阿兰·图灵提出测试机器能否仅通过文本表现出与人等价或无法区分的智能尤金·古斯特曼(Eugene Goostman)是首个勉强通过图灵测试的计算机

马文·明斯基(Marvin Minsky)

美国计算机科学家专长于人工智能与认知科学领域

约翰·麦卡锡(John McCarthy)

美国计算机科学家LISP语言的发明者

约翰·麦卡锡首次定义人工智能的概念使机器的行为像人类的行为一样

达特茅斯会议(Dartmouth Workshop)由马文·明斯基约翰·麦卡锡和克劳德·香农发起主要讨论机器是否能像人类一样思考催生了人工智能革命

深蓝(Deep Blue)是由IBM开发的超级计算机作为人工智能的代表之一曾击败国际象棋世界冠军

机器学习(ML; Machine Learning)

机器学习相关整理

计算机视觉(CV; Computer Vision)

计算机视觉利用摄像头和计算机代替人眼对目标进行识别跟踪和测量并进一步做图像处理OpenCV是经典的计算机视觉开源工具库使用OpenCV完成计算机视觉任务见python库相关整理的OpenCV部分

计算机安全(Cybersecurity)

指信息系统(硬件软件数据物理环境及其基础设施)受到保护, 不受偶然的或恶意的原因而遭到破坏更改泄露系统连续可靠正常地运行信息服务不中断最终实现业务连续性

计算机安全即保护系统和数据的如下特性

  • 保密性(Secrecy)只有授权用户才能读取计算机系统和数据
  • 完整性(Integrity)只有授权用户才能修改计算机系统和数据
  • 可用性(Availability)授权用户应随时能够访问系统和数据

安全专家为实现保护从上述三个抽象层面分假想敌称为威胁模型(Threat Model)假想敌的攻击手段称为攻击矢量(Attack Vector)黑客(Hacker)正是凭借技术知识闯入计算机系统的人或团体可分为如下几类

  • 白帽(White Hat)黑客寻找并修复系统漏洞经常被公司和政府雇佣以做安全评估
  • 网络罪犯(Cybercriminal)窃取利用和销售计算机漏洞和数据
  • 黑客行动主义者(Hacktivist)影响社会或达到政治目的

能够在计算机间相互传播的恶意程序称蠕虫(Worm)这些由黑客可控的计算机组成僵尸网络(Botnet)其作用如下发送大量垃圾邮件(Spam)盗用算力发起分布式拒绝服务攻击(DDoS; Distributed Denial of Service)用于堵塞网络

漏洞利用(Exploit)即利用系统漏洞以获得某些能力如访问权限漏洞利用的常见方式如下

  • 缓冲区溢出(Buffer Overflow)超额的输入数据覆盖内存其他区域造成系统崩溃可进行边界检查以防御也可设置特定值用于验证数据是否因溢出损坏这一特定值称金丝雀(Canary)因为曾经矿工会带金丝雀下矿金丝雀会警告危险
  • 代码注入(Code Injection)输入的部分包含可执行代码SQL注入等

防范漏洞利用应该总是假设外部数据是危险的

零日漏洞(Zero-Day Vulnerability)指针对未发布补丁的安全漏洞对计算机系统的安全有巨大威胁

暴力攻击(Brute Force Attack)即尝试解的所有可能组合计算机系统可通过设置等待时间和锁定以防御新的攻破方法如内存镜像物理接触设备以复制整个内存通过重置内存以避免等待和锁定

身份认证(Authentication)使计算机得知使用者身份身份认证的三种类型如下

  • 你知道什么(What You Know)基于只有用户和计算机所知道的如密码等但易被暴力攻击破解
  • 你有什么(What You Have)基于用户持有的特定物体如电子卡令牌等但攻击者与用户物理距离较近时危险
  • 你是什么(What You Are)基于生物特征认证如指纹虹膜等但是概率性的(Probabilistic)系统可能辨识不出用户

上述三类方式都有优缺点因此有时采用双因素认证(2FA; Two-Factor Authentication)

访问控制(Access Control)用于控制用户访问的规范访问控制通常通过访问控制表(ACL; Access Control List)实现访问控制表描述用户对每个文件文件夹和程序等的访问权限通常权限可分为如下几类读取(Read)写入(Write)执行(Execute)

安全内核(Security Kernel)是尽可能少的安全性接近可验证的系统软件又称可信计算基础(Trusted Computing Base)

社会工程学(Social Engineering)

社会工程学是最常见的入侵方式通过欺骗使其泄密信息社会工程学攻击的常见方式如下

  • 钓鱼(Phishing)通过以假乱真的网页欺骗用户输入真实信息
  • 假托(Pretexting)如电信欺诈
  • 特洛伊木马(Trojan Horse)伪装成无害物的恶意软件(Malware)或勒索软件(Ransomware)

密码学(Cryptography)

本意为秘密写作加密(Encryption)即通过加密算法(Cipher)将明文转为密文(Ciphertext)解密(Decryption)即将密文恢复为明文简单的加密策略有如下两种

  • 替换加密(Substitution Cipher)指将明文的每个字母替换成其他字母替换加密后明文与密文对应字母出现的频率是一样的易被熟练的破译员发现规律进而破译
  • 位移加密(Permutation Cipher)指将明文填入矩阵更换读出的顺序产生密文

凯撒加密(Caesar Cipher)将明文的字母向前移动三个位置实现加密据称罗马共和国末期军事统帅尤利乌斯·凯撒(Julius Caesar)曾用此方法与其将军们进行联系

英格玛(Enigma)是纳粹在战争时期使用的加密机英格玛并不是简单的替换加密它拥有三个或更多的替换转子作为一次替换的映射一个转子的输出作为下一个转子的输入后置反射器将信号发回给转子前置插板可将输入的字母预先进行替换纳粹为英格玛制作了密码本包含每日的配置

巨人1(Colossus MK 1)是巨人计算机系列由英国密码分析师设计用于破解纳粹通信巨人1号是第一个大规模使用真空管的计算机也被认为是第一个可编程电子计算机

炸弹机(Bombe)是在巨人1号诞生前由阿兰·图灵制作的机电装置同样用于破解纳粹通信Bombe严格来说不属于计算机巨人1号和Bombe都诞生于英国布莱切利园

随计算机的发展密码学逐渐由硬件转向软件数据加密标准(DES; Data Encryption Standard)是应用最广泛的早期加密算法随后出现了高级加密标准(AES; Advanced Encryption Standard)现在难以破解且在性能与安全性间取得平衡

密钥交换(Key Exchange)

密钥交换不发送密钥但依然让两台计算机在密钥上达成共识通过单向函数(One-Way Function)实现即难以逆向推算出输入的函数一种常见的形式是迪菲-赫尔曼密钥交换(Diffie–Hellman Key Exchange)其流程大致如下

  1. 通信的双方甲和乙协定使用素数以及基数
  2. 甲选择一个秘密整数计算并发送给乙
  3. 乙选择一个秘密整数计算并发送给甲
  4. 最终甲计算乙计算得到一样的值用作对称密钥结合如AES之类的加密技术来加密通信

非对称加密(Asymmetric Encryption)

非对称加密使用两个不同的密钥即公钥(Public Key)和私钥(Private Key)使用公钥加密信息而私钥的持有者才能解密目前最流行的非对称加密技术是RSA得名于其发明者RivestShamirAdleman知道公钥只能加密但不能解密因而称非对称

视觉设计(Visual Design)

色彩模型(Color Space)

CMYK

即印刷四分色是彩色印刷时采用的一种套色模式印刷品的色彩由青(Cyan)洋红(Magenta)(Yellow)和黑(Black)四种颜色的散点组成控制这些散点的大小密度和角度就能混出颜色

理论上CMYK可形成种颜色加上印刷油墨并非理想纯色的原因其实际形成的色彩空间必小于RGB故而不能以屏幕上所看到的色彩要求印刷品的色差

RGB

即三原色将红绿蓝三色的色光以不同比例相加而产生各种颜色广泛用于在电子系统中表示图像

理论上RGB可形成种颜色

HSB

RGB色彩模型的点在圆柱坐标系中的表示法又称HSV颜色空间

  • 色相(Hue)颜色种类
  • 饱和度(Saturation)鲜艳程度
  • 明暗(Brightness/Value)暗亮程度

基于HSB色彩模型描述的色彩搭配如下

  • 单色(Monochrome)搭配保持色相不变饱和度明暗发生变化
  • 类比(Analogous)搭配选用颜色的色相值保持在色相环相邻的60°内
  • 互补/对色(Complimentary)搭配撞色/强烈色搭配即色相值间隔180°
  • 三角(Triad)搭配三色搭配两两颜色色相间隔120°

排版(Typography)

乱数假文(Lipsum)

Lorem ipsum dolor sit amet.

西方传统印刷业时就开始使用的没有实际意义的拉丁文组合用于排版测试的占位文字据传是某个工匠随意选取的经考证出自善恶之尽

敏捷的棕毛狐狸(The Quick Brown Fox)

The quick brown fox jumps over the lazy dog.

Microsoft Office Word中使用=rand()命令(新版本则是=rand.old())会生成此句此句也是著名的全字母句通常用于英文测试字体显示效果和键盘故障