计算机基本知识概览 I
本文信息
作者:000lbh AnterCreeper
状态:已审阅的发布版,审阅人:AnterCreeper 000lbh
软件与硬件
什么是软件?什么是硬件?相信刚接触计算机的同学也不会不清楚这个问题,我们在这里并不打算给软件和硬件一个正式的定义,而是通过举例介绍各种软件和硬件,从而使得同学们获得一个直观的认识。
硬件
各位刚刚接触计算机的同学可能还没有来得及拆开过你心爱的计算机。没关系,我们为大家提供了一些图片,同时通过这些图片进行介绍。
计算机
计算机,顾名思义,做计算的机器。
长久以来,人们日常生活中,到处都需要计算,但不得不手工完成,耗费大量心智。
于是,神降临了世界,从天间盗取了圣火。
伟大的图灵,在众人面前伸手于虚无中画了个圈,曰,我有一圣物,这些问题都可以被我的机器求解!
从此,自动化的机器极大地解放了人类。人类从此有了一个判定基准,先衡量一个问题是否属于图灵可计算,如果是,就可以从裤兜里掏出图灵机,盘之。
开天辟地,计算机这门学科诞生。计算机,一个魔力的机器,一个让人又爱又狠的机器。无数后身工程师为之努力奋斗、脱发明志,为之痴迷,为之疯狂!
图 1. Alan Turing (23 June 1912 – 7 June 1954), from wiki
冯诺依曼架构
尽管有了原理,此时天地昏暗,依然看不见光明。
冯诺依曼,跟着神的指引,构筑了世间万物。
他具体提出的是这样一种实现形式,由运算器、控制器、存储器、输入输出设备组成。
从 1945 年(1946 年 2 月 14 日对外公布)第一台计算机 ENIAC 诞生,到今天移动手机(也是一种计算机),计算机依然也基于这个架构进行设计。
图 2. ENIAC, 包含了万余电子元件,重达 27 吨,占地 167 平方米。运行起来耗电 150 千瓦,有传言说,每当这台计算机启动的时候,费城的灯都变暗了。
图 3. iPhone 6, 发布于 2014 年 9 月。其采用了 A8 处理器,20nm 制程,包含约 20 亿晶体管。
计算机就像一个数据计算加工的工厂,控制器有条不紊根据一条条指令控制处理器中的各个状态,指挥数据的搬运和计算,并与各类外设进行交互。
CPU
CPU 是整个计算机的核心,承担着运算和控制的功能。CPU 从存储设备中读取代码和数据,尽管现代处理器对代码和数据会有不同的处理,但是其本质上并没有严格的区分。代码由一条一条的指令组成,CPU 按照顺序一条一条执行从存储设备中读取的指令(至少从软件和程序员等使用者的视角看是这样),指令可以是修改 CPU 的状态,进行运算,或者是从其他硬件读取信息或者输出信息。
图 4. 这是 Intel 8086 处理器,和现在的处理器“长相”很不一样,但是你案头的计算机用的处理器很可能与之兼容(除非你是新版 Apple 或者你自己知道你用的不是 x86 架构的处理器)。图源自 wiki,获 CC BY-SA 授权
目前市面上的处理器拥有很多种不同的 ISA(Instruction Set Architecture),ISA 定义了程序员如何使用 CPU,如处理器有哪些指令、指令编码方式和功能、寄存器的大小数量和功能、怎么寻找和读取数据、能暂存多少数据、每个暂存的数据有多大、数据存放的顺序如何等等各种约定,并不是指令的简单集合。一般来说,为其他 ISA 编译好的程序是不能够直接在当前 ISA 上运行的,需要转译,或者(在有源代码的情况下)重新按照当前 ISA 进行编译。同学们在下载软件时,也要注意 ISA 的信息。下面是一些常见的 ISA:
- x86: 最经典最常见的 ISA,同学案头计算机的处理器基本都基于此,历史兼容性好(低情商:历史包袱重)
- ARM: 移动端(包括手机)常见的 ISA,不管是苹果还是遥遥领先,处理器都使用该 ISA。苹果 M 系列处理器也使用该 ISA
- RiscV: 新兴的开源 ISA,嵌入式设备中有使用,由于其设计比较简单,易于阅读和学习,学校也喜欢用于教学
- Loongarch: 一个国产自主设计的 ISA
- 还有其他诸如 MIPS、PowerPC 等架构不再赘述
现代的 ISA 一般都设计保护功能。保护功能提供不同的模式,在特权模式下,代码有对处理器和硬件的(几乎)完全的控制权;而在非特权模式(用户模式)下,代码只能控制有限的资源,进行“安全”的操作,而其他操作需要通过切换到特权模式完成。同时,ISA 提供了虚拟内存的功能,也就是将物理内存地址(也就是下文将提到的“存储空间的编号”)映射到虚拟地址,并设置访问权限。此时用户模式的程序员看到的是一片连续的地址空间,这样可以简化程序设计,同时提供安全隔离。
历史的注记
Intel 常年为 x86 的丑陋感到自卑。有一天在 HP 的“蛊惑”,联合开发了一个全新的 64 位架构 IA64 以图改变命运,处理器代号为安腾(Itanium)。该架构具有很多让人眼前一亮的特性,然而与之前 Intel 的 x86 完全不兼容。而 AMD 选择开发了与之前 x86 架构兼容的 AMD64 架构,迅速抢占市场份额。由于安腾落后的性能和开发速度,市场表现不佳,因此转而采用 AMD64 架构,或者更中立的名称,x86-64 架构,而安腾逐渐被历史淘汰。
内存
这里说的内存是 RAM(Random Access Memory),断电丢失数据的随机存储器。然而在不同语境下,内存也可以指下文中的“硬盘”,请注意区分。
内存是处理器 CPU 能够直接访问到的数据存储器。面向使用的程序员,内存被简化抽象为一个个存储单元,每个存储单元大小一个字节,或者说 8 比特,也就是 8 个数字 0 或者 1,每个存储单元都有唯一编号,就像一个浩大的图书馆,在每个书架每个特定的位置存放着图书,并有编号。CPU 就和我们找书的过程一样,通过编号,从内存拿出对应存储单元中的数据或者向存储单元写入数据。而随机存储器中“随机”的意思是不论拿什么编号来找数据,所需时间总是差不太多的。与之相对的是顺序存储器,比如磁带(后文有介绍)。
内存访问速度比其他外部存储要快,但是随着处理器的发展(由几 MHz 如 8086 的 5MHz 发展至几 GHz),内存速度的提升却跟不上处理器速度提升的步伐。今日从内存中找一个数据所需的典型时间内处理器大约能执行上百条指令,因此在离得更近的处理器内部引入了高速缓存。关于这一点,我们将在本章节第二部分讲述。
图 5. 一根台式机内存条,来自尔必达(日本),后为镁光公司收购。由于单颗内存芯片性能和性价比受限,故而将若干颗内存芯片并列组装成一个条形的内存模块。
历史的注记
你知道吗?历史上 Intel 早期是一家内存制造公司。后因与日本的公司竞争不利,随转向处理器制造。
关于内存的发展历史,曾有不少滔天巨浪。此提供若干关键词供感兴趣的人进一步了解: Rambus 之战, 奇梦达
硬盘
有时候也被称作“内存”或者“外存”(是不是有些混乱?),不过你只需要记住我们这里讲的是断电数据不丢失的可以反复改写的存储设备即可。
目前市面上主要有两种硬盘,一种是机械硬盘 HDD,里面有一组极为平滑如镜子一样的硬质盘片,表面有磁性物质,旁边有若干磁头,背面则有电路和芯片进行控制。机械硬盘工作时,盘片高速运转,电路控制磁头由于旋转带动的气流从而悬浮在盘片表面(仅有几十纳米甚至更小!)通过磁场读写其中的内容。由于这种机械的旋转结构导致其对振动较为敏感(剧烈的撞击极易导致磁头撞击盘片表面从而损坏磁介质,产生坏道),严忌于其工作时摔碰。
另一种是固态硬盘 SSD,里面没有高速运转的机械结构,取而代之的是闪存芯片和控制电路,在闪存芯片内部有大量的单元通过捕获电荷来存储信息。固态硬盘具有较为明确的寿命特点,其写入次数有限(个人日常使用的实际寿命并不一定比机械硬盘差,各有优缺),且由于电荷流失,长时间不通电时不能保证数据稳定(jedec 标准为在 TBW 寿命耗尽后断电下仅能保持 1 年,不过相较实验数据,实际情况都更为糟糕)。为了最大化固态硬盘寿命,其一般有较为复杂的控制电路,保证写入均匀地发生在固态硬盘的不同部位,也因此在异常断电等情况下也更容易发生损坏。
一般来说,固态硬盘较贵,速度较快,抗振动辐射,而机械硬盘较为廉价,但速率较低,不过相对固态硬盘数据存放稳定性较好。他们二者都是优秀的大容量存储媒介。不过总之,重要数据应该做好备份,硬盘有价,数据无价。
图 6. 机械硬盘内部结构。图源自 wiki,获 CC BY-SA 授权 图 7. 固态硬盘内部结构。左 SandForce 标志芯片为主控,负责与主机通讯以及管理和读写右侧 6 颗闪存颗粒内的数据。图源自 wiki,获 CC BY-SA 授权
注意
由于固态硬盘为了平衡擦写的特点,其引入了 FTL 映射表,用于将用户存储的位置(逻辑地址)和实际物理上闪存内部位置(物理地址)之间建立映射,于此同时数据被交叉分布在各个颗粒之间,在读取的时候可以并行从而极大地提高了传输速度,通道数量越多,传输速度越快,于此同时管理更复杂,可靠性更低。换言之,固态硬盘内数据都是以碎片形式存在的。 如果你在比较早的时候接触过或者从长辈口中听说过“磁盘碎片”这回事,请注意,固态硬盘不需要整理磁盘碎片。
其他你可能听说过或没有听说过的存储设备
- U 盘: 较为简化的一种固态硬盘,通过 USB 接口与主机连接,性能较弱,主控结构比较简单,所以可靠性不佳,用于临时的数据搬运
- 存储卡: 也是一种固态硬盘,接口为移动插拔做了优化
- 光盘: 在闪存时代前常见的存储设备用于交换数据(如 Windows 安装光碟),一般只能写入一次,存储容量在几百 M 到几十 G 不等。内部有一层薄介质,通过激光在上面进行刻蚀或由母盘压制而得,并通过反射读取信息
- 软盘:更古董的设备,一个薄磁性塑料软片,故名软盘,存储容量在几百 KB 至几 MB 左右
- 磁带:一圈一圈卷起来的塑料磁性软带,因此读取写入只能顺序进行,意味着找数据的时候需要倒带到指定位置,时间和倒带的距离成正比(非常非常非常慢)。曾经用于存储音频,后被用于长时间归档巨量数据,需要特定的仪器和环境,维护成本高。
常见存储设备对比
种类 | 单盘最大容量 | 密度 | 容量/价格 | 单盘带宽 | 延迟 | 可靠性 | 维护成本 |
---|---|---|---|---|---|---|---|
HDD | 24 TB | 中 | 8 GB/RMB | 300 MB/s | 10 ms | 高 | 低 |
SSD | 60 TB | 极高 | 2 GB/RMB | 6000 MB/s | 50 μs | 中 | 低 |
Blu-ray | 100 GB | 低 | 5.5 GB/RMB | 35 MB/s | 100 ms | 很高 | 中 |
Tape | 18 TB | 极高 | 45 GB/RMB | 750 MB/s | loooong | 很高 | 极高 |
存储层次结构
存储器有很多种类,速度、容量单价、稳定性都各有不同。根据其响应速度,存储器可被划分为多级结构:
图 8. 存储器层次结构示意图,公有领域作品
处理器中的寄存器,通常用于存储计算中的临时数据,随取随用性能要求极高,因此使用的晶体管非常多,同时其单位容量价格自然也是十分高。
在寄存器和内存中间,一般还存在多级缓存。高速缓存由硬件自动管理,对一般程序员不可见。常用的数据将被放入速度快很多的缓存中。但由于其仍然占用了不少宝贵的芯片面积,故缓存单位容量的价格也比较高,目前个人计算机缓存的容量普遍在数十 MB 以内。
内存参照前文,不再赘述。
以上三种存储都属于易失性存储(volatile),也就是断电后数据将会在短时间内消失。而其中前两种存储是静态随机存储,意味着在通电状态下其状态可保持不需要进行刷新,但制造所需晶体管较多。而后者为了实现更大化地存储,通过电荷存储在一个个微小的电容中,故只需要一个晶体管,但其随着时间电荷会逐渐流失导致数据丢失,因此需要每几个毫秒对每个存储单元都进行刷新操作,故称为动态随机存储。
局部性原理
你可能会想问,缓存为什么能够在程序员不参与的情况下完成内存访问的提速,这就涉及到一个重要的概念:局部性原理。这个原理主要说的是,一个程序在总是倾向于访问最近访问过的存储单元或者与之相邻的存储单元,缓存可以据此将最近访问过的存储单元放入自身当中,或者预测将要访问的存储单元,将其提前放入自身当中。当然这种预测并不会百发百中,而基于缓存的工作原理,提升自己程序的局部性,是改善程序性能的一个好方法。
GPU
图 9. Graphic Process Unit, 也叫做显卡,有独立显卡和集成显卡两种,前者以一种通过 PCIe 接口连接的扩展卡或直接独立集成在主板(通常存在于笔记本或者一体机内)的形式存在,而后者直接存在于处理器 SoC 内部(故名集成)。
图 10. 一张独立显卡内部(图源自 TechPowerUp,途中显卡型号为 RTX4090),包含居中镜面的硕大的 GPU 核心,供电电路(具有标志性的电感,以实现降压,通常一个电感为一相大致提供 20A~40A 左右。图中有 26 个,故可以粗略估计出该卡大致峰值允许的功耗在 500W 左右)和围绕着核心的若干个显存芯片(通常称为显存颗粒,图中为 12 个,每个位宽 32bit 即 32 根数据线,合计 12*2=24GB 大小 384bit 位宽)用于存储图像和计算数据。最左侧是四个视频输出接口,底部金色的 PCIe 接口接触点(通常成为金手指)插入主板上的插槽,与 CPU 相连。
GPU 用于图形处理加速和视频输出(因此如果使用独立显卡输出,显示器视频线需要连到显卡的接口,而不是主板上的),同时包含了各类专用的加速单元(见第二章详细介绍)。(省流:可以用来玩原神)
后用于大量并行处理,如 AI,科学计算等等。虽然 GPU 的计算能力远远大于 CPU,但是各自特色分明: CPU 擅长控制和逻辑,单核处理能力强的多,适合各种通用的场合; 而 GPU 仅适用于并行且逻辑简单的计算,以其独特的架构取胜。
主板
将各种硬件连接在一起,形成一个电路系统,为主芯片的工作提供各类条件支持(如供电降压,数据的传输,机械支撑,芯片工作顺序的控制等),提供固件进行硬件自我检查和系统初始化,保存各个硬件的配置等。
图 11. 一台笔记本电脑内部,上部蓝色主板上集合了若干各式功能的组件 (笔者自摄)
历史的注记
早年的计算机各个部件都是一个个独立的芯片,如 8086 是控制器和运算器,8087 芯片实现浮点计算的功能,8089 芯片则提供接口的功能,以及 82 系列的若干个功能芯片。后随着时代发展,这些功能被整合至一整个芯片上,称为 SoC(System On Chip, 片上系统)。
电源
为各类电子元件提供电力。CPU 和 GPU 核心的工作电压通常很低,只有 1V 左右,比一节干电池的电压还来得低,但是工作电流很高,有几十至上百 A。其他辅助芯片的电压通常也只需要 5 V 以内的直流供电。但是一般家庭供电是 220 V, 50 Hz 交流,因此需要此模块进行逐级降低,提供工作所需的大电流低电压。
外设
外设种类众多,提供计算机对外的数据接口,如有线或无线网卡可以使计算机连接到以太网,鼠标、键盘、显示器和声卡是人机交互的接口,而众人熟知的 USB 接口是各类外部设备与计算机进行交互的标准实现。设备种类众多,此处不一一赘述。
Peripheral Component Interconnect Express,简称 PCI-E,官方简称 PCIe,由早年的 PCI 接口演变而来。是计算机总线的一个重要分支,用于 CPU 系统与其他设备比如 GPU、网卡、固态硬盘的连接,也可以延伸到芯片组间的连接,其最大特点是标准化,模块化和可移植性,一个显卡或网卡可以插入不同的电脑均可自动正常运作。
从 2003 发布 PCIe 1.0 至如今,PCIe 速率有着大幅进步,由 1.0 的 2.5GT/s,2.0 的 5GT/s 至 3.0 达到 8GT/s,4.0 则高达 16GT/s。
PCIe 由电源,一些辅助信号和若干条 Lane 组成,不同的 Lane 间数据并行传输,提高了传输速率。一个 Lane 由两根线组成,其之间相互电磁耦合,有效降低信号干扰和外部的电磁噪声,从而实现了极高的传输速率(参见双绞线以了解其物理原理)。GT/s 代表一条链每秒钟传输 16G 次,每次一条链估算近似能传送 1bit(8 个比特组成一个字节),故对于一个 PCIe 4.0 x4 的固态硬盘,其最大传输速率大致为 16GT/s*4lanes/8bit=8GB/s。
软件
软件根据其功能不同也可以分为很多种,有一些软件是直接跟硬件打交道的,而另一些软件则直接跟用户打交道。前者包含操作系统和硬件驱动程序,而后者是我们平时使用的各类应用程序。另外,人们发现,各类软件有很多功能是相同的,于是人们开发了各种各样的“库”这个软件,为各个软件公用。
操作系统和硬件驱动程序为上层的各类用户软件提供了对各种资源,比如处理器、内存、网络、各种外部设备如打印机等的统一抽象和管理,使得大部分应用程序在大部分不同的硬件上都能正确、安全、高效地运行,简化了应用程序员的工作,同时也将不同资源进行隔离,尽可能防止有缺陷或者恶意的程序影响其他程序运行。
开机
当你给你心爱的电脑插上电源,按下开机键,会发生什么事情?
通常,我们称计算机的启动过程为 BOOT,来自于一个单词 BOOTSTRAP(靴子)。
BOOTSTRAP 的意思是 靴带,来自短语:“Pull oneself up by one’s bootstrap”——用靴带将自己拉起来
通常在 CPU 或南桥(一个用于辅助 CPU 的芯片,包含了大量低速外设的控制逻辑)中存在着一个极其简易的待机控制电路,其只要在插上电后便会获得电源供应就会运转起来,等待外部的各种信号。
当按下开机键的时候,信号经由嵌入式控制器传送至电源控制电路,随后其将启动内部的振荡器为 CPU 的工作提供时钟信号,并将 CPU 复位线以及外设复位线置位(在随后的 Advanced 教程中会具体说明),并启动主板上的电源降压单元。当降压单元稳定后其会输出 PWRGD(POWER GOOD)信号通知其取消 CPU 复位,CPU 开始进入工作状态。
CPU 刚启动的时候,CPU 将从固定的位置内获取第一条指令,该地址被映射到 BIOS 芯片,通常是一颗容量在几 MB 至几十 MB 的闪存。
图 12. 图中为来自华邦公司的 25 系列 SPI NOR Flash,型号 W25Q32BVSIG,容量 32Mbit,存有 BIOS 程序
首先 BIOS(Basic Input Output System,基本输入输出系统)程序将进行称为自检(POST,Power On Self Test)的过程,第一步是进行内存的初始化,因为现在的 BIOS 程序功能非常的复杂,自己就是一个小型操作系统(如可以联网,甚至可以通过 HTTP 下载文件)。
因为此时内存尚未就绪,CPU 将使用内部的高速缓存作为临时的数据存放的地方为初始化的程序所使用。CPU 将根据内存上的一颗 SPD 存储器的信息,进行训练和学习寻找合适的电气参数(如内存频率和时序等)以保证数据可以正确的在 CPU 和内存之间传输,随后将高速缓存修改为正常工作模式。
随后将进行 CPU 的功能的一些初始化(如调节 CPU 的电压或频率,以及一些功能的启用或关闭),以及检查显卡、磁盘等关键设备是否存在功能异常,并进行一个最基本的,能用就行的初始化。当上述检查和初始化发生错误,或者无法找到合适的参数,程序将操控主机上的 LED 灯珠(如某些主板上具有 DEBUG 灯,或者使用硬盘或电源指示灯)或者通过蜂鸣器(一种迷你的喇叭)的声响发出警告。
当初始化完毕,主机 LOGO 也就能够显示在屏幕上,随后对各个磁盘进行搜索操作系统的引导程序(其将依次启动内核和操作系统各个必要的服务程序,并进行更高层次的硬件各个功能的初始化和复位,如更高级的电源管理功能,其也通常是与操作系统相关),并根据启动顺序进行启动,将控制权交由操作系统。
其中我们着重介绍 Windows 操作系统和 Linux 操作系统。
Windows
Windows 是微软公司开发的图形化操作系统,具有成熟的图形界面。同学们个人计算机日常使用的系统很可能就是 Windows(苹果用户除外)。Windows 系统较为庞大,里面很多组件在日常使用中完全用不到,甚至是以一种历史包袱的形式存在。不过正因为如此,很多老旧的将近 20 年前的 Windows 软件仍然能在最新的系统中正常运行。
Linux
从 1991 年 Linus 宣告 Linux 的存在,到 2024 年,Linux 已经走过 30 多个年头。下面是 Linus 向社区宣告 Linux 存在的邮件(尽管当时还没有名字):
Hello everybody out there using minix -
I'm doing a (free) operating system (just a hobby, won't be big and
professional like gnu) for 386(486) AT clones. This has been brewing
since april, and is starting to get ready. I'd like any feedback on
things people like/dislike in minix, as my OS resembles it somewhat
(same physical layout of the file-system (due to practical reasons)
among other things).
I've currently ported bash(1.08) and gcc(1.40), and things seem to work.
This implies that I'll get something practical within a few months, and
I'd like to know what features most people would want. Any suggestions
are welcome, but I won't promise I'll implement them :-)
Linus ([email protected])
PS. Yes - it's free of any minix code, and it has a multi-threaded fs.
It is NOT protable (uses 386 task switching etc), and it probably never
will support anything other than AT-harddisks, as that's all I have :-(.
严格来说,Linux 只是一个“操作系统内核”,并没有包含用户态的程序,而一般来说,一个完整的操作系统需要包含用户态的一些基础设施,比如供更上层应用程序使用的库函数,以及用于管理其他软件和硬件,但不必放进内核态的程序。目前说 Linux 操作系统,一般指的是基于 Linux 内核衍生的各大发行版。大多发行版采用了来自 GNU 这个组织制作的各类辅助基础设置,故全名为 GNU/Linux。各种 Linux 发行版为 Linux 内核配置了一系列用户态程序,这样才能构成一个完整的操作系统。
与 Windows 内核(名字是 NT 内核)不同,Linux 内核并不直接提供图形界面,只提供了最基本的各个接口,Linux 发行版的图形界面属于用户态程序,且是选配的。因此对于一个不需要图形界面的服务器,完全可以省下这一笔空间。与 Windows 不同,在 Linux 发行版中,Linux 内核和系统的其他组建完全都是由一个个软件包组成的,如果你不需要某个功能,完全可以将相应的软件包移除。也可以用其他功能类似的软件包替换某个软件包。系统具有高度可定制性。
Linux 是一种类 Unix 操作系统,API 符合 POSIX 标准。
历史的注记
微软在 21 世纪初将 Linux 称作“癌症”,认为 Linux 侵犯了知识产权,试图在客户中培育对 Linux 的恐慌,并以专利威胁起诉 Linux 开发者。然而十年后,微软表示“We love Linux”,可能是因为 Linux 在服务器市场占有率已经很高了。不过,由于微软曾经和网景和 Sun(Java)上"Embrace, extend, and extinguish"的 3E 战略垄断扼杀的黑历史,大家依然对微软的举动保持警惕。
历史的注记
Windows 有一个臭名昭著的“功能”————蓝屏死机,Blue Screen of Death,非常的生动形象(:。这是 NT 内核在遇到不可恢复的错误时产生的错误提示信息,系统将进行冻结并重启把正在进行的事情搞砸(我论文还没保存呢!),由于蓝色色调本身较冷,以及早期 Windows 给人以不稳定的印象,这个界面因此变得声名狼藉。而对于 Linux,这个情况被称为 panic。Linux 内核并不会出现蓝屏,一方面是 Linux 的错误分级相对良好,驱动常年迭代更新,在一些不重要的错误情况(注: 曾经有过某些 Windows 驱动开发者为了便于调试,在任何错误的条件下使用蓝屏的手段以导出状态进行调试。这一特性被继承到了实际用户手上)下允许内核“带病运行”(这不一定是好事),另一则是由于 Linux 无法直接提供图形界面,因此内核错误信息只显示在非图形界面的终端上,使用图形界面的用户只能看到大写锁定键的灯光一直闪烁,看不到任何提示信息。最近 Linux 内核开发者试图在内核严重错误时绘制一个黑色界面,并展示一个二维码作为错误提示信息。
其他操作系统
- macOS: 苹果专用,符合 POSIX 标准的 Unix 系统,老版本可在 Intel 机器安装(需要魔法),内核叫 Darwin,修改自 BSD 系内核,内核部分开源
- FreeBSD: 符合 POSIX 标准的类 Unix 系统,和 Linux 只是内核不同,FreeBSD 带有完整的用户态程序,同时其采用更宽松的许可协议,而不是 Linux 的 GPLv2。
- MSDOS: 古老的操作系统,无图形界面,已不使用,微软近期开源了几个版本的 DOS。FreeDOS 则是由其他志愿者实现的开源版本替代。
移动操作系统
- Android: Google 开发的基于 Linux 内核的操作系统,Google 自己在上面开发了 AOSP 一套基础设施环境。
- iOS: 苹果公司的产品,2007 年随 iPhone 横空问世,基于 Darwin 内核开发,封闭性较强。
应用程序
可执行文件
在冯诺依曼机内,数据和指令均被存储在磁盘内。为了存储这些这些信息,将其抽象为一个个文件,比如有的储存图片,有的储存程序,有的储存文字信息。每一类信息,都可以一种或多种文件格式保存在电脑存储中。 程序代码也是以一种文件的形式存储,称为可执行文件,具有其特定的储存编码方式,记录了程序启动的方式和环境需求。Windows 中其格式被称为可移植可执行文件(PE),而 Linux 下则称为 ELF(Executable and Linkable Format)。PE 格式也被用于 EFI 程序和 vmlinuz(压缩的 Linux 内核镜像)封装。 当执行可执行文件时,操作环境(比如 bash 或者 Windows 资源管理器 explorer.exe)会请求 OS 读取该文件并加载准备所需的环境(如创造进程,准备文件描述符,准备虚拟地址空间并建立映射,进行动态链接等)。
进程
一个进程(Process)包含了一个程序运行的全部状态和属性。这也是冯诺依曼机的核心思想,当你获得了程序在内存以及寄存器中的状态也就得到了一切。一个例子是休眠,计算机可冻结并将内存写回硬盘并关机,随后在下次开机后恢复,维持原先的程序运行。 操作系统对各个进程分配资源,相互隔离并不断地进行时分复用(硬件上存在一个可编程的计时器每隔固定的间隔触发中断将处理器控制权交由操作系统),以实现一个系统上同时进行多任务(早期的如 DOS 系统只能同时进行一个程序)。
线程
线程(Thread)是轻量级的进程,一个进程可建立多个线程子程序任务同时执行。一般进程具有处理器和内存地址的隔离,而一个进程下的线程仅有处理器的隔离,虚拟内存地址是共用的,不同线程之间的通信成本要比进程之间小很多。
例外
例外(Exception),有些时候翻译为异常(此处异常通常指代 abnormality,对于硬件系统中通常异常不等于错误),通常后者称呼使用更多(后续使用异常这一称呼)。 通常异常的产生代表的是发生了一些例外情况,因此往往也代表着移交控制权,可以发生在硬件层面,也可以发生在软件层面。 硬件层面的异常通常包含有:
- 来自硬件的中断(Interrupt),比如键盘按下了一个键,或外设如网卡已经获取数据并已将其写入了内存,随后发出中断令处理器切换至相应的处理程序进行响应;
- 陷阱(Trap),包括调试陷阱,以及来自软件主动请求的系统调用(以前也称软件中断)。前者可用于程序的调试(或者程序运行中对某些状态进行捕获),而后者目的通常是向 OS 发出某些请求如打开文件等;
- 故障(Fault),通常是可以恢复的,也可能是有意为止的,可由硬件,也可由软件造成,发生后将调用内核内的故障处理程序处理并随后回到现场继续执行原先的代码,如发生了缺页,除法除数为 0,硬件发生了故障等,在不能处理时也会导致程序终止;
- 终止(Abort),也就是不可以恢复的严重问题,比如机器检查(一般是严重的硬件错误导致)、双重故障(也就是在处理故障时发生了另一个故障,一个简单的例子是缺页处理程序被交换出去,导致发生缺页时找不到缺页处理程序,从而发生另一个缺页故障)等。
例子
当你在一台笔记本上播放 PPT 的时候,按下空格键,计算机发生了什么?
键盘是由一个矩阵网络实现,嵌入式控制器每隔几 ms 进行扫描,以查看有哪些键被按下。此时,它发现了变化,随后其产生了一个信号经过一系列组件,最终到达 CPU 产生了一个外部中断(同时在一个寄存器内记录了这个中断的来源,每种来源都有一种代号)。
当处理器未设置屏蔽时,处理器便进入异常状态。首先,处理器将进入内核态,也就是将控制权转交给操作系统内核。CPU 将自动记录下一刻要执行的位置,随后跳转到中断入口程序(其位置通常是操作系统和硬件互相约定的,操作系统启动时将中断处理程序写入该位置)。
其将保存程序运行的中间状态到内存,进入等待调度程序的队列,根据寄存器中记录的外部中断的来源代号跳转到相应的程序进行处理。
哦!程序在 EC 内部的寄存器里查到了,原来是按下了空格键。于是,他到表格里查一查,发现一个名为 PowerPoint.exe 的程序,在等待空格键(处于阻塞睡眠状态)。随后操作系统将其唤醒,PowerPoint 发现收到了一个空格键,随后执行了翻页的动作,刷新屏幕生成动画,然后接着进入睡眠。
操作系统正是不断地从等待调度的队列取出进行程序的调度,恢复、执行、冻结,周而复始。
计算机网络
我们这辈人生活在一个高度信息化的时代中,自打记事开始,很多人就知道网络,并且经常在网上进行查找资料,聊天视频,联机游戏等活动。那么计算机网络究竟是如何组织起来的呢?我们这篇文章将做一些简要的介绍
OS/I 七层模型
--------------
| 应用层 | 7
--------------
| 表示层 | 6
--------------
| 会话层 | 5
--------------
| 传输层 | 4
--------------
| 网络层 | 3
--------------
| 数据链路层 | 2
--------------
| 物理层 | 1
--------------
目前基本不再使用 5、6 层的说法,按照 OS/I 的定义和现在的实际情况,5、6 层功能被 4、7 层包含。各层具体的作用我们以后再提。
TCP/IP 协议
TCP 和 IP 协议分别工作在上述模型的第四层和第三层,IP 协议为世界上每一个能连入全球互联网的设备分配一个地址,同时提供不可靠的包交换服务。数据包指的是一段长度有限(但不总是固定)的数据,不可靠的包交换意思是把数据包从出发地传送到目的地,但是不保证包按照顺序到达,不保证有且仅有一个包到达,不保证包内容正确。
IP 协议目前有两个版本,一个是 IPv4,其地址由点分十进制,也就是类似于 111.111.111.111 的形式表示,每个十进制范围是 0-255,同时有许多地址被保留,如 127.xxx.xxx.xxx,10.xxx.xxx.xxx,192.168.xxx.xxx,0.0.0.0,255.255.255.255 等等,它们或被用于标示本机回环地址,或被用于局域网内,或被用于广播地址或保留地址。即使不考虑上述情况,IPv4 也只能为最多 4294967296(42 亿)个设备分配唯一地址,很明显目前地球上的人口数已经远远超过这个数值,IPv4 已经接近枯竭。目前的缓解办法包括 NAT 等协议使得多台设备共用一个公网 IP,但是这样会存在很多不方便的地方。
练习
114.514.1919.810 是不是有效的 IPv4 地址?
目前正在快速普及的 IPv4 的后继者是 IPv6,其地址由冒号分隔的 16 进制组成,长度是 128bit。如果地址中存在连续多项 0,可以用两个冒号替代,但是只能替代一次。下面是一些 IPv6 的地址示例:
::1
240c:c001:1014:4a3a:22f7:cb5f:88e2:219d
fe80::b7bf:964:d695:708d
IPv6 资源丰富很多,基本不会存在枯竭问题。
TCP 是在 IP 之上的协议,利用 IP 协议提供的不可靠数据传输,为上层提供流式的端到端可靠数据传输。端口号是在这一层协议定义的。TCP 协议存有状态,必须先双方三次交互建立连接,每个数据报文对方都要确认,报文都带有编号和校验码,确保报文正确按顺序到达。TCP 不能保证服务质量,比如传输速率。
UDP 协议
与 TCP 同层还有 UDP 协议。UDP 协议不提供可靠传输服务,无状态,适合对数据准确性要求不高但是追求数据快速到达的场景,也适合上层实现别的可靠传输协议。
提示
指定端口号的地址,IPv4 可以写作 127.0.0.1:8080 这种形式,IPv6 可以写成 [::1]:8080 的形式。
DNS 协议
DNS(Domain Name System)协议是用于解析域名信息的协议。我们在日常上网的过程中,由于 IP 地址过于抽象难记,经常会使用类似于 pku.edu.cn
这样的域名,DNS 就是将域名转化为 IP 地址的服务。DNS 服务从点分隔的域名的最后一部分开始查找,整个查找过程先向系统预设的 DNS 服务器查找最后一部分 cn
,返回 cn
域名的服务器,然后向 cn
域名的服务器继续询问 edu
,直到整个域名解析完成,得到最终的 IP 地址。实际情况下,有时候 DNS 服务器会直接返回下一级域名服务器作为结果,也有时候会代替你继续查询,直接返回给你最终的结果。
提示
以前国内的网络运营商默认提供的 DNS 有时会遭到污染,进行植入广告等操作,这时候你可以自行更换 DNS 地址,你可以在互联网上查询到关于如何更换以及更换为哪些声誉较好的 DNS 服务的信息。