计算机是如何工作的

228 阅读7分钟

​一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

1.计算机的构成

        现代的计算机,⼤多遵守冯诺依曼体系结构。冯诺依曼体系由冯诺依曼提出的,因此冯诺依曼被曾为计算机之父。

        冯·诺依曼(John von Neumann,1903年12⽉28⽇-1957年2⽉8⽇), 美籍匈牙利数学家、计算机科学家、物理学家,是20世纪最重要的数学家之⼀。冯·诺依曼是布达佩斯⼤学数学博⼠,在现代计算机、 博弈论、核武器和⽣化武器等领域内的科学全才之⼀,被后⼈称为“现代计算机之父”、“博弈论之⽗”。

讲一个故事

        冯诺依曼坐⻋的时候遇到了普林斯顿大学的研究员,聊起了做这个话题,他们在做⼀个研究导弹轨迹的机器但遇到了很多困难,冯诺依曼后⾯去参观并提供了著名的冯诺依曼体系,因为冯诺依曼体系结构是在普林斯顿⼤学研究并创建的,因此冯诺依曼体系结构也被称为普林斯顿结构。

1.1 计算机二进制

        除了冯诺依曼体系结构,还有计算机的⼆进制也是冯诺依曼发明并提出的。

1.2 冯诺依曼体系结构

1.2.1 CPU(加工厂)

        CPU 中央处理器:进行算术运算和逻辑判断。

1.2.2 存储器(仓库)

        分为外存和内存,用于存储数据(使用二进制方式存储)。 内存、外存(硬盘、U盘、光盘、软盘...),之前写的代码都是在内存中。

内存 VS 外存对比:

  • 内存小,外存大
  • 内存的制作工艺高因此比较贵,外存成本低
  • 内存操作速度快(纳秒级别)、外存操作速度慢(微秒级别),⼀纳秒等于 10 的 -9 次方,⼀微秒等于 -3 次方,相差好几个数量级。
  • 内存重启之后数据丢失,外存数据会永久保存(除非人为删除)。

1.2.3 输入设备(原材料) 

键盘、⿏标、摄像头、⻨克⻛...

1.2.4 输出设备(产品)

显示器、音响、打印机...

PS:有些设备即使输⼊设备⼜是输出设备,⽐如触摸屏。网卡即使输⼊⼜是输出设备。 

关于存储空间 :

        硬盘 > 内存 >> CPU

关于数据访问速度:

        CPU >> 内存 > 硬盘

2.硬件—CPU 是如何工作的

2.1 CPU 定义和组成

        CPU 也称为微处理器,是计算机的心脏和/或大脑,它的主要工作是执行算术和逻辑运算并将指令编排在⼀起。

CPU 有两个主要组件:

  1. 算术和逻辑单元 ALU(Arithmetic & Logic Unit)
  2. 控制单元 CU(Control Unit)

2.2 算术和逻辑单元 ALU

        ALU 是计算机中进行算数、逻辑运算的核心部件,是计算机的数学⼤脑。 

算术和逻辑单元又分为:

  • 算术单元
  • 逻辑单元

2.2.1 算术单元

        算数单元,负责计算机⾥的所有数字操作,⽐如四则运算、或 8 位(bits)的加法器(adder)。 要理解 8 bits 的加法器,我们需要了解⼀些前置知识,⽐如以下这些:

① 电⼦开关

通过电⼦开关我们可以实现 1 位(bit) 的逻辑运算,它是实现如下:

② ⻔电路

⻔电路可以实现 1 位(bit) 的基本逻辑运算,如下图所示:

③ 进制相加的特点

 

④ 半加器

通过前⾯的前置知识,我们就可以通过半加器实现两个 1 bit 数的相加了,如下图所示:

⑤ 全加器

⽽通过半加器我们就可以实现全加器了,也就是进⾏ 3 个 1 bit 数的相加了,如下图所示:

并且我们也可以实现 8 bit 的加法器了,如下图所示:

能够实现加法器,也就能实现减法操作和乘法操作已经除法操作了。

  • 减法器就是加⼀个负数 +(-n)。
  • 乘法器就是 N 个数相加,⽐如 3*3=9 就是 3+3+3=9。
  • 除法器是 N 个数相减,⽐如 24/8=3 就是 24-8-8-8=0 结果就是 3(3个8连减,最后为0)。

 2.2.2 逻辑单元

        逻辑单元主要⽤来进行逻辑操作,最基本的操作就是 与、或、⾮操作,但不只是⼀位(bit)数的⽐较。

2.2.3 寄存器(Register)和内存(RAM)

        光有 ALU 还是远远不够的,我们还要为 ALU 提供存储的部件。 存储的前置知识是门锁,如下图所示,利⽤门锁可以实现 1 bit 的存储:

使⽤⻔锁就可以实现寄存器,如下图所示:

        内存的构建要比这个复杂⼀点,但基本原理⼀致。如此构建的内存被称为 RAM(Random Access Memory),可以⽀持 O(1) 时间复杂度访问任意位置的数据,这也就是我们数组下标访问操作是 O(1) 的 硬件⽀持。

2.3 控制单元 CU(Control Unit)

        我们现在有 ALU、存储了,但这还是不⾜以让我们的计算机⼯作起来,我们需要有⼀个部件来指挥ALU 进⾏何种的运算,⽽这个部件就是控制单元(CU)。指令按顺序存储在 RAM 中,控制器通过读取将指令,并通过算术逻辑单元进⾏执⾏。以上内容就是最基本的 CPU 运⾏的基础知识了。

 3.软件

        计算机除了硬件之外最重要的资源就是软件了,⽽系统中最⼤、最重要的“软件”就是操作系统了。

3.1 操作系统(Operating System)

        操作系统是⼀组做计算机资源管理的软件的统称。⽬前常⻅的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。

3.2 进程

进程(Process)是操作系统分配资源的基本单位,⼀个进程拥有的资源有⾃⼰的堆、栈、虚存空间(⻚表)、⽂件描述符等信息。 从编程的⻆度来理解进程,可以把它看作是⼀个类或⼀个 PCB(Process Control Block)进程控制块的结构体。

        简单来说,将⼀个可执⾏⽂件运⾏起来就是⼀个进程。进程可以看作⼀个程序运⾏的“过程”。

注意区分: 程序(可执行文件)和进程:

  • 程序是⼀个静态的磁盘上的⼀个⽂件。
  • 进程将可执⾏⽂件加载到系统中,加载就是将信息放⼊内存中,分配⼀些资源,并且执⾏程序包含的所有指令。

进程是操作系统分配资源的最小单位。

        进程ID(PID)并不是固定的,PID 是进程 ID,相当于你的身份证号,重启前后的 PID 是不同的(需要注意)。

 3.2.1 进程的本质

      进程本质就是⼀个 PCB(Process Control Block)结构体,类似于 Java 中的类,⽽这个 Java 中的类包含了:

1.PID:进程的唯⼀身份标识。

2.进程状态包括:

  • 新建状态
  • 就绪状态
  • 运行状态
  • 阻塞状态
  • 销毁状态

3.优先级: 决定进程的执⾏顺序。

4.记账信息:为了保证进程执⾏的相对公平。

5.上下⽂: 保存本次的执⾏状态,以便下次继续执⾏,整个过程就称之为⼀个上下⽂。

6.⼀组内存:指定进程需要使⽤的资源。

 

 3.2.2 进程关联的重要概念

时间片:每个进程得的 CPU 执⾏的时间叫做时间⽚。

        内核态和用户态:内核态表示操作系统作为最底层的软件拥有最⾼的权限就叫做内核态,⽤户态指⽤户编写的程序。

 3.3 线程

        线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。⼀条线程指的是进程中⼀个单⼀顺序的控制流,⼀个进程中可以并发多个线程,每条线程并⾏执⾏不同的任务。在 Unix System V 及 SunOS 中也被称为轻量进程(lightweight processes) ,但轻量进程更多指内核线程(kernel thread) ,而把用户线程(user thread)称为线程

比如:

        ⼀家公司要去银⾏办理业务,既要进⾏财务转账,⼜要进⾏福利发放,还得进⾏缴社保。如果只有张三⼀个会计就会忙不过来,耗费的时间特别⻓。为了让业务更快的办理好,张三⼜找来两位同事李四、王五⼀起来帮助他,三个⼈分别负责⼀个事情,分别申请⼀个号码进⾏排队,⾃此就有了三个执⾏流共同完成任务,但本质上他们都是为了办理⼀家公司的业务。此时,我们就把这种情况称为多线程,将⼀个⼤任务分解成不同⼩任务,交给不同执⾏流就分别排队执⾏。其中李四、王五都是张三叫来的,所以张三⼀般被称为主线程(Main Thread)。

 3.3.1 线程优势

        线程的创建和消耗比进程成本低很多,效率更高,而且同⼀个进程中的多个线程是可以共享资源⽂件的,而进程和进程之间是不能共享资源的,因此这就是线程的诞⽣的意义。

线程间可以共享的资源:

  1. 内存可以共享
  2. 打开的文件可以共享

线程间不可用共享的资源:

  1. 线程的上下文、状态、优先级、记账信息不共享。
  2. 每个线程有⼀个栈空间不共享。

         线程可以理解为⼀个轻量级的“进程”。进程是操作系统资源分配的最小单位线程是操作系统执行和调度(运行)的最小的单位。

 3.3.2 进程 VS 线程

进程和线程的区别主要体现在以下⼏点:

  • 从属关系不同:进程是正在运⾏程序的实例,进程中包含了线程,⽽线程中不能包含进程。
  • 描述侧重点不同:进程是操作系统分配资源的基本单位,⽽线程是操作系统调度的基本单位。
  • 共享资源不同:多个进程间不能共享资源,每个进程有⾃⼰的堆、栈、虚存空间(⻚表)、⽂件描述符等信息,⽽线程可以共享进程资源⽂件(堆和⽅法区)。
  • 上下文切换速度不同:线程上下⽂切换速度很快(上下⽂切换指的是从⼀个线程切换到另⼀个线程),而进程的上下⽂切换的速度⽐较慢。
  • 操纵者不同:⼀般情况下进程的操纵者是操作系统,⽽线程的操纵者是编程⼈员。

3.3.3 线程不是越多越好

        同⼀时间可以运行线程的 CPU 是固定的,如果超过了最大值,其他的只能排队处理,这样就起不到多的作用了,并且线程的调度也需要消耗时间,因此并不是线程越多越好。 

线程的数量和两个因素有关系:

  1. CPU 的数量。
  2. 任务的类型,计算密集型任务/IO 密集型任务(要深度使⽤ CPU),如果是计算密集型任务线程数量约定于 CPU 数量,如果是 IO 密集型任务(不太⽤ CPU 资源),原则上是线程数量越多越好。