计算机的工作原理(冯诺依曼体系)

Posted 爱敲代码的三毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机的工作原理(冯诺依曼体系)相关的知识,希望对你有一定的参考价值。


一、冯诺依曼体系

约翰·冯·诺依曼,可以说是计算机的祖师爷。被后人成为“现代计算机之父
它提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。

  • CPU 中央处理器: 进行算术运算和逻辑判断.
  • 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
  • 输入设备:用户给计算机发号施令的设备.
  • 输出设备: 计算机个用户汇报结果的设备

如果对于存储空间
磁盘 > 内存 > CPU
如果对于访问速度
CPU > 内存 > 磁盘

二、CPU的基本工作流程

CPU想必都不陌生,现在的电脑CPU已经到了 11 代了,这个 2.40GHz是什么意思呢。这其实是CPU的主频
粗略的说:CPU的主频就是时钟的震荡的每秒次数,可近似的看作每秒执行的指令数。简单的说就是主频决定了CPU的运算速度。

接下来,我们用一个从无到有的过程,一步步搭建一个 CPU 出来,希望大家可以借助这个过程,理解CPU、内存等计算机主要部件的工作原理。

1.逻辑门

电子开关 —— 机械继电器(Mechanical Relay)

通过电子开关,我们可以实现 1 位(bit) 的看似无用的逻辑运算。

2.门电路(Gate Circuit)

接下来,我们学习如何使用电子开关构建一些有用的部件 —— 门电路。可以实现 1 位(bit) 的基本逻辑运算。其实几个门电路非常好理解,Java的逻辑运算差不多。

1.非门

非门非常好理解,输入为 true 输出 false,输入false 则输出 true

2.与门

两个都为 true才输出true,否则输出false

3.或门

一个为 1则为1,两个为 false 则为false

4.异或门

通过非门与门和或门相结合就形成了异或门,相同为 false,不相同则为 true

这里的 true 和 false 在计算机里其实就是 1 和 0

3.算术逻辑单元 ALU(Arithmetic & Logic Unit)

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

说到运算我们首先想到二进制的运算,这个想必大家都了解,逢二进一嘛。

1.算术单元

算数单元,负责计算机里的所有数字操作,比如四则运算,当然它能做的远远不止这些。

半加器:
半加器就是通过一个与门和异或门,来计算两个 1位(bit)数的相加,既要考虑到和也要考虑到进位。

全加器:
全加器是通过两个半加器进行 3个1位(bit)的数 进行运算,同样要考虑计算出来的和是否要进位

加法器

通过1个半加器和7个全加器就能组成一个能计算 8个位 1位(bit) 的全加器。
图中的A和B就是输入的两个数的第几个bit位,同理 S 就是输出数的 bit 位

算术单元支持的操作当然远不止这些,通过继续组合逻辑门,算数单元可以做到加减乘除甚至更多的算术运算,但一个加法器作为演示已经足够了。
其实计算机只能做加法运算,都是通过加法器来实现的,因为计算机里存的都是补码,就是为了通过加法器来计算加减乘除运算,只不过更复杂,这里就不深究

2.逻辑单元

逻辑单元主要用来进行逻辑操作,最基本的操作就是 与、或、非操作,但不只是一位(bit)数的比较

三、存储器

存储器分为内存外存
内存:就是平时所说的电脑内存,也就相当于手机的运存。
外存:磁盘、U盘等。
内存比较而且贵,外存比较大但比较便宜。

内存有一个特点:它可以随机访问内存中任意地址的数据。
外存其实也有随机访问的能力,但开销较大,所以外存更适合顺序访问。
内存的访问速度非常快,外存的访问速度非常慢。

CPU上其实也能存储,CPU上的寄存器,内存更小速度非常的快,也更加的贵!

四、操作系统(OS)

操作系统是一个"搞管理" 的软件
1.管理硬件设备
2.管理软件资源(文件、进程)
所谓的”管理“一般值的是两个方面:描述+组织

1,进程

进程是操作系统中非常核心的一个概念,进程其实是计算机完成工作的一个"过程"

如图所示:进程就是一个正在运行的程序,要想让进程跑起来,就得给这个进程分配一定的系统硬件资源(CPU,内存,磁盘,网络带宽…)

关于进程,最核心的问题就是进程在系统中是如何被管理的,
管理 = 描述(PCB) + 组织

PCB:进程的控制块,这是一个C语言的结构体类似于Java中的类,一个结构体对象就对应一个进程

组织:使用一定的数据结构来组织,常见的作法就是使用双向链表

查看进程列表,本质上就是遍历操作系统内核中的这个链表,并显示其中的属性;

创建一个进程:本质上就是创建一个PDB对象,加入到内核的链表中

销毁一个进程,本质上就是把这个PCB对象从内核链表中删除掉

PCB中大概有那些属性呢?

pid:一个进程的身份标识,一个机器同一时刻,不可能有两个进程的 pid 相同

内存指针:描述了这个进程使用的内存空间是哪个范围(虚拟地址空间)

文件描述符表:描述了这个进程都打开了那些文件

系统中打开一个文件,其实就得到了一个"文件描述符",这个文件描述符就像一个遥控器一样,文件数据是存放在磁盘上的,代码中操作磁盘数据不像操作内存数据那么方便,所以往往是借助这种遥控器的方式来操作

2.进程管理(重点)

我们电脑上有几百个进程在运行,但电脑只有1个CPU,而且一般都是4核或者8核的CPU,8核心相当于CPU有8个分身,那么这么多进程是怎么运行的呢?

进程这么多,CPU就那么几个分身。那么就涉及到进程调度了,电脑上的多任务系统其实就是基于进程调度这样的机制来完成的。

并发式执行

并发式执行:1个CPU运行多个进程,
由于CPU的运行速度极快,虽然CPU在一直进行切换,但是咱们坐在电脑前的用户,是感知不到这个切换的过程的。

并行式执行

并行式执行:多个CPU,运行多个进程
CPU1运行进程1,CPU2运行进程2.
进程1和进程2无论是微观还是宏观,都是同时执行的。

真实的计算机,真实的操作系统在进行进程调度的时候,是并发并行两种策略综合使用的。

3. 进程的属性

(1) 进程的状态

运行状态:进程正在运行

就绪状态:进程已经做好准备,随时准备被CPU调度执行

阻塞状态:进程在此状态不能执行,只有等阻塞该进程的事件完成后才能执行,比如编程时等待我们输入

(2) 进程的优先级

给进程安排不同的优先级,优先级越高的进程,更容易被CPU调度执行。

(3) 进程的上下文

记住进程上次运行到哪个指令了,方便下次调度的时候能够继续从这个位置来运行。

进程的上下文,主要是存储调度出CPU之前,寄存器中的信息(把寄存器信息保存到内存中)
等到这个进程下次恢复到CPU上执行的时候,就把内存保存好的数据恢复到寄存器中。(进程本身是感知不到自己啥时候被调度出CPU的)

(4) 进程的记账信息

记录进程在CPU上执行了多久了,用来辅助决定这个进程是继续执行,还是要调度出CPU了。

4. 虚拟地址空间

一个进程想要运行,就需要给它分配一些系统资源,其中内存就是一个最核心的资源。

物理地址:真实的内存的地址

假设:

0x100 - 0x700 这个内存分给 进程1
0x100 - 0x700 这个内存分给 进程2
0x100 - 0x800 这个内存分给 进程3
这里的地址都是操作系统抽象出来的虚拟地址
系统会自动的把这个虚拟地址转换成真实的物理地址


为什么要有虚拟地址空间?而不直接访问真实的物理地址?
目的就是为了一定程度的减少内存访问越界,带来的后果

比如:
进程1 的内存范围 0x100 - 0x700,如果我的代码尝试修改 0x701的地址的数据,这个操作就是越界访问(错误的操作)

如果这是一个真实的物理地址,这个修改就真的把 0x701给修改了,
恰好 0x701是进程2 要使用的内存地址,此时进程2 可能就出 bug 了,就会直接奔溃

但如果进程访问的是虚拟地址,也尝试修改0x701
此时系统就要针对 0x701 来查询页表,找到对应的物理地址
由于 0x701 已经是非法地址,在 页表中查不到了,系统就会明白,是在越界访问,于是就直接让这个进程出现崩溃(系统就会发送一个型号,这个信号通常会导致进程奔溃),防止影响到其它线程。

这样做,就让进程和进程之间相互影响的可能性变小了,隔离性增加了,进程也就更加稳定了。

虚拟地址空间:好处就是让进程之间独立性提高了,不至于相互影响,整个系统更加稳定。
缺点:两个进程需要相互配合的时候,沟通起来就困难了(进程间通信)

进程1 和 进程2 由于虚拟地址空间(进程的独立性),导致很难相互进行访问对方的内存。
如果要想相互交流沟通,就需要使用一些特殊的手段,比如:文件,管道(是内核中提供的一个队列),消息队列,信号量等


总结

进程的几个重要属性:

  1. 进程的状态
  2. 进程的优先级
  3. 进程的上下文
  4. 进程的记账信息

以上是关于计算机的工作原理(冯诺依曼体系)的主要内容,如果未能解决你的问题,请参考以下文章

计算机的工作原理(冯诺依曼体系)

计算机原理学习-- 冯诺依曼体系和CPU工作原理

(转)计算机原理学习-- 冯诺依曼体系和CPU工作原理

计算机工作原理简介

冯诺依曼体系结构

cpu是啥材料做的,工作原理是啥