[面试集锦]计算机基础之cpu,内存
今天我们来趴计算机的裤子。自从家人知道了我们是学计算机的,难免就有了装系统和修电脑的的称呼,同意?不同意,我们不仅需要知道计算机相关部件的组成还要学习其机制,甚者如何让上层应用跑的又稳又快。
1 三座大山
CPU(Central Processing Unit)中央处理器,我们计算机所有"计算"就靠它。一般也叫做超大规模集成电路,其实就是一堆晶体管不断做"打开","关闭"操作,想要计算机快,要么增加晶体管也就是增加密度,要么让晶体管"打开","关闭"速度更快,也就是提升主频,当然就会有耗电和散热等问题
现在我们普通电脑应该都是8G内存了,让我想起了曾经比尔盖茨说"无论对谁来说,640k的内存都足够了",为什么是640k,因为当时DOS操作系统,PC机只支持1M的寻址,DOS只能管理最多1M字节连续内存空间,而在这1M中只有640k给予应用程序使用(基本内存),另外384k留给BIOS和视频显示等使用,可惜时代发展简直快!那内存到底是干啥的,当我们打开XX***,登录qq都需要加载到内存中,计算的中间结果也需要放到内存中,这些骚操作都不开它
好了,CPU会去读取内存中的数据然后还要计算,那cpu和内存两座山放在哪儿,放在主板上。
从上面图我们知道cpu和内存都放在了密密麻麻的主板上,刚才我们说要通信,应该有传输的线,对的,芯片组合+总线解决了两者的通信问题。
但是我们平时会使用键盘输入26个字母,这所谓输入设备,我们需要查看输入设备给我们的反馈也就有输出设备(显示器)
我们需要存放各种***,直接放内存?一部电影2G,我去,那可不行,这时候需要一块大u盘----硬盘
cpu的确具有不错的计算能力,那为啥在做深度学习应用的时候,动不动就是GPU,在深度学习的神经网络中,它常常需要将一个特定的计算分解为能够同时进行的独立小任务,从而实现并行计算
这么多设备运行,难免需要摩擦,摩擦不能产生太大的火花,需要散热器给它降温----散热器
2 冯·诺依曼----存储程序计算机
First Draft中总结出了一下四点
(1) 运算器
成各种算数和逻辑运算。
(2) 控制器
控制程序流程的控制器单元,其中包含了指令寄存器和程序计数器
(3) 存储器
是用来存储数据的内存和外部存储(硬盘)
(4) 输入输出设备
比如我们常用的键盘作为输入,显示器作为输出。
综上,可以总结为,计算机通过从我们的输入设备获取输入信息,通过运算器和控制器去执行存储在内中的程序,最后将结果呈现(输出设备)。如下图所示
3 提升性能三指标
不管是面试中还是在实际开发中,难免会说到这个问题。
通常会提到两个指标,一个是响应时间一个是吞吐率。
响应时间
让程序在尽量短的时间完成任务,想办法让程序跑的更快。
吞吐率
一定时间内让程序做更多的任务。规定时间内完成的任务更多。那是不是就可以采用多核机制,毕竟人多力量大,规定时间一起干事,处理更多数据,这样子吞吐率也上去了
这样的话,如果我们想办法将响应时间缩短,就会多出一部分时间做其他任务,这样看来缩短响应时间的同时会提升吞吐率。那么如何计算程序的运行时间呢?就得先了解计算机的计时单位。
计算机的计时单位:cpu时钟
有时候在统计一个程序的执行时间的时候,通常在程序开始记录下时间,结尾记录时间,然后相减。实际上是不行的,因为大部分情况下cpu会执行多个任务,也就是有一部分时间是在执行其他任务,那么有没有方式去掉这部分做其他任务的时间,从而获取真实的时间呢。在Linux中提供命令time,我们看看time命令都输出什么。
从上图我们知道,real_time(在程序运行过程中一共花费的时间)。User_time(cpu运行这个程序中用户态执行指令的时间)。sys_time(cpu运行此程序,在操作系统内核运行指令的时间),那么实际上程序花费的cpu执行之间为user_time+sys_time>real_time,如果是单核情况,通常两者之和会小于real_time,目前机器采用多核去执行这个命令除了这种情况。
仅仅通过cpu时间也不能直接比较性能,因为内存,主板相关硬件也会对其造成影响,所以将其拆为CPU的时钟期数*时钟周期时间
上图中3GHZ为电脑的主频,即一秒时间执行简单指令数量为3G条。那么时钟周期为1/3GHZ,如果主频越高,那么cpu被逼着走的越快,cpu跑的越快,对散热要求也就越高,不能超载。
从上面这个公式可以得出,提升性能可以可以考虑买更好的CPU(主频),但是贵啊,那就考虑改变CPU的时钟周期。此时的cpu时钟周期=指令数*每条指令的平均时钟周期数。好了,现在我们综合两者公式得到
程序cpu执行执行时间=指令数每条指令的平均时钟周期数时钟周期时间
这样我们通过优化三者中的某几项来提高性能。
时钟周期时间,也就是计算机主频,最初的80386主频只有33MHz,现在普通笔记本都是3GHz
执行的时候使用什么执行,这是编译器的强项,对于相同的程序,不同编译器编译出的指令不同
每条指令的平均时钟周期数,采用流水线技术让一条指令的平均时钟周期数尽可能少。
常见提升性能的方式-----通过并行提高性能,那么有哪些条件需要满足呢
可以将大问题拆解为小问题并行执行,且结果一直
确保拆分的问题能够合并
合并阶段无法并行,仍然顺序执行
目前来说,从计算机层面提升性能的方法
Cpu->Gpu。在深度学习领域,为了提升模型训练速度,因为大部分计算都为矩阵计算,使用cpu可能需要几个小时,使用Gpu几分钟就完事。当然还有TPU
预测先知。能够预测下一步执行什么任务,而不是知道上一步结果后再执行下一步。不如非常著名的"局部性原理",均是提前做准备,蓄势待发
流水线方式提升性能。大任务拆分为小任务,最大化利用Cpu资源
4 总结
今天学习了cpu中的两个重大指标,响应时间和吞吐率。优化cpu的执行时间是提升性能的核心。那么cpu的执行时间=指令数每条指令的平均时钟周期数时钟周期时间。然后通过优化其中某项来提升性能。好了,今天就学习到这,goodbye,有点收获记得在文末点击在看呀。
推荐开源项目---面试集锦