目录
一、计算机的发明
众所周知,计算机就是我们现在用的那些电脑什么的,但是你知道第一台计算机是干嘛的吗?
++计算机是冯诺依曼 发明的,这个大佬是我们计算机行业的祖师爷 ,在1946年2月14日 ,对,就是情人节。这台计算机的名字叫埃尼阿克。++ ++它最早是用来计算弹道导弹的轨迹。++后来大家觉得这个东西非常香,如果只用于军事,那就太可惜了。所以后来就出来了民用计算机,也就是我们现在用的。
计算机内部的结构大同小异,其实也是冯诺依曼提出的冯诺依曼体系结构
- CPU(非常精彩,重点谈论)
- 存储器
- 输入设备(键盘,鼠标,麦克风等等)
- 输出设备(显示器,扬声器等等)
存储器无非就外存和内存。外存:硬盘,软盘,U盘,光盘等等
++硬盘和内存的区别:++
硬盘:存储空间大,访问速度慢,成本低,掉电后数据仍在
内存:存储空间小,访问速度快,成本高,掉电后数据丢失
接下来就是大名鼎鼎的CPU了
二、CPU是什么
下面如图就是CPU
CPU又名中央处理系统,它是一台计算机最核心的东西,用于算术运算和逻辑判断
++制作CPU比较精密的公司有:++
1)Intel(英特尔)
2)amd
3)高通(手机cpu,晓龙)
.....
虽然说intel是老牌了,但是现在却被amd打的节节败退,现在的amd比intel的市值高了一倍,而且现在的amd的CPU便宜&大碗。
++桌面(消费市场)++英特尔:酷睿/酷睿ultra
amd:锐龙
++服务器(商业市场)++
英特尔:志强
amd:霄龙
CPU的主流架构
1)x86,x64 给桌面端或者服务器用
Intel的上个世纪80年代,研发了一代神U叫8086(CPU型号),为了纪念,就叫x86了。
后来计算机进入的64位时代,amd研发出了amd64架构,但是奈何amd当时太弱了,就被Intel抢过去了改名x64,当自己研发的了~~
2)arm架构
给移动端/嵌入式使用,性能更弱,功耗低,更省电。
3)RISC-V(V是罗马数字5)
这是一套开源的CPU架构指令,由于我们国内CPU发展比较落后,所以我们用这套开源来进行研究,现在与国际一线差距就那么几年~~
三、CPU的核心参数
CPU的核心参数主要有2个:核心和频率
1)核心
我们打开任务管理系统的性能(进程的下面一个),如下图,如果你打开的不是这个,就右键-》该图形改为-》逻辑处理器
右上角的是型号,是intel12代的i5-124500。
中间的小框框,你可以认为有多少个小框框就是多少个核心。一般来说一个核心2个线程,上图我有8个核心,12个线程是比较特殊的情况。一般都是什么什么6核心12线程,8核心16线程....(内核就是核心,逻辑处理器就是一个核心能处理的线程(类似一个人干2个人的活))
++最初的核心是单核 (CPU里面只有一个人在干活),所以CPU当时就往速度去卷,怎么让速度快呢?++
就是让CPU的集成程度高(包含更多的运算单元,才能算的快,所以每个运算单元就要很小),但是后来CPU运算单元已经很小了,已经达到4nm,7nm什么什么的,太小就要量子力学来解决了,这条路也就走不通了。
++既然这条路走不通,我就换条路:++后来08年的时候,intel就发布了"双核心"(本来一个人干活,现在2个人干活),再后来是四核心;
还不满足就有了"**超线程"**的概念,4核心8线程(一个人干2个人的活),到现在核心越来越多,在服务器上都有128核心256线程了。
2)频率
CPU的运算速度,我们用"频率"来描述 。
我们可以简单理解为:一秒执行多少个指令。
++指令是啥?++
答:像C/Java写好的代码,它不会直接给CPU计算,而是先通过计算机把它分解成最小的单位(转化成exe程序,也就是二进制语言),这个最小单位就是指令。
上图有个基准速度和速度,有啥区别?
比如我上面的图中,基准速度是2.00GHz意思是最低速度(下限),相当于1秒执行20亿次指令(第一台计算机一秒执行5000次),那速度就是你现在当前的速度,它会根据你当前的任务量来调整。随着频率的提升,功率也就上来了,就会发热,为了保护CPU,当温度到达一定值(比如intel是105摄氏度),就会主动降温,也就是"降频"。(所以散热功能做好,就能达到更高的频率,我们也叫"超频")。
++所以衡量一个计算机牛不牛?++
答:看核心和频率
四、CPU的寄存器
CPU里面有个东西,叫寄存器。
寄存器的存储空间比内存小,速度比内存还快,成本也比内存高。
虽然说我们存储数据时,已经有内存和硬盘了,但是我们在执行计算机程序的时候,是需要把内存的数据读取到CPU的寄存器上面,供CPU去运算的。
但是寄存器的内存太小了,只有几kb,如果要读取内存的数据,要反复的读取,那就比较麻烦且耗时间。 那么就可以把经常用到的,且放不下在寄存器,那可以放到缓存中。
如上图,L1缓存,速度最快,内存最小;而L3缓存刚好相反,L2在中间。
++缓存大,对于某些场景来说性能提升很高:++
比如intel旗舰CPU14900k它L3缓存32MB;但是amd有一个次旗舰7800x3d有一个超大L3缓存96MB,他们两的性能是差不多的。而intel那个CPU要4500左右,而后者2500块钱就能买到了。
++但是对于 Java程序员来讲,缓存和寄存器其实算一个整体,不会特别区别。++
五、CPU的执行(简化版)
CPU要干嘛,实际上CPU在最初设计的时候就已经写好了。存在着一个表格。这个是简化版的指令码,现实中要复杂得多。
当我们C语言写完的时候,就被编译为exe程序,当我们一点击的时候,它就会在内存在被读取到CPU上面执行。
++RAM是内存(随机访问存储器) ,++
++寄存器A和B都是虚构的,寄存器不多,每个寄存器都有它特有的名字,比如eax,ebx,esp等等。。。++
++ADD中2位寄存器ID,00为寄存器A,01为寄存器B++
此处假设每个指令只有8个bit位,每个指令可以分为两个部分,前四个位为opcode(操作码)表示这个指令是干嘛的,后四个为内存地址。
假设上面是 代码执行的指令。
++执行指令有三个步骤:++
- 取数据
- 解析数据
- 执行数据
CPU会有一个特殊的寄存器,叫"程序计数器"。保持了接下来要从哪个地址拉读取内存,从上图中,默认是0。每执行一条就++,下一个就是1,再++,是2.....
++第一次++1)取数据:
从0开始,指令是00101110,
2)解析数据:
再看指令图,0010是LOAD_A是把内存地址为1110(也就是14,第14条是00000011)放入寄存器A之中
3)执行程序:
把00000011放入寄存器A中,然后计数器++。变成1
++第二次++1)取数据:
从1开始,指令是00011111
2)解析数据:
再看指令图,0001是LOAD_B是把内存地址为1111(也就是15,第15条是00001110)放入寄存器B之中
3)执行程序:
把00001110放入寄存器B中,然后计数器++。变成2
++第三次++1)取数据:
从2开始,指令是10000100
2)解析数据:
再看指令图,1000是ADD,第一个操作数ID是01为B,第二个是00为A,(寄存器B中数据为00001110为14,寄存器A数据为00000011为3),两个相加为17(转为二进制为00010001)放入寄存器A中。
3)执行程序:
把00010001放入寄存器A中,然后计数器++。变成3
++第四次++1)取数据:
从3开始,指令是01001101
2)解析数据:
再看指令图,0100是把寄存器A中的数据写入内存为1101(13)中
3)执行程序:
把寄存器A中的数据写入内存为1101(13)中,然后计数器++。变成4
++第五次++1)取数据:
从4开始,指令是00000000
2)解析数据:
全0则为结束
3)执行程序:
结束
六、CPU分配------进程调度
操作系统=内核+配套的应用程序
一个操作系统要做很多事情,最重要的事情就是"管理"。而内核就是下面:
- 管理不同的硬件设备(计算机能接入更多的硬件设备,比如:B超超声波,扫描枪等等....)
- 给软件提供稳定的运行环境(现代的计算机中,都是要运行很多程序的,操作系统就要让他们互不干扰,不会因为哪个程序出bug,就影响到其他程序)
**电脑上的硬件设备是很多的,操作系统不会直接操作这些硬件设备,而是采用"驱动程序"来进行操作。**类似于:一个学校的校长(操作系统)不会直接下达命令,而是通过导员(驱动系统)去下达传给学生(硬件设备)不然传达不过来。
进程管理
++什么是进程?++
答:就是正常执行的程序。一个程序有两种状态,一是没有被执行,在硬盘里躺着;二是按了exe执行,这时会进入内存,被CPU读取。
上述的进程,操作系统都是要进行的~~都需要硬件资源。
进程是操作系统进行资源分配的基本单位。
进程的属性
1)描述
通过结构体/类把进程的属性描述出来**(在linux中,使用称为"PCB"(进程控制块)来描述这些属性)**
2)组织
通过数据结构把这些线程都给连接起来(串起来),常见的就是链表
++创建进程:++
就是点击exe程序,这时候会使用PCB把这个程序的属性都表示出来,然后用链表把他们都给串起来。
++销毁进程:++
把这个exe程序从链表里面删掉,就是释放这个PCB里面的属性。
++查看进程:++
遍历链表,依次打印进程。
PCB有啥?
1)PID进程标识
相当于进程的ID,每个进程都有一个PID,不会重复。如果没有显示出来,打开左边的小箭头,其实是一个程序里面分为多个板块,不止有一个PID。
2)内存指针(一组)
描述这个exe程序的进程被加载到内存的哪一部分地方(地址)。
这也侧面展示出了,执行进程需要内存
3)文件描述符表 (数组/顺序表)
描述进程打开了哪些文件(对于硬盘的数据)
这也侧面展示出了,执行进程需要硬盘
进程调度
++啥是进程调度啊?++
答:一台电脑中,我们CPU只有几个核心,能执行的进程也就那么多而已。那我们怎么同时运行那么多个程序呢?当然是"进程调度",也就是分时复用,(并发执行)由于CPU的执行速度很快,有几十亿次,所以即使他们分时进行,我们也看不出来,感受不到。
++举个很形象的例子(纯属虚构,开玩笑的,为了大家能理解知识点):++假设我是个妹子(好看&&有才华),那么就有很多男的追我
1)A:有钱
2)B:帅
3)C:会舔我
如果我要一个三个优点都有的,那我可以一下子谈三个,爱一个人是藏不住的,爱两个人一定要藏好。那么我就要进行"时间管理":
周一周二周三:和A出去约会
周四周五:和B出去约会
周六周日:和C出去约会
++上述可以理解为"调度"。++
进行调度,会有下面几个特点:
4)进程状态
++比如上面的例子:++
ABC都是随叫随到,随时待命,那么这种状态我们叫做**"就绪状态"**;
若A要出差,就不能约他了,不能随叫随到,我们叫做**"堵塞状态"**。
"就绪状态"下的进程可以随时被调到CPU上去执行,而"堵塞状态"不行,他可能会因为读取IO而无法进行调度(调了也无法执行啊)
5)进程优先级
优先级也就是谁先来,谁后来,谁多,谁少....
++比如上面的例子:++
A有钱能给我的价值更多,所以我优先陪A约会,分更多的时间陪(优先级最高);而B帅看着赏心悦目,非常开心,所以中间;但是我不会经常不开心(不缺人陪),所以C哄不哄我都无所谓,所以他优先级最低。
进程也是一样,重要的优先执行,谁来的快优先执行。
6)进程上下文
++还是上面的例子:++
A跟我说,下个月约会我们去三亚玩,你准备准备;
B跟我说,下个月他妈妈生日,你准备准备看他妈妈;
下次和A出去约会,问你准备怎么样了,你说我准备了一个精美的老花镜....
下次和B出去约会,问你准备的怎么样了,你说我准备了一件性感的泳衣....
这时候就非常不适合了,会闹出乌龙。所以我们需要有个像"日记本"那样的东西来记录。
在进程中,分时复用,一个进程在CPU执行一段时间后会被调走,当他再次被调回来的时候,CPU需要知道它上次执行到哪里了,可以进行接下来的指令。
++如何保存上次的值?++答:PCB是内存的数据,把寄存器中的值都保存到PCB特定属性中,下次调度PCB就可以从这里的属性中把数据恢复到都对应的寄存器中了
7) 进程记账信息
++还是上面的例子:++
假设C感觉到自己被冷漠了,就不开心了,也不怎么哄我了,这时候我们需要给C一点甜头,让它继续舔我(比如给它我不要的发圈,或者主动约他,主动找他聊两句话等等....),等他舔我了之后,然后继续冷落他。
所以在进程中,优先级的加持下,我们也需要对在CPU执行的时间少的,增加它的时间,继续优先级。