计算机的工作原理(冯诺依曼体系)
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 由于虚拟地址空间(进程的独立性),导致很难相互进行访问对方的内存。
如果要想相互交流沟通,就需要使用一些特殊的手段,比如:文件,管道(是内核中提供的一个队列),消息队列,信号量等
总结
进程的几个重要属性:
- 进程的状态
- 进程的优先级
- 进程的上下文
- 进程的记账信息
以上是关于计算机的工作原理(冯诺依曼体系)的主要内容,如果未能解决你的问题,请参考以下文章