计算机是如何工作的

目录

冯诺依曼体系

CPU中央处理器

CPU执行指令过程

操作系统

总结


冯诺依曼体系

计算机最早的用途是进行军事用途,计算弹道导弹的轨迹的,冯诺依曼参与研发的埃尼阿克是人类的第一台计算机。后来人们发现这个计算机太香了,后来冯大佬带队继续开发“通用计算机”,因此冯诺依曼也被称为“计算机之父”

冯大佬,最初是一个数学家,也是物理学家,也是化学家还是”博弈论”之父。在搞计算机之前已经是在科学界赫赫有名的大佬。有一次据说是在坐火车的时候,他看到对面有一个兄弟愁眉苦脸,他说他是普林斯顿大学的研究员,他们在研究用来计算导弹轨道的机器,但是研究过程中遇到一些困难。他们互相留了联系方式,后来冯大佬真去了,参与到计算机的研究中了。还有另外一位与冯大佬齐名的“计算机之父"图灵大佬,两位祖师爷。图灵大佬从理论上奠定了通用计算机的模型,而冯大佬既有理论贡献,也实际研发出了计算机。计算机后来成为了民用重要的支撑。

计算机内部构造大同小异,当前计算机的内部构造,整体的规则就是冯大佬提出的,冯诺依曼体系结构,这个结构从计算机刚出生的那一天就有了,一直到70年后的今天仍然是计算机最主流的结构

CPU中央处理器

是计算机最核心的部分,进行算数运算和逻辑判断。人类科技的巅峰之作:(1)CPU(2)氢弹 都只有差不多五常国家能造。

制作工艺非常精密,目前CPU做的好的公司:
1)英特尔
2)AMD
3)高通   晓龙(手机上的CPU)

英特尔的CPU背面是触点,针脚是在主板上。AMD的CPU背面是针脚,触点在主板上。
英特尔虽然是很多年老牌CPU厂商了,但是目前来说英特尔被AMD打的节节败退。目前英特尔的市值只有AMD一半左右。在服务器领域,AMD也在疯狂蚕食Intel的市场份额。

桌面(消费市场):
英特尔:酷睿/酷睿Ultra          AMD:锐龙
服务器(商业市场):
英特尔:志强                         AMD:霄龙

CPU的架构
CPU主流架构这几个:
1)x86/x64架构给桌面端/服务器来使用(性能释放更强,功耗更高)
Intel在上个世纪80年代推出经典CPU 8086(一代神U)
80286、80386、80486(都是CPU型号),类似于现在14900k,7950x这种名字~
这些cpu的架构,就成为x86架构了
后来,操作系统进入64位时代,AMD研发出了一套64位架构,称为AMD64。很遗憾,当时AMD是个弟弟,被Intel各种欺负,Intel就把AMD64这一套拿过来,改名叫做×64/x86_64。

2)arm架构给移动端/嵌入式使用(性能更弱,功耗低,更省电)

3)RISC-V(罗马数字5)
一套开源的CPU指令架构。
国内,对于CPU是比较落后,奋起直追,为了不被美国公司卡脖子,咱们就从RISC-V切入
来制造自己的CPU。目前咱们国内的CPU发展,虽然和国际一线有差距但是差距已经缩小很多了。目前国内最好的CPU大概相当于intel10代i3的水平(2020年的水平)。

CPU的核心参数

1)核心数

打开任务管理器->性能->CPU->将图形更改为逻辑处理器

几个方框就可以认为是有几个核心.。
最早的CPU都是单个核心(CPU里,只有一个人在干活),当时CPU往更快的速度去卷,需要让CPU集成程度更高,要包含更多的运算单元,才能算的快,单个运算单元体积就得小。CPU工艺制程4nm、7nm,经典力学就失效了,进入到量子力学的领域,工艺上的挑战越来越大。既然往下卷不好卷,横向发展,单核不行,多核来凑,逐渐发展为"双核心”处理、四核心CPU。后来还不满足,希望四个核心,每个核心都能一个人干两个人的活"超线程技术”,四核八线程。后面CPU核心数越来越多,在服务器领域,已经有128核256线程的CPU。加大CPU的面积,就会大大降低CPU的良品率,就会使CPU生产成本更高,服务器很多都是"双路服务器”,一个服务器主板上插2个CPU。

2)频率

如果基准速度为3.90GHz即一秒运算39亿次。CPU的运算速度,使用频率来描述,可以简单粗暴的理解成,1秒执行多少个指令(这么说不够严谨)。第一代计算机,运算速度是5000
(就已经远超过人的计算速度了)。CPU的频率会根据的任务量动态调整的,随着频率提升,消耗的电量更高,发热更多。计算机都有"功耗墙",CPU温度达到一定阈值(105摄氏度),会自动降频。散热工作做好,可以让频率达到更高的水准->超频。平时使用阶段,CPU频率达到6.0GHz就是极限了

3)指令  跟程序员密切相关的参数)
C/Java语去,编程语言写的程序,最终都要被翻译成"CPU上执行的二进制指令"。指令就是CPU干活,完成任务的基本单位。
机器语言(二进制)=>汇编语言(单词符号)一一对应。
不同的CPU,支持的指令是不同的。
x86上的指令和arm的指令是不能通用的-兼容性问题。之前mac的cpu也是x86架构,从m1芯片开始,转成arm架构(追求更高的续航),使得苹果很多程序,刚开始都用不了,逐渐的适配到arm架构的。

衡量一个CPU是否牛逼
主要就是看核心数是否多,频率是否高。
未来实际开发中,部署新项目,申请服务器,就需要对服务器的硬件配置,有所了解,尤其是CPU(内存硬盘差别不大)。
CPU的寄存器存储数据,主要是靠内存和硬盘。
实际上,CPU在运算的时候需要先把数据从内存读到CPU里,才能进行运算,寄存器就是CPU内部存储数据的部分。存储空间,比内存更小,速度比内存更快(好几个数量级),成本也比内存更高,断电后会丢失。寄存器空间太小,往往只是几个kb。因此CPU在计算的时候就需要反复的从内存加载数据,效率比较有影响。现代CPU引入了缓存,
L1缓存 384KB,空间最小,速度最快。L2缓存 3.0MB。L3缓存 16.0MB,空间最大速度最慢(也比内存快很多)。某个内存的数据,经常使用,寄存器又存不下,就可以放到缓存中,数据使用的频率越高,就往L1上放没那么高放L3,中间的就放L2。对于Java程序员来说,开发程序,往往不会对缓存区分这么细,通常就会把寄存器和缓存视为是一个整体了。

CPU执行指令过程

一个CPU能执行哪些指令,可以认为是CPU最初设计的时候就已经写死了(确定好了)。
存在一个"表格”描述了都有哪些指令。


上图为简化版本,真实的cpu指令表,复杂很多。此处假设每个指令只有8bit,实际上一个指令更长的。8bit的指令,分成两个部分,前4bit是操作码(opcode)表示指令是干啥的,后4bit是操作数(类似于参数)。
RAM内存,全称随机访问存储器。CPU寄存器数量很少,(A、B名字都是虚构的,真实的CPU寄存器的名字,形如eax,ebx,esp,ebp,r0,r1)。每个寄存器都有专门的名字。

C语言中介绍过,内存可以想象成一个"宿舍楼",上面有很多房间,每个房间都门牌号,通过门牌号就能找到房间,进一步找到房间里的人。真实计算机,内存比较大(16GB=>160亿个房间)。所以门牌号大,数字经常使用十六进制来表示。

C语言写好的程序,先编译成可执行文件(exe)(包含了这个程序运行要执行的指令和依赖的数据),进行运行的时候(双击exe),操作系统就会把exe加载到内存中。

上图给定一段内存空间,以及里面的数据。现在展示的是模拟已经加载到内存的,加载过程完全由操作系统来完成。

CPU中存在了一个特殊的寄存器,"程序计数器”,保存了接下来要从哪个内存位置来执行指令。在exe加载到内存后,就能被系统自动设置好。此处就可以认为,程序计数器就被设为0了,接下来从0号内存地址开始执行指令,同时随着指令的执行,这里的值也会随着更新,默认情况下,就是+1自增过程(顺序执行)。如果遇到"跳转类语句"(if,while,for,函数调用)会被设为其他的值。

执行指令的三个重要阶段:
1)取指令,CPU从内存中读取到指令内容到CPU内部。(有专门的寄存器保存读取到的指令,不是上面说的A、B寄存器。
2)解析指令,识别出这个指令是干啥的,以及对应的功能和操作数。
3)执行指令

 

 

(1)初始情况下,程序计数器是0值
a)读取指令
00101110
b)解析指令
0010      1110
操作码   操作数
去指令表中查看,看这个操作码是啥意思。
这个指令是LOAD_A指令,并且后面的1110(14)表示了一个内存地址,这个指令的工作,就是把1110这个地址的数据,读取到寄存器A中。
c)执行指令
把14地址的内存数据读出来,放到寄存器A中。第一条指令执行完毕,系统会自动把程序计数器中的值++,从0->1。
(2)执行地址为1的指令了
a)读取指令
00011111
b)解析指令
0001      1111
操作码   操作数
这个指令是LOAD_B,就要把1111(15)地址上的数据,读取到寄存器B中。
c)执行指令
找到15这个地址上的数据,读取到B寄存器中。此时系统还是会把程序计数器再++从1->2。
(3)执行地址为2这里的指令了
a)取指令

10000100

b)解析指令
1000      0100

操作码   操作数

ADD(计算两个指定寄存器的数据的和,并将结果放入第二个寄存器)
1000100
c)执行指令
A:
17(00010001)
B:
00001110(14)
系统自动调整程序计数器,再++从2->3。

(4)执行3号内存上的指令了
a)读取指令
01001101
b)解析指令
0100       1101

操作码    操作数(内存地址)

STORE_A(将数据从A寄存器写入RAM的指定地址)
c)执行指令
0001 0001
1101=>13

程序计数器自动++,从3->4。

上述完成了3+14的过程。为了进行相加运算,对于CPU来说,不是一件那么容易的事情。由于CPU算的实在太快了,CPU一秒就能执行几十亿次上述这样的运算。上述过程不需要大家去背之类的,有一个印象,大概知道指令是啥样的,大概知道执行的过程是啥样的,就可以了。对于Java程序员来说,这样就够了。对于有些特殊行业的程序员,就需要有更深入的探讨和认识了。

操作系统

1)Windows
2)Linux
3)Mac OS(富哥专属)-苹果电脑内置系统
苹果电脑,最大的优势(1)超强续航(2)装×
其他角度,性能释放,还是对应的生态,都是逊色于windows不少的。
4)Android
最主流的系统
Android基于Linux演化出来的(内核基于Linux开发的,但是经过多年迭代,已经差异很大了)冰箱能够刷抖音(冰箱内置安卓系统)
5)IOS(苹果手机/平板)

和Mac OS是两套系统

其他的就是一些小众系统了,比如一些特定领域的系统。比如风河公司(windriver)搞的一个vxworks。工业设备,航空航天。路由器的一些系统openwrt。
每个系统,运行的程序都是不同的(不能兼容的),你如果在windows写了一个程序,这个程序是不能直接拿到Liux等其他系统上运行的,因此我们才希望,一套程序,就能兼容不同的系统。Java所谓的"跨平台"也就是这么来的,windows有windows的jvm,linux有linux的jvm。虽然不是同样的程序,但是都兼容同样的字节码。因此Java程序员不必考虑系统的差异。
实际上,Java的应用场景主要还是安卓&服务器后端,很少会真的需要写一个程序,跨不同平台执行。后面很多主流语言,Python,Go,PHP,也是同理。

一个操作系统,要做很多的事情,做的最重要的事情,"管理”。
1)管理不同的硬件设备

计算机能接入很多的设备:扫码枪,医疗设备,B超超声机…
2)给软件提供稳定的运行环境
现代的操作系统上,都是要同时运行很多程序的。希望这些程序之间,不能相互干扰
某个程序出bug了,不会影响到别的程序。

操作系统内核:操作系统,核心功能集合。
操作系统=内核+配套的应用程序

操作系统给应用程序提供API,让应用程序调用,完成不同的功能。

println("hello world")是Java标准库提供的函数,
JVM中,为了实现println,就会调用操作系统提供的APl执行(Linux,对应的系统API叫做write)
调用系统API,程序就会进入到系统内核执行,此时系统就会操作对应的硬件设备,来完成打印操作。
操作系统管理的硬件设备很多的,不是系统直接操作硬件,而是硬件厂商会提供对应的"驱动程序”。操作系统其实是通过驱动程序,间接的操作硬件设备的。
学校,
校长,管理者(操作系统)
导员(驱动程序)
同学们,被管理者(硬件设备)

对于操作系统内核来说,里面要包含的功能是非常多的。
其中有一个功能和日常开发,息息相关,一定要重点掌握,
进程管理-进程process/任务task
进程就是正在执行的应用程序,谈到一个应用程序,有两种状态
1)没有运行时候是一个exe文件,躺在硬盘上的。
2)运行的时候,exe就会被加载到内存中,并且CPU执行里面的指令了-进程。
一台计算机,即使你不开啥程序自己也会有很多的进程出来。这些进程,操作系统都要执行的,执行进程里的指令,需要硬件资源的。进程是操作系统进行资源分配的基本单位。

由于一个系统上进程比较多,才需要管理(只有1个两个,谈不上管理的)
1)描述通过结构体/类,把进程的各种属性表示出来
主流系统C/C++实现的,广泛用到结构体struct
对于Linux操作系统来说,使用称为"PCB”(进程控制块)这样的结构体来描述进程信息的
2)组织
通过数据结构,把多个上面的结构体串起来,并进一步的进行各种增删改查
简单认为,通过链表的方式,把上述多个PCB串到一起((简化版本的说法,实际的情况
更复杂,不只是一个链表)


创建新的进程(双击ex,运行起程序),就相当于创建了一个PCB结构体,并且插入到链表中。销毁进程,就是把PCB从链表上删除掉,并且释放这个PCB结构体,查看进程列表,就是在遍历这个链表,依次显示出对应的信息。

PCB有啥信息,PCB其实是一个非常复杂的结构体,里面包含的属性非常多的。此处只讨论一些关键的信息。

1.PID进程的标识符
同一时刻,一个机器上的多个进程之间,PID唯一的,不会重复
系统内部的很多操作,都是通过PID找到对应的进程的
2.内存指针(一组)
描述进程依赖的指令和数据都在内存的哪个区域
操作系统,运行exe,就会读取exe中的指令和数据,加载到内存中(内存地址),侧面表现出进程的执行,需要一定的内存资源。

3.文件描述符表(顺序表/数组)
描述了进程打开了哪些文件,对应到硬盘上的数据
进程中,打开了某个文件,就会在顺序表中添加一项

4.进程状态
5.进程优先级
6.进程的上下文
7.进程的记账信息

上述四点与进程的调度有关,和日常开发,息息相关
计算机上同时存在,百八十个进程,这么多进程都是要执行的
CPU负责执行,CPU每个核心,可以执行一个进程执行进程里的指令
有的机器,CPU是6核12线程(6个物理核心,12个逻辑核心)
只能同时执行12个进程呀,其他进程咋办呢?
操作系统,进程调度的关键,四个字,"分时复用"
当前的操作系统,都是"多任务系统”同时可以运行多个进程的
以前的操作系统,称为"单任务系统",同一时刻只能运行一个进程的

当年的CPU虽然是单核CPU,仍然可以同时执行多个进程
分时复用
这个时刻,CPU运行进程1,运行一会,CPU运行进程2,过一会运行进程3
由于CPU运算速度非常快,使上述的切换速度,也非常快,肉眼察觉不到
并行执行
并发/并行,都是操作系统内核统一调度的,程序员/普通用户,感知不到
因此,平时也把并行和并发,统称为"并发”,对应的编程的手法,也就称为"并发编程"

上面四个属性都是用来支持并发执行调度过程的

接下来会举三个男人同时拥有一个坏女朋友的例子来分别理解这四个属性

假设:A号男友有钱是个富哥 B号男友长得帅 C号男友没钱不帅但非常暖能把人哄开心是个舔狗


进程状态
比如,正常情况下,ABC都是,"随叫随到”
此时,ABC所处的状态,称为"就绪状态"
就绪状态的进程,是可以随时被调度到CPU上执行指令的
比如,有一天A出差一个月,A此时无法"随叫随到”
A处于的状态,称为"阻塞状态"
阻塞状态的进程,无法调度到CPU上执行。之所以阻塞,是因为要做一些其他的工作,比如进行IO操作(读写硬盘/读写网卡)
除了上面的之外,进程还有其他的状态,此处暂时不展开这么多。
已经学过的代码中,大部分代码不会产生阻塞的,有一个典型的代码,会引起进程阻塞
从控制台,读取输入(等待IO产生的阻塞)
scanf
Scanner
代码执行到这样的语句时
代码就"卡住”
啥时候继续执行,看你啥时候输入数据

进程优先级
谁先来,谁后来,谁多,谁少


比如排时间表:
周一周二周三:和A
周四周五:和B
A的优先级更高(A能提供更多的价值)
周六和C
C的优先级比较少
因为如果心情本身就好,不需要他舔
如果和A/B吵少架了,闹矛盾了,C给舔一舔,确实挺舒服的

进程的上下文

分时复用,一个进程执行一会之后,就要从CPU上调度走
过一段时间,还会调度回CPU,就要沿着上次执行的结果,继续往后执行
把之前执行的中间结果(各种CPU寄存器中的值)保存起来,以备下次使用


有一天和A约的时候,A给说,下个月出去去三亚玩,你提前准备准备
我肯定说好的,此时我约会结束之后,就需要把今天约会的核心结论,记录到本子上,"下个月去三亚,要提前做准备”
第二天和B约的时候B给我说,下个月,他的妈妈过生日,想让我帮忙买个礼物,也让我提前准备准备,此时我约会结束之后,就需要把今天约会的核心结论,记录到本子上,下个月,给B的妈妈买礼物”
如果不去记录这个东西,就可能会出现问题
比如,又过了几天了,
A问我,你准备的咋样啦~~我说,我精心挑选了一个老花镜,A:???
B问我,你准备的咋样啦~~我说,我精心挑选了一件性感的泳衣,B:???

PCB是内存的数据,把寄存器中的值都,保存到PCB特定属性中,下次调度PCB就可以从这里的
属性中把数据恢复到对应的寄存器中了。
对于进程来说就是寄存器中的值,CPU有很多寄存器,这些寄存器共同就描述了
上下文也可以理解成,打游戏,存档,读档

进程的记账信息
优先级的加持之下使不同的进程,吃到的资源,差异越来越大了
刚才我给C排的时间比较少
随着时间的推移,C感觉到我对他逐渐冷淡,
他在一次次失望过程中,逐渐心灰意冷,不想继续舔我了
为了不失去C,就需要适当的给C多来点甜头,某段时间,专门给C多安排点时间
并且准备点小礼物,小惊喜啥的(送他个不用的发圈,戴到他的手上,就能视为珍宝,好好珍藏起来)
把他挽回之后,再继续给他排少一些的时间(毕竟,AB给我提供的价值更大)
既可以保持和C的关系,也不会浪费我太多的精力

总结

这里大部分,大家大概了解就可以但是有几个重点的内容需要掌握
1)冯诺依曼体系结构
2)CPU的核心概念,CPU的两个重要指标,核心和频率
3)CPU执行指令的流程(指令表,一条一条指令,取指令,解析指令,执行指令)
4)操作系统核心概念(管理硬件,给软件提供稳定的运行环境)
5)进程的概念(运行起来的程序,和可执行文件的区别)
6)进程的管理(PCB,链表)
7)进程的调度(状态,优先级,上下文,记账信息)=>并行,并发
这些内容"常识"任何一个程序员都要理解掌握

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值