共计 4299 个字符,预计需要花费 11 分钟才能阅读完成。
本文为《跟马哥学 Linux》系列文章的第五篇,上一篇文章为《Linux 发展历史 -01》。
假设说一个程序需要运行首先这个程序文件必须从磁盘给他装载到内存上,这是第一步,而程序是又指令假数据组成,这就意味着指令和数据都在内存中,比如指令做加法运算加谁,加第一个内存单元的数字和第三个内存单元中的数字,加完以后放哪去等等,背后会涉及到一系列复杂的问题,因此不管怎么讲要知道指令和数据全都在内存中存放,假如说前三个格子方的是指令,后三个格子方的是数据。cpu 首先要加载第一个指令在这个指令当中会告诉 cpu 运算的数据在什么位置。
所以这个时候 cpu 会找到对应的内存单元当中把数据取出来,假如说算的是第四个和第八个数字做加法运算,于是第一个我们先取出指令,第二个取出指令所关联到的数据,于是把数据取出直接做加法运算,因此在此说明指令和数据都在内存中,都得先从内存中取出来才可以,
而内存就是指编制的存储单元。雨点晦涩对吗,我不知道朋友们能不能听的懂大体上这么理解就可以,真是听不懂就当故事听了,回过头来再看,但对我们而言这确实是基础知识。继续往后描述当数据取出来 cpu 开始把这些数据运算,运算完会有一个结果事实上在此之前还有一个步骤指令运行完以后还有第个指令还有第三个指令,没准还要进一步加工所以能够让 cpu 知道运行完第一条指令后紧接着运行第二条指令在什么地方,cpu 内部就有了寄存器,寄存器叫做 register,他主要保存的是就像最长的就是指令之指针寄存器。我们称之为 PC,这个 PC 指的是什么呢比如当我们加在完指令后。每一个程序指令运行大体上是有算法 + 数据结构组成也就意味着一个程序的多条指令是有关系的,
这种语言对于一个过程式编程语言来讲,他内部的逻辑无非只有三种,今天我们先来了解一下。第一种是顺序执行,挨着执行,先执行第一条,再执行第二条,第三条,这叫顺序执行,第二种称为循环执行,也就意味着,我们将代码像拉货似的进行来回运算 N 编,叫做循环执行,第三种叫做选择执行选择执行就是我们的代码可能有 10 条但是分成两类,比如说再你面前有两次机会左轮手枪中 3 个槽有子弹,3 个槽没子弹,现在给你一个机会让你选择一个抓阄,轮盘赌。类似于这种形式的所以选择执行大体上就是有一种位真是我们就执行为真的代码否则就执行另外一种代码,分成两种情况,当然有时也会分为 N 中情况这种球成为选择执行只执行代码中的一部分。
接着,cpu 执行完第一条指令后为了不耽误时间需要知道第二条指令在什么地方因此寄存器就保存了下一条指令保存在哪个位置,哪一个存储单元中放着,所以叫指令指针寄存器。我们在做加法运算时首先要取出被加数接着再取加数,两者只能是依次进行,而不能同时进行,所以第一个数取完以后要先暂存下来再去取第二个然后才能做运算而暂存下来的数一样也用到了数值寄存器等等,内存跟 cpu 比起来非常慢迄今为止内存的工作频率在 1888,160……比起 cpu 主频来讲像 3G 赫兹要慢的多的多,也就是说 cpu 说一句话,的空转两圈内存才可能接收到指令所以 cpu 比内存要快的多。
为了两者之间不会耽误太长时间,在 cpu 内部就引入了各种各样的缓存,其实 cpu 的缓存越大就以为这他内部的提取的数的命中率越高,命中率越高就意味着性能越好,同样的主屏下 cpu 的缓存越大就越贵,因为 cpu 缓存的工作机制与内存的工作机制不一样造价比内存要高,另一方面,cpu 的面积时有限的尽可能的越做越小所以 cpu 中的缓存非常小,而且,比如我们 cpu 的缓存从 512 增长到 1 兆价格就要翻一倍所以千万不要小瞧缓存,对于互联网时代,缓存为王。这是加速当中非常重要的解决方式,在计算机中有一个特性,这种思维逻辑就是,任何两个层次之间在速度上或在逻辑上,只要是不暇接就加中间层比如 cpu 快内存慢怎么办?加中间层就是缓存层,还有语言是一样的道理,人说的机器听不懂,怎么办?加中间层,用编译器来实现通常都是这么着来解决问题的所以任何包括人类社会领域也是一样的任何两个层次之间不能快速流畅衔接的话我们只需要加一个中间层来解决问题。加一个中间层会在一定程度上影响性能,但是提升的效果要比提升的效果号很多,比如果和老外交流,对方说英语。我们说汉语,为了交流我们得学会英语这个可能得需要一两年的功夫但是找一个翻译只需要几分钟就可以搞定。这个就时我们计算机内部的简单工作法则。而硬件本身时没有任何指令和任何程序所以说程序员写的软件非常关键,计算机自己被制造出来后他内部并没有带程序所以程序员需要写好程序把指令和数据输入给计算机让计算机能够运行,并且讲运行后的结果反馈给我们所以就需要输入输出设备,这种输入和输出通常被称为 I / O 设备,
比如像磁盘他即能输入又能输出,在计算机的角度来想,即能够从磁盘中读出来数据,我们把数据加工以后还可以存到磁盘中去,所以他既是输入又是输出,键盘可以输入还能输出吗,他不能接受给我们做回馈,不过现在有一些增强现实的一些设备时可以的,比如现在用的手柄,玩游戏时可以有震动回馈,他也可以输出要看你的设备是否支持输出机制,有些键盘可能有震动,比如说玩游戏是有问题了走在一个非常不光滑的路面上时键底下可能有震动,通常交互式设备,娱乐设备通常时有输出的,但是我们键盘是不可以的,另外一个像我们的鼠标也是个输入设备,不能做输出的。
最常用的输出设备是什么?显示器了,这是一个输出设备,而且是一个最为廉价的输出设备,是人类计算机诞生开始到现在最为廉价的输出设备了因为早些时候的输出设备是穿孔纸带,任何一次输出都需要弄一条纸带在上面打孔,有空的地方标识 1,没空的地方标识 0 这些记录员再将这个翻译成二进制在转换成十进制在根据码表在转换成字符,像早期的电报就是通过这种方式来发报的,几长几短,几短几长,早期的时候莫尔斯码就是这种方式实现,那么莫尔斯码中我们按下去马上迅速抬开标识 0,按下去持续元短时间在抬开标识一个 1 那么按下去很长时间再抬开这表示几个一。我们要输入的数据是 01110,那是几个 1 呢,双方必须按照同一时序进行工作,要么是同步要么是异步,异步的话要实现定义好比如每一毫秒的时长标识一个 1 如果按下不松开这就是 1000 个 1. 所以时间再数据传输过程中是至关重要的没有时间我们将无从知道是一个 1 还是一堆 1,这就是为什么计算机内部会有频率,每一个频率是指在一个时钟周期内,时间结束了干一件事就干完了是这样的意思。这就是为什么主频越高,cpu 的性能越好所谓 3G 赫兹就是指 1 秒钟内能做 3G 赫兹次的操作 30 多亿次运算如果是 1g 赫兹就只能做 10 亿次运算了。所以一直叫赫兹,赫兹指的是频率。像现在的显示器如果我们要用打印机输出的话。每一张纸打印后就不能用了,我们很难对他清理,但显示器不是,显示一屏再一屏好像也没什么价钱,所以一次购入后能亿万次的使用因此我们说他是最廉价的输出设备而且是最直观的输入设备。早期的输出设备是一级显像管现在都是液晶的了不过哪种显示器再显示色彩上,色调上更逼真了在有些场景中可能会使用。大家要知道这是一种输出设备就可以了。而我们的整个计算机也就是由所谓的 5 大基本部件组成,但是我们买了一台计算机或者买了一个没有装系统的笔记本发现我们什么事也做不成因此我们就需要程序。软件才是真正帮助我们干活的那么一个东西但是我们的计算机从最初发展到今天带盖爷经历了好几代了我相信很多同学再上计算机颗的时候老师会讲计算机发展经过了四代,有什么电子管时代,晶体管时代,集成电路时代,然后是超大规模集成电路时代,现在不知道事什么时代了,据说中国的某一家组织某一个研究所已经快研究出光子计算机了,量子计算机了,据说全球人民都在抢夺量子计算机这一制高点,像现在的计算机是电子计算机,是基于电子来进行计算的那下一时代有可能是光子的也有可能是量子的对于量子而言,一般来讲,一个电子只能标识 2 个数字,要么是 0 要么是 1 但是对于量子而言他是种模糊态他的特性是不确定的有各种各样的可能性,举个例子。从这到天安门有多少条路可以走,发现有无数条路可以去,只要不走就是模糊的,但是我们一旦选定了这个状态就确定了,大体上就是这门一种形式。当你不观测时特就像一个波,观测时他就是一个电子。如果根据这种态来实现数据记录的话,很可能任何一个事态再观察之前是模糊的他能存储 N 种可能性这就是的同样的位比如 10 位类存储数据,10 位量子可能比我们现在的全球的所有的电子计算机加起来所能提供的运算能力和存储能力都要强各国军方都在研究量子计算机,因为量子计算机的计算能力超强无比,现在的各种加密机制,揭秘机制,防护机制在量子计算机面前不堪一击我们有理由相信可能 20 年以后终结者会派回地球了来拯救人类了当年的被称为 skynet 的公司变成 google 了。Google 公司实在是太强大了背后研究的东西能够超乎你的想像,比起国内的某度某巴某讯都不是一个量级的。我们继续说硬件设备。硬件设备他不能完成具体的操作,要完成某一个任务靠的是软件程序,这个就需要程序员啦,将来没准每个人都会写程序,否则再终结者面前都没有生存能力,对于学运维的人来讲有一个优势你能找到唯一入口给他 q 一下终结者就 q 掉了。没准 20 年以后我们生存下来的可能性比较大,所以现在学的是一个活命的技能。对于我们的软件程序来讲程序员需要写程序,要想让程序能够在硬件上运行起来首先他得能够根据硬件自己的程序逻辑来写程序。
A 公司所生产的 cpu 芯片,和 B 公司所生产的因为是商业秘密所以彼此之间是不会共享的。也就意味着 Inter 公司和 AMD 公司或者其他公司的 cpu 他的内部的执行逻辑都不一样指令也不一样。因此程序员写程序就是查看 cpu 使用说明书,它里面会告诉你,怎么写程序。而你写的程序只能在这一类上 cpu 上运行,换个 cpu 就不行了因为我们写的接口就是这样子的。这是机器语言,说到机器语言可能过于底层。我们至少每一个芯片还有一种叫做微码编程语言,而微码编程语言跟你的芯片也是密切相关的用 A 微码编的只能用于 A 类 cpu 同一家公司生产的 cpu,会向后兼容为奔腾写的酷睿能运行,为酷睿写的奔腾不能运行,全球生产芯片的厂商是不是非常多,你写的程序在 A 主机上能运行,到了 B 主机上却运行不了,所以他们不具有通用性,这是第一个面临的问题第二个问题,即便他们有通用性。我们的全球的 cpu 厂商一家公司使用同一个规范所研发但仍然会有一个问题,程序员写程序。我们要完成的功能是只一个但是为了能够让这个功能在硬件上运行起来我们得写很多的代码才能支撑着这个跑起来,这是底层为了能让硬件跑程序我们不得不写的代码。像驱动硬件,驱动程序就是底层代码。