Skip to content

计算机是怎样跑起来的笔记

计算机的三大特性

  • 计算机是执行输入、运算、输出的机器
  • 程序是指令和数据的集合
  • 计算机的处理方式与固有思维不同

IC(集成电路)

计算机的基本硬件组成

计算机三大件:CPU、内存和主板

CPU(Central Processing Unit)中央处理器

计算机的所有“计算”都是由 CPU 来进行的,CPU 也是整台计算机中造价最昂贵的部分之一。CPU是一个超级精细的印刷电路版。

内存(Memory)

撰写的程序、打开的浏览器、运行的游 戏,都要加载到内存里才能运行。程序读取的数据、计算得到的结果,也都要放在内存里。内存越大,能加载的东西自然也就越多。

主板(Motherboard)

主板的芯片组(Chipset)和总线(Bus)解决了 CPU内存 之间如何通信的问题。芯片组控制了数据传输的流转,控制数据从哪里到哪里。总线则是高速公路。总线速度,决定了数据能传输得多快。

IO设备(Input/Output)设备

用于和计算机进行交互。作为外部 I/O 设备,它们是通过主板上的 南桥(SouthBridge)芯片组,来控制和 CPU 之间的通信的。

  • 南桥在主板上的位置南边,另一方面,它的作用就是作为,来连接鼠标、键盘以及硬盘这些外部设备和 CPU 之间的通信。
  • 以前的主板上通常也有“北桥”芯片,用来作 为“桥”,连接 CPU 和内存、显卡之间的通信。不过,随着时间的变迁,现在的主板上 的“北桥”芯片的工作,已经被移到了 CPU 的内部,所以你在主板上,已经看不到北桥芯 片了。

显卡(Graphics Card)

通常主板都带了内置的显卡,如果需要玩游戏和做大规模渲染,则需要独立显卡,插在主板上。显卡之所以特殊,是因为显卡里有除了 CPU 之外的另一个“处 理器”,也就是GPU(Graphics Processing Unit,图形处理器),GPU 一样可以做各 种“计算”的工作。

冯·诺依曼体系结构

冯·诺依曼体系结构也叫存储程序计算机,拥有运算器、控制器、存储器、输入设备和输出设备这五大基本组件。

手机的硬件组成

我们手机里只有 SD 卡(Secure Digital Memory Card)这样类似硬盘功能的存储卡插槽,并没有内存插槽、CPU插槽这些东西。因为手机尺寸的原因,手机制造商们把 CPU、内存、网络通信,乃至摄像头芯片,都封装到一个芯片,然后再嵌入到手机主板上。这种方式叫SoC,也就是 System on a Chip(系统芯片)。

“可编程”计算机,“存储”计算机

可编程

计算机是由各种门电路组合而成的,然后通过组装出一个固定的电路版,来完成一个特定的计算程序。一旦需要修改功能,就要重新组装电路。这样就不是可编程的计算机了。老式计算器的本质是一个不可编程的计算机。因为电路板设好了加减乘除,做不了任何计算逻辑固定之外的事情。

存储

程序本身是存储在计算机的内存里,可以通过加载不同的程序来解决不同的问题。如果不可存储,只能使用固定的程序。

First Draft(第一份草案)

首先是一个包含算术逻辑单元(Arithmetic Logic Unit,ALU),和处理器寄存器 (Processor Register)的处理器单元(Processing Unit),用来完成各种算术和逻辑运算,它能够完成各种数据的处理或者计算工作,可以称其为数据通路 (Datapath)或者运算器。

然后是一个包含指令寄存器(Instruction Reigster)和程序计数器(Program Counter) 的控制器单元(Control Unit/CU),用来控制程序的流程。

在现在的计算机里,上面的算术逻辑单元和这里的控制器单元,共同组成了我们说的 CPU

用来存储数据(Data)和指令(Instruction)的内存。以及更大容量的外部存储,在过去,可能是磁带、磁鼓这样的设备,现在通常就是硬盘。

用来和计算机进行交互的各种输入和输出设备,以及对应的输入和输出机制。

性能

性能是衡量运行效率的关键词。

什么是性能

性能监测工具 NewRelic

  • 第一个是响应时间(Response time)或者叫执行时间(Execution time)。想要提升响应时间这个性能指标,你可以理解为让计算机“跑得更快”。响应时间代表了每个外部的 Web 请求的执行时间

  • 第二个是吞吐量(Throughput)或者带宽(Bandwidth):指我们在一定的时间范围内,到底能处理多少事情。

提升性能:

  • 提升吞吐量:增加核心数,在单位时间 内就可以处理更多数据,吞吐率提升
  • 多加一些机器,堆硬件
  • 提升响应时间:从cpu入手

计算机的计时单位:CPU 时钟

通过 Linux 下有一个叫 time 的命令,可以帮我们统计出来,同样的 Wall Clock Time(运行结束的时间减去程序开始运行的时间)下,程序实际在 CPU 上到底花了多少时间。

运行一下 time 命令。他会返回三个值,

  • 第一个是real time,也就是运行程序整个过程中流逝掉的时间。
  • 第二个是user time,也就是 CPU 在运行你的程序,在用户态运行指令的时间。
  • 第三个是sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的时间。

程序实际花费的 CPU 执行时间(CPU Time),就是 user time 加上 sys time。

即使我们已经拿到了 CPU 时间,我们也不一定可以直接“比较”出两个程序的性能差异。同一台计算机上,CPU 可能满载运行也可能降频运行,降频运行的时候自然 花的时间会多一些。性能指标还会受到主板、内存这些其他相关硬件的影响

程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间

功耗

CPU一般被称作超大规模集成电路,这些电路,实际上都是一个个晶体管组合而成的。这些电路,实际上都是一个个晶体管组合而成的。CPU 在计算,其实就是让晶体 管里面的“开关”不断地去“打开”和“关闭”,来组合完成各种运算和功能。

提升CPU速度可以从以下方向入手

  • 增加密度:同样的面积里面,多放一些晶体管;
  • 提升主频:让晶体管“打开”和“关闭”得更快一点;

功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量

制程的优化和电压的下降可以提升cpu的功耗

阿姆达尔定律

CPU并行,提升吞吐量。增加CPU的核心数量。

但是,并不是所有问题,都可以通过并行提高性能来解决。如果想要使用这种思想,需要满足这样几个条件。

  • 需要进行的计算,本身可以分解成几个可以并行的任务
  • 需要能够分解好问题,并确保几个的结果能够汇总到一起
  • 在“汇总”这个阶段,是没有办法并行进行的,还是得顺序执行,一步一步来。

阿姆达尔定律:优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间

计算机指令

硬件的角度来看,CPU 就是一个超大规模集成电路,通过电路实现了加法、乘法以及各种各样的处理逻辑。 软件角度上来看,CPU 就是一个执行各种计算机指令(Instruction Code)的逻辑机器,计算机指令,就好比一门 CPU 能够听得懂的语言,我们也可 以把它叫作机器语言(Machine Language)。 不同的CPU架构不同,手机用的ARM的 CPU,电脑用的Intel 的 CPU。类似这样两种 CPU 各自支持 的语言,就是两组不同的计算机指令集。

计算机平时都存储在存储器中,这种程序储存在存储器中都计算机就叫做存储程序计算机。

代码转换成机器码

要让程序在一个linux操作系统跑起来,我们需要把整个程序翻译成一个汇编语言(ASM,Assembly Language)的程序。这个过程我们一般叫编译(Compile)成汇编代码。 针对汇编代码,可以再用汇编器(Assembler)翻译成机器码(Machine Code),这些机器码由“0”和“1”组成的机器语言表示。这一条条机器码,就是一条条的计算机指令。

解析指令和机器码

cup指令,常用的英特尔有 2000 条左右的 CPU 指令,他们分为5大类:

  • 算术类指令:我们的加减乘除,在 CPU 层面,都会变成一条条算术类指令。
  • 数据传输类指令:给变量赋值、在内存里读写数据,用的都是数据传输类指令。
  • 逻辑类指令:逻辑上的与或非。
  • 条件分支类指令:日常我们写的“if/else。
  • 无条件跳转指令:调用函数时跳转。

Released under the MIT License.