共计 4848 个字符,预计需要花费 13 分钟才能阅读完成。
本文为《跟马哥学 Linux》系列文章的第五篇,上一篇文章为《Linux 云计算架构师课程介绍》。
前面的内容当中呢,我们给大家简单介绍了一下我们的课程体系,并且也描述了在 IT 领域当中的我们的常见的技术方面的工作岗位,会集中在两个的的领域的那个位置,然后做了一些说明。那接下来我们会继续相关的话题。不过,这次我们要描述的是简单来讲是计算机与操作系统,给大家做一下简单的描述。各位都知道其实计算机诞生也很久了,在上个世纪的四十年代其实是三四十年代,电子计算机还是真空管的或者说是电子管的计算机已经出现了。而真正在 ENIARC 出现的时候,大概是上个世纪的四十年代,应该是诞生在美国宾夕法尼亚大学,而且那个时候整个计算机的体系结构就已经净化到了,我以前说过五大基本部件组成,在此之前我们就讲到过这五大基本部件,不知道大家号有没有印象,我们说过计算机的五大基本部件及所谓的放诺依曼体系。五个部件分别是,CPU,其实 CPU 里面包含了两个部件集成,第一个部件是运算器。他只要是做算术运算和逻辑运算等各种各样的运算的,所以把它称之为运算器。那第二个就是控制器,比如我们控制的总线的使用权限。我们等会改大家做一下简要的描述,比如说没他还需要完成寻址控制对内存当中的访问权限是做读访问还是写访问,等等,这一切都是由 CPU 来完成的。另外,cpu 内部其实还有大大小小众多的寄存器,其实就是内部的存储器,我们称为寄存器,额外还有缓存,很多同学都听说过,这两个都是用来实现存储数据的。缓存又分为了一级缓存,二级缓存,三级缓存等等,而最核心的部件无非是运算器和控制器。
接着第三个部件值得是存储器。这个寄存器和缓存仅仅是为了加速,为了提升 cpu 的性能而提供的辅助性工具,比如寄存器是用来所锁存数据的,而缓存只是用来缓存数据的所以它并不是核心部件,而是一些加速部件。存储器也就是我们通常在口语中的内存,它被称为 RAM,也被称为叫随机访问存储器(Random Access Mem)。所以把它称之为 RAM,而存储器和 cpu 结合起来组成了计算机做核心的部件,而整个计算机也是围绕着这三大部件,运算器,控制器和存储器就能够展开的并完成所有操作。
不过除了他们之外我们说过还有另外两个部件,而这两个部件仅仅是让计算机能够按需,按人类自身的需求完成数据加工的组件,第一个我们称为 Input 设备,另一个是 Output 设备,所以称为输入输出设备,输入输出就跟我们之前举例子说过的,想那个洗衣机一样的道理。我们为了能让洗衣机洗衣服,他必须给我们一个接口能够让我们把衣服塞进去所以这叫输入设备,同样的衣服写完了我们还必须要把他取回来,所以这就叫输出设备,计算机对这个输入输出通常只是 Input 向计算机下指令,告诉他需要做什么,叫下指令。以及并提供需要加工的数据等相关的操作的,而 output 呢,通常就是将对方计算结果输出,所以就是输出数据加工后的结果。大体上就是这个样子完成这几个操作,所以我们说 CPU 和存储器才是最核心的部件。
但是各位又有一个问题了,我们计算机是如何能够从存储器中取得数据呢?简单的讲,其实在冯诺依曼体系中,也定义了另外一个概念,叫做程序,是由指令加数据组成我们此前也提到过很多次,指令就是指计算机需要操作的命令,比如我们做加法做减法等这种叫做指令,当然我们从内存的某个位置取得数据也叫做指令,但是数据本身则是被加工的内容,另外,程序还可以分为另外两种方式,后面我们讲到 shell 变成是可能更容易理解。程序也是由所谓叫算法加数据结构组成,什么叫算法能?同样的道理,我们从下载的位置走到天安门广场肯定有 N 多条路径可以到达,所以我们要计算出,哪一种方式对我们是代价最低的。我们就走这条路径。那问题是我们要现在走到广场,我们算出来说乘坐直升机是最快的,而且代价呀不是很高是能接受的,问题是我们能够完成打飞的将你运过去,这个飞的应该具有这样的组成格式呢?最起码要运载一个人,如果要是一个简单的无人机的话,压根是承载不了一个人,很显然这种操作我们是无法执行的。所以,数据就够则是用于表明这种指令这种算法本身,他们要完成数据加工,我们如何将数据放置到可放置数据的位置,以及按照哪种格式进行组织,人们发现无人机也能将人运过去比如将人切成没一公斤一块能运过去,这也是一种数据结构,所以说,不同的算法通常而言需要对应不同的数据结构。不同的算法对于不同的数据结构来说是有很密切的关系的有些数据结构用 A 算法效率较好,有些数据结构用 B 算法效率较好,就像刚刚给大家描述的那样。所以说程序是由指令加数据组成,指令怎么跑,对于计算机来讲 cpu 就是跑程序的或者说是跑指令的。
而 cpu 又有运算器和控制器组成,我么你将两者给划分开,给大家描述一下。假如说做左侧是运算器,右侧是控制器,
然后底下再加上存储器里面有数据告诉 cpu 做加法运算,
于是,cpu 上一定有一个指令是在 cpu 芯片设计时其内生在硬件逻辑上要支持加法运算,不支持则无法运算,所以这个就是 cpu 自己支持的指令,而 cpu 能够做加法减法乘法除法运算等,那么所有的指令结合起来,对 cpu 而言就叫做指令集,即所有能够执行的指令的集合。指令集大体上有分为两类,一类叫做不同指令,一类叫做特权指令,普通指令就是算一算一加一等于几,他的操作几乎时对其他人时没有影响的,但是如果告诉你把内存清空,大家应该明白,所有的数据都在内存中,如果把内存清空就意味着也把其他人的数据清空, 这个时候有可能危及到其他人的。
比如说,来一颗原子弹往东京扔过去,这实际上是影响到别人的,何种操作时不被允许的,但是要是在西伯利亚那个万里无人区扔一颗问题不大,是可以做核试验的,所以希望各位理解指令集操作的概念。好的,同样的道理,对于这的存储运算器来讲他是有各种各样的指令的,控制器也有各种各样的指令,不过运算器通常只是做运算,而控制器这是控制这几个部件来协调也包括寻址操作。来个大家简单描述一下存储器跟他们彼此之间时如何结合的。
比如要做加法运算,问题是几加几,谁加谁,数据时在什么地方存放的呢,指令是 cpu 自己支持的,那我们要算的数据在什么地方,加工点对象在什么地方一般来讲这就需要到存储器来存储数据了,而我们看到的就是那个内存设备,而再其内部是划分成各个存储单元的,每一个单元加入叫做一个存储细胞,每一个 sell 的大小是固定的,而在历史上各种各样说不清道不明的原因,每一个 sell 的大小是 8 位,
自此之前的预科学前班当中各位知道,我们的计算机是按位以二进制的方式来存储的,8 位指的就是 8 位二进制,最高只能存 8 个二进制数字就是 0,1 当中的任何一种变化形式。每 8 位组成一个 sell 一个存储单元,这每一个 sell 所提供的存储单元通常称为一个字节叫做一个 Byte。把他分为大 B 和小 b 的概念,小 b 通常是 bit 是位,而大 B 指的是 Byte 这个 Byte 指的是 8 位二进制,这每一个存储单元都是由 8 位二进制组成注意我们对内存而言最小的存储单位就是字节不能再小了,哪怕是存储一位数据也是占用一个字节,另外 7 位只不过是空的,对你来讲没有用,所以大家一定要是知道最小寻出单元指的是什么。就像你买东西一样,对方说按斤起买,少了不卖这其实就是最小存储单位。
问题是,我们有这么多个存储单元格子,我们想访问数据时,我们要访问区计算第 8 个 sell 和第 3 个 sell 之间两个数字之间的和,问题是我们怎么能够知道第 8 个格子在什么地方,第 3 个格子在什么地方,对我们人而言很容易理解,比如说对于北京市来将他又某个路,某某单元,某某号,某某栋等等来进行编制的。这每一个位都可以住人,所以可以理解位人就是一个数据。就是组织在这样一个对应的能够存储人类的地方的房子,这样就称为存储格子。那么为了每一个格子能方便的找到,所以我们给他做了编制内存也是一样的道理,相信各位也容易理解。内存当中的每一个 sell 都是有地址的,而对于计算机来讲他们叫电子数字计算机,所以他们更容易理解的时数字而不是字符串,不像现实生活中我们叫北京市,比如某某胡同,某某巷。某某街,某某号之类的,
这儿统统按照数字进行编制,而且数字编制时我们必须能够在一个平面下编制完成才行,什么叫做一个平面下,比如对于一个北京市而言,北京市一号,北京市二号,北京市三号,问题是大家想想我说北京市一号,你知道北京市一号在什么吗?我们就无从得知了,所以说我们有一个或者说为了让我们知道有一种特定的逻辑性编码,从南向北,横过去一排,横过去的时候我们就自东向西然后开始编 12345678……那这样子就编译在了一个平面下,而天安门可能就是北京市第 100 号,因为人们币最大也差不过 100,所以就给他是北京市 100 号,我只是举个例子这样说明,这种就叫做一个平面单元。在一个平面单元下我们能编多少呢,假如说我们只有 3000 号,如果说我们北京有了 3001 号,那号怎么办呢,在我们的户口部上就没他了。我们无法找到他,这就溢出了,但不管怎么讲,刚刚我们描述的这种就是平面编制,我们发现,编码不方便,查找也不方便于是我们可以把他划分成 N 层的立体编制方式,比如北京市海淀区,朝阳区,像这样就是一个立体编制方式了我们从一个大空间缩小到了若干个小空间,小空间还可以在此缩小空间。但是内存不能,内存的便是方式是一个在平面结构下进行编制的,他的编制方式必须能够容纳所有的内存空间才可以,而历史上有说不清道不明的原因,cpu 有字长的概念,比如有 8 位 cpu,16 位 cpu,32 位 cpu,而现在更多的是 64 位 cpu,你知道这个位是什么概念?巷 32 位的 cpu 指的就是,我简单的来讲,就是他的诗句存取能力一次是 32 位二进制你可以想象成在 32 位 cpu 之前有 32 并排的跟线,每一根线对于计算机来讲无非就是通电不通电,有电压无电压,所以用来表示有电压表示 1 无电压表示 0。
因此有 32 根线没跟线只有两种状态,就是 0 或 1.,大家可以想象一下,有 32 根线能表示多少不同的变化呢?在高中的时候,我们学过排列组合的概念。每一根只有两种变化,一共有 32 根线组合起来有多少种变化呢 2 的 32 次方种变化,所以这个 cpu 最多只能引用 2 的 32 次方的不同的位置,对于 32 位的 cpu 来讲他最多只能理解 2 的 32 次方的 sell 大概是 40 多亿个。
2 的 10 次方是 1024。2 的 10 次方做 10 进制换算 2 的 10 次方 =1024,2 的 32 次方就等于 1024 乘以 1024 再乘以 1024 在再乘 4. 本来默认一个最小存储单元是字节所以结果就成了把他做一次向上进制所以 KB 指的是 1024 个 Bytes 所以就相当于 1024 再乘以 1024 在再乘 4. 个 KB 那再来一个 1024 就是 MB 了所以将这个单位换算成一个 1024 乘以 4 个 MB。M 和 G 之间又相差一个 1024 所以就成了 4 个 GB,所以 K 在计算机术语当中表示 1024 为单位进行进制的,
而在十进制中 k 是以 1000 为进制的,所以现实生活当中我们买 U 盘也是这个道理。生产厂商是以 1000 为进制单位的而计算机识别是以 1024 为进制单位的所以买了一个 32g 的 U 盘一格式化发现只有 29 点多 G,而是无良厂商使用了和计算机不一样的进制来描述的。所以 32 位的 cpu 最多可以使用 4g 的内存。所以这里的每一个内存单元,都是使用了 32 位的二进制对 32 位的主机来讲进行标识的你如第一个那就是前面是 31 个 0 或者说全是 0 所以用 32 个 0,标识第一个存储单元,01 标识后面的单元,10 标识后一个单元……
所以是在同一个平面下进行编制的,因此所有的内存包括我们手机上的那个内存也是基于这种方式来定义的。因此计算机运行程序是怎么运行的呢。什么叫指令加数据,对于计算机来讲,他能够运行指令加数据,我刚刚说过,程序是有程序员变写的程序员写好的程序应该放哪啊,通常是放在外部设备上的,写好的程序要做永久存储会放在硬盘上因此这个程序要想能够运行就必须首先装载到内存中因为 cpu 只能跟内存打交道不可能跟硬盘直接打交道所以所有内存都应该先装入内存,硬盘其实是一个 IO 设备。