文章目录
- 前言
- 一、起源
- 二、元件
- 基础元件的发展
- 硬件性能的爆炸性增长
- 三、进制
- 数制转换
- 四、ALU
- 五、存储
- 存储元件的发展
- 存储介质的发展
- 六、CPU
- 七、程序
- 数据结构的基本内容
- 八、系统
- 操作系统OS 的发展
- 文件系统的发展
- 压缩
- 九、界面
- 命令行界面
- 图形界面2D
- 3D图形
- 十、网络
- 物理层
- 数据链路层
- 网络层
- 运输层
- 万维网
- 总结
- **抽象**二字是重点,从人的脑力到计算机,从机器码到高级语言,从简单程序到人工智能,这都是一层层抽象包装的成果。 [计算机科学速成课](https://b23.tv/6UBRTZZ)
前言
本文章是关于计算机知识的一些杂谈。
一、起源
发展历程:
-
早期”computer“指负责计算的人。
-
算盘:手动计算器,加减数字,十进制(“逢十进一,借一当十”)。
-
步进计算器:机械结构齿轮,前转加-后转减-有进位退位,可以实现乘除(乘除,实际上是多次加减法)。
-
预先算好的计算表,例如二战中广泛使用的射程表。
-
差分机:计算多项式(多项式,几个变量之间的关系),只是假想。
-
分析机:通用计算机,概念提出。
-
打孔卡片制表机:记录信息的打孔卡片(如答题卡),打孔代表有否则无,输入有则加一,其后出现IBM。
-
电子计算机。
二、元件
基础元件的发展
-
继电器:用电控制的机械开关,使用电磁感应控制线路,通电机械臂闭合即开关闭合。
——速度慢,易磨损,数量增加则故障概率增加,巨大、黑色、温暖的机器会吸引虫子(虫子,bug)。 -
三级真空管即电子管:通过控制线路控制电子流动,没有会动的组件。
——速度快,脆弱易碎,易烧毁,主要军用。 -
晶体管:使用半导体控制线路。
——速度更快,固态,体积远远小于真空管,便宜,开始民用。
硬件性能的爆炸性增长
- 一开始分立元件(计算机由独立部件组成),存在数字暴政(加强性能需要更多部件,导致更多线路,更复杂难做)。
- 集成电路(IC,电路的所有组件都集成在一起),印刷电路板 PCB(相当于集成的电线)。
- 其后光刻技术(用光把复杂图案印到材料上如半导体)产生,有摩尔定律:每两年左右,得益于材料和制造技术的发展,同样大小的空间,能塞进两倍数量的晶体管。
摩尔定律的终结,进一步小型化碰到的问题:
- 光的波长不足以制作更精细的设计。
- 量子隧穿效应,晶体管漏电。
三、进制
二进制与布尔逻辑:
开/关——1/0——true/false。
布尔代数:NOT、AND、OR、XOR(异或)。
数制转换
机器码:
正数:原码 = 反码 = 补码
负数:
运算:
方法 | - |
---|---|
加法 | 直接 |
减法 | [N1 - N2] 补 = [N1] 补 + [N2]补 |
浮点数:
- 科学计数法存储 (IEEE 754标准)。
32位浮点数 = 1位符号 S + 8位指数 e + 23位有效数字 M。
例如:
4136 0000 H = 0100 0001 0011 0110 0000 0000 0000 0000 B =
0|100 0001 0|011 0110 0000 0000 0000 0000。
解: - S = 0,
- e = 阶码 - 127 =1000 0010 - 0111 1111 = 0000 0011 = 3 D,
- M = 011 0110 0000 0000 0000 0000。
- 答:4136 0000 H = (-1)S * 1.M * 2e = + (1.011011) * 23 = 11.375 D。
ASCII 字符编码标准,可以编码字母、数字、特殊符号等。
Unicode 统一编码方案,解决不同国家不同标准的问题,例如UTF-8。
拓展:最优的进制e进制,与其更接近的三进制昙花一现。
补充:
- 210 = 1024。
- 1 TB 太字节 = 1024 GB 千兆字节 = 1024 * 1024 MB 兆字节。
- 1 MB = 1024 KB 千字节= 1024 * 1024 B 字节。
- 1 B 字节 Byte = 8 b 位 bit。
四、ALU
ALU即Arithmetic & Logic Unit 算数逻辑单元,由算数单元和逻辑单元组成,抽象成一个大“V”符号。
AU:算数单元,进行数字操作,使用逻辑门。
- 半加器 HALF ADDER:两个1位输入,两个1位输出“总和和进位”。
- 全加器 FULL ADDER:三个1位输入,两个1位输出“总和和进位”,由两个半加器和一个OR门构成。
-
8位行波进位加法器 8-BIT RIPPLE CARRY ADDER:两个8位输入,两个输出(其中一个为8位SUM,一个为1位CARRY,注意有进位则溢出),由一个半加器和七个全加器构成。
-
超前进位加法器 CRAAY-LOOK-AHEAD ADDER:现代计算机使用的。
-
不由加法器模拟乘法器,独立的乘法器等。
LU:执行逻辑操作,例如NOT、AND、OR。
五、存储
使用技术及衍生:内存RAM,外存ROM。
空间 | 存储 |
---|---|
CPU内 | 寄存器、cache |
主板内 | memory:内存、cache |
主板外 | storage:外存、硬盘(机械硬盘、固态硬盘) |
在线 | 网络存储 |
离线 | U盘、光盘、软盘、磁带 |
存储元件的发展
-
锁存器 latch:“锁存”了1个值即1bit。两个输入,“设置 set”输入1,输出为1;“复位 reset”输入1,输出为0。
-
寄存器 register:位宽为可存储的位数,由锁存器并排放置组成。
-
锁存器矩阵:16 * 16门锁矩阵,多路复用器解码8位地址(4位行,4位列,24 = 16)定位到每个锁存器,扩大打包出RAM。
-
RAM random access memory:随机存取存储器,是计算机内部存储器中的一种,在通电的情况下存储信息,断电会丢失数据,计算机和手机中一般把其叫做(运行)内存。
- SRAM static…:存储元为一个触发器,具有两个稳定的状态,存取速度快,容量小。
- DRAM dynamic…:存储元为一个MOS晶体管和电容器组成的记忆电路,需要刷新,容量极大,通常作为计算机的主存储器。
-
cache:高速缓冲存储器,简称缓存,由高速的SRAM组成,作用于CPU和主存之间。基于时间局部性和空间局部性原理,用一块更小更快的存储设备来作为更大更慢的存储设备的缓冲区,从而提高数据访问速度。
-
ROM Read-Only Memory:只读存储器,也是计算机内部存储器中的一种,可以存储数据而且断电不会丢失,早期的ROM因为技术不成熟所以无法擦写,出厂后就只能读数据,所以叫只读存储器。后来随着技术的发展,在ROM的基础上出现了新的半导体存储介质EPROM和EEPROM这两种可擦写,其后发展出了NAND FLASH闪存,就是我们现在用的U盘中用到的技术。
-
硬盘:硬盘分为两种,一种是机械硬盘(即磁盘HDD),一种是固态硬盘(SSD),磁盘和ROM没什么关系,但是固态硬盘就不一样了,固态硬盘用到的颗粒也是基于NAND FLASH技术,和u盘以及手机存储有点相似,所以硬盘和ROM还是有关系的,固态硬盘的存储颗粒是ROM技术发展的产物,但不能说ROM就是硬盘。
存储介质的发展
- 打孔纸卡、打孔纸带:读取慢,只能写一次。
- 延长线存储器:存储的位在介质中循环,但每一个时刻只能读一位数据,要读特定位只能等循环到位置时,因此又叫顺序存储器、循环存储器。
- 磁芯存储器:通过电流磁化磁芯改变其磁性即0/1,一个磁芯代表一位,能随时访问任何一位。
- 磁带:一长条的磁性带子卷在轴上,通过磁带驱动器前后移动,要读特定位置只能倒带或快进。类似技术磁鼓,推动了磁盘的发展。
- 磁盘:表面有磁性,可以叠在一起,通过磁臂移动读/写磁头处理其上的0和1,要考虑寻道时间。
- 软盘:机械硬盘 HHD的亲戚,除了磁盘是软的,其他基本一样,便携。
- 光盘 CD:光学存储器,表面的小坑造成光的不同折射,光学传感器捕捉解码为0/1。
- 固态硬盘 SSD:没有机械活动部件,使用ROM发展来的技术。
六、CPU
CPU = CHIP芯片(ALU + CU + 时钟 + 通用寄存器) + RAM
CPU Central Processing Unit:中央处理器,负责执行程序。
CU control unit:控制单元 = 控制线路 + 指令地址寄存器 + 指令寄存器。
时钟 :管理cpu节奏,以精准的间隔触发电信号。cpu“取指令–>解码–>执行”的速度叫“时钟速度”。超频提升性能,降频省电。
RAM :cpu外的独立组件,存储指令集,用“地址线”“数据线”和“允许读/写线”即总线与cpu通信。
高级cpu设计:
- 单核:
- 早期加快晶体管切换速度,来提升cpu速度。
- 使用专用化的电路,除法电路等,考虑复杂度 vs 速度。
- cache缓存(连通RAM检查脏位),提高数据存取速度。
- 流水线设计,并行处理,吞吐量上升,先要弄清数据依赖性,再动态排序乱序执行(电路非常复杂)。
- JUMP后推测执行,进一步发展出来分支预测。
- 多个ALU。
- 超标量处理器,一个时钟周期完成多个指令。
- 多核:
- 多个core,共享一些资源。
- 多个独立的cpu。
- 超级计算机。
七、程序
程序 = 数据结构 + 算法
程序:一组计算机能识别和执行的指令。
指令:一般由操作码字段OP和地址码字段A组成。
早期编程方式(在硬件上):
- 打孔纸带:只汇总数据,操作固定。
- 插线板:控制面板,运行不同程序需要重新插线,一个插线板一个程序。
- 存储程序计算机:程序存在内存中,内存足够甚至可以存储数据以及运行产生的新数据。穿孔纸卡读取机输入程序和数据。
- 面板编程:面板拨开关。
补充:
-
冯诺依曼结构:程序和数据存在一个地方。
-
冯诺依曼计算机标志:一个处理器(有算数逻辑单元) + 数据寄存器 + 指令寄存器 + 指令地址寄存器 + 内存(负责存数据和指令)。
编程语言发展(在软件上,小部分运行速度换大部分编程速度):
- 二进制:机器语言,伪代码–>“操作码表”–>二进制机器码,cpu可以直接执行机器码。
- 助记符:汇编语言,使用汇编器,一般一条汇编指令对应一条机器指令,需要考虑底层细节。
- 高级编程语言:使用编译器,专门把高级语言转成低级语言,脱离底层细节大众化。
编程基础(语句和函数)的基本:
- 变量,赋值语句。
- 条件语句:if判断分支,while条件循环,for特定次数循环。
- 函数 function:代码打包成方法,隐藏复杂度,也叫“方法”、“子程序”,函数集合——库。
数据结构的基本内容
不同的数据结构适用于不同的场景。
- 固定大小:
- 数组 array(一维列表、向量):同类型值连续存储,a={1,2,3},a[index]调用下标为index的值,下标从0开始。
- 字符串 string:字母、数字、符号等组成的数组,a=“abstraction”,字符串结尾二进制"\0"表示字符"null"。
- 矩阵 matrix:数组的数组,任何维度。
- 结构体 struct:多个不同类型变量打包在一起。
- 指针 pointer:特殊变量,指向一个地址
- 节点 node:存变量和至少一个指针。
- 可变大小(节点组成):
- 链表 list:每个节点指向下一个节点。
- 队列 queue:先进先出(FIFO),入队(enqueue)出队(dequeue)。
- 栈 stack:后进先出(LIFO),入栈(push)出栈(pop)。
- 树 tree:节点包含多个指针,最高的节点叫“根节点”(root),以下节点叫“子节点”(children),没有子节点的叫“叶节点”(leaf),根到叶是单向的。
- 二叉树 binary tree:节点最多有两个子节点。
- 图 graph:节点随意连接。
- 红黑树、堆……
算法(解决问题的步骤,考虑时间复杂度和空间复杂度)入门:
- 选择排序:一个for套另一个for,时间复杂度O(n2)。
- 归并排序:先二分到1再合并,O(n*log2n),n比较+合并的次数,log2(n)合并步骤的次数。
- Dijkstra最短路径算法:图搜索,选最小边,O(nlogn+I),n为结点数,I为线数。……
软件工程的基本内容:
- public、private:设置权限对象。
- object:相关代码打包,可以嵌套。
- 面向对象编程 OOP:把变量和函数打包成对象,核心是隐藏复杂度,选择性的公布功能。
- 程序编程接口 API:控制哪些函数和数据让外部访问,哪些仅供内部。
- 集成开发环境 IDE:集成当中功能的工具。
- 调试 debug。
- 文档和注释 readme、comment。
- 版本控制 version control:源代码管理。
- 质量控制 QA quality assurance testing:测试。
- 软件的beta版即公测版本、alpha版即内部版本。
八、系统
操作系统OS 的发展
Operating system:让机器自行运作,有操作硬件的特殊权限(软件和硬件之间的媒介,提供API来抽象硬件,写程序可以忽略底层细节),可以运行和管理其他程序。开机第一个启动的程序,其他程序由操作系统启动。
- 批处理:之前只能一次给一个程序,现在可以一次加载多个程序,当计算机运行完一个程序,会自动运行下一个程序。
- 多任务处理:cpu快I/O慢,程序阻塞在I/O上导致cpu空闲,于是使用调度算法在cpu上同时运行多个程序。
- 多用户分时操作系统:多用户用终端访问计算机,终端本身没有计算能力,每个用户只能占据一部分资源(cpu、内存等)。
- 实时操作系统:最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。
- 虚拟内存:假定内存总是从地址0开始,实际的物理位置被操作系统隐藏和抽象,存在一个虚拟内存和物理位置的映射表。这种机制使程序的内存大小可以灵活的增减即动态内存分配。内存保护:给程序分配专用的内存范围。
- 使用设备驱动程序来调用外部设备。
文件系统的发展
文件格式:可以随便存文件,但按格式存会更方便。
- TXT 文本文件:使用ASCII字符编码标准。
- WAV 音频文件:存储的数据是每秒上千次的音频采样数字,格式为:元数据(关于数据的说明,文件头) + 音频数据。
- BMP 图片文件:图片由像素组成,所以存储像素的红蓝绿(加色三原色) RGB 值,开头也是元数据。
- 早期文件系统:整个存储器就是一个文件,数据从头存到尾,直到占满。后来计算能力和存储容量的提高,多文件很有必要。
目录文件:特殊文件,用来解决划分多文件的问题,存其他文件的信息,比如名字、位置等。更新文件时也必须更新目录文件。删除文件,就是删除文件的记录,没有实际擦除数据,恢复数据就是恢复这些。
- 平面文件系统:文件都在一个层次内,只有十几个文件。
文件不会一个个紧密地前后排序在一起,因为文件系统会:把空间划分成几个块,文件拆分到块里,有一些预留空间方便改动。
文件的增删改查会不可避免地造成文件散落到各个块里,所以做碎片整理,就是把数据来回移动,排列成正确顺序。
- 分层文件系统:有不同的文件夹,文件夹可以层层嵌套。需要额外的元数据,来区分文件和目录。目录文件不仅指向文件,还要指向目录。剪切文件,就是更改目录里的记录。
压缩
压缩的好处是能存更多文件,传输也更快。
-
无损压缩:没有丢失任何数据。
1.游程编码:适合经常出现相同值的文件,有时数据反而会变多。格式:“长度” + “重复值”。
2.字典编码:使用哈夫曼编码树,按频率排序成树,频率低的在下面。左0右1,按树编码成字典。格式:“字典” + “编码序列”。
“消除冗余”和“用更紧凑的表示方法”,这两种方法通常会组合使用。 -
有损压缩:丢掉那些人类看不出区别的数据。
感知编码:删除掉人类无法感知的数据,依赖于人类的感知模型。
时间冗余:视频里不用每一帧存所有像素,可以只存变了的部分,利用了帧与帧之间的相似性。MPEG-4 视频编码:用补丁的移动和旋转来更新画面。
九、界面
命令行界面
-
早期,计算机昂贵,不能等人慢慢输入,所以用纸卡/纸带一次性把程序和数据输入,输出打印到纸上,中间没有人类操作。尽可能迁就机器,对人类好不好用是其次。
-
后来,计算机足够便宜+快,人机交互变得可行,通过键盘输入。电传打字机是专门用来发电报,使用电报线发送和接收文本,可以用于用户和计算机“对话”,输入命令,计算机会输出回来,即命令行界面。
-
最后,屏幕成本足够低,代替电传打字机,仍使用“电传打字机协议”,纸和屏幕对计算机一样。
图形界面2D
- PDP-1 计算机,键盘和显示器分开,屏幕只显示临时值,结果打印到纸上。
- 阴极射线管(CRT)有两种绘图方式:
- 矢量扫描:引导电子束描绘出形状。
- 光栅扫描:按照固定路径,一行行来,从左到右,从上到下,不断重复,只在特定的点打开电子束绘制图形。
-
液晶显示器(LCD):可以显示“像素”,使用光栅扫描,每秒更新多次。
-
字符生成器:第一代显卡,从内存读取字符,转换成光栅图形,才能显示到屏幕上。
-
屏幕缓冲区:特殊区域,专为图形保留,要显示图形,只要修改这个区域里的值。
-
矢量命令画图:为了绘制任何形状,同时不吃掉所有内存。所以东西都由线组成,通过矢量绘制。
-
Sketchpad:交互式图形界面,使用光笔输入,用途是计算机辅助设计,人机交互的关键转折点。
-
使用绘图函数画图。
-
图形用户界面 GUI 产生。
3D图形
-
线框渲染:所有的点3D转成2D后,用画2D线段的函数,来连接这些点。
-
3D投影:用图形算法把3D坐标“拍平”显示到2D屏幕上。
- 正交投影:立方体的各个边,在投影中相互平行。
- 透视投影:在真实3D世界中,平行线段在远处收敛于一点。
-
网格:一堆多边形的集合。网格越密,表面越光滑,细节越多,但意味着更多的计算量。
三角形更常用来组成网格,因为它能定义唯一平面,且简单。 -
扫描线渲染:填充图形的经典算法。扫描线与三角形相交出2点,算法会填满2点之间的像素。
抗锯齿:多边形边缘像素颜色浅一些,边缘羽化。 -
处理“遮挡”:
- 画家算法:用排序算法从远到近排列,再从远到近渲染,画家也是先画远景再画近景。
- 深度缓冲:记录场景中每个像素和摄像机的距离,表示为一个距离矩阵。
-
背面剔除:为了节省处理时间,忽略多边形的背面。
-
明暗处理:考虑灯光照明对明暗的影响。
表面法线:多边形面向的方向。
平面着色:最基本的照明算法,根据灯光和表面法线着色。 -
纹理处理:外观,查询纹理从相应区域取平均颜色来填充多边形。
-
图形处理单元GPU:专门处理图形的硬件,在显卡上,有专用的RAM。3D场景分成多个小部分并行渲染。
十、网络
物理层
比特流。尽可能屏蔽传输媒体和通信手段的差异。
通信方式:单向通信(单工通信),双向交替通信(半双工通信),双向同时通信(全双工通信)。
对来自信源的基带信号进行调制:
基带调制:编码,仅对波形进行变换,把数字信号转换成另一种形式的数字信号。
带通调制:使用载波进行调制,提高基带信号的频率,并转换为模拟信号,包括调幅A、调频w、调相B——“Asin(wx+B)”。
信道的极限信息传输速率 C:C = W * log2(1 + S/N)
W为信道的宽带(以Hz为单位),S为信号的功率,N为噪声的功率。
传输媒体:
导引型:双绞线、同轴电缆、光纤。
非导引型:地面微波接力通信、卫星通信。
信道复用技术:
频分复用、时分复用和统计时分复用,波分复用,码分复用。
数据链路层
帧。实现封装成帧、透明传输、差错检验,不要求“可靠传输”。
局域网 LAN:其中以太网很成功。
媒体访问控制地址 MAC地址:硬件地址,每台计算机唯一,在适配器的ROM中。
CSMA/CD协议 载波监听多点接入/碰撞检测:实现边监听边发送。
检测信道:发送前,为了获得发送权;发送中,为了及时发现碰撞。
指数退避:发生碰撞后指数级增长等待时间。
冲突域:使用一个信道的站组成的领域。
交换机:在多个冲突域之间,只在必要时交换数据,划分了冲突域。
交换方式:
电路交换:用专用电线直接连接到目的站。
报文交换:像邮政系统一样,消息经过好几个站/路由到目的站。
分组交换:报文分组成一个个数据包,使用TCP/IP协议解决乱序问题。
网络层
IP数据报。向上只提供简单灵活、无连接的、尽最大努力交付的数据报服务。
互联网:巨型分布式网络,会把数据拆分成一个个数据包来传输,是传输数据的管道。
IP协议:非常底层的协议,数据包的头部即元数据部分要求目标地址。
IP地址:软件地址,在计算机的存储器中。
运输层
用户数据报协议UDP和传输控制协议TCP,给访问网络的程序提供“端口号”和“检校和”。
协议 | 用户数据报协议UDP | 传输控制协议TCP |
---|---|---|
数据 | UDP用户数据报 | TCP报文段 |
有无连接 | 无连接 | 有连接 |
是否可靠 | 不提供可靠 | 提供可靠 |
资源使用 | 少 | 多 |
可靠传输:发送端发送什么,在接受端就收到什么。
应用层:
域名系统 DNS:专为互联网的电话簿,负责把域名和IP地址一一对应。域名存成树状结构。一般DNS服务器由互联网供应商提供。
广域网 WAN:WAN的路由器一般属于“互联网服务提供商 ISP”。
万维网
传输最多数据的程序是万维网,分布在全球的网页服务器上,可以用“浏览器”来访问万维网。最基本单位是单个页面,页面有内容,也有去往其他页面的链接(超链接,文字超链接即超文本)。
统一资源定位器 URL:每个网页唯一的地址,方便网页相互连接。
超文本传输协议 HTTP:关于客户端和服务器的页面传输的协议。
超文本标记语言 HTML:因为“超文本”的存储和发送都是以普通文本形式,只有纯文本无法区分链接,因此开发的一种标记语言。
搜索引擎:查找网页。3个部分:爬虫(跟着链接到处跑,记录新链接) + 不断扩张的索引(记录网页的特征)+ 查询索引的搜索算法(根据要求查询索引)。