一、人类关于计算领域的发展
人类的祖先从树上下来以后开始了一轮新的生存挑战。与其他动物相比人类没有尖牙厉爪,只能去发展大脑,随着大脑的发展人类逐渐的站在了食物链的顶层。但是受制于人类活动和自然因素的发展,许多大型动物越来越少,所有人类从最开始的狩猎生活逐步发展成了定居的生活,人类开始种植粮食和养殖一些动物,那么统计和记录这些动物的方式就出现了。
最早期的人类将自己养的牛羊的数量画在一根根的骨头上,假设我们用一条横线代表一头羊,随着人类生活越来越丰富,羊群的数量也越来越多,那么在骨头上画的线也就越来越多,数起来也就原来越麻烦,于是有些聪明的人就发现我们为什么不将每10个横线重新做一个标记,比如用一根竖线,这样我们数羊的时候我先数有几个竖线然后在数有多少横线。
随着人类的发展人类进入了农业文明,需要存储和交易粮食也越来越多,这样就需要一种计算器来代替人脑的直接计算就是 —算盘
我们用最右边的珠子代表1,每五个珠子代表进1,即5进制。
人类进入第三次工业革命以后发明了电力,电力开始发展,后来人们发现2进制可以转化为10进制,并且发现可是使用电路来代表0和1,1代表5v高电平,0代表0符低电平。通电和不通电两种状态就产生了人类历史上的一个重要的工具–晶体管。
最开始还不是使用晶体管,一开始使用的是—正空管。正空管的工作原理类似于我们以前的电灯泡,当通电的时候就会发射电子到我们的接收节点上,我们就会判断是高电位,否则为0。但是真空管的缺点是容易坏。(一通电一断电来来回回,马上就会烧掉)。–直到发现二极管。
硅(本身不导电)-》加入特殊元素-》P半导体 N半导体-》PN节-》二极管-》场效应晶体管-》逻辑开关。(通电代表1,断电代表0)
半导体:单项导通性
我们可以通过对逻辑开关的改造成 ,逻辑与,或,异或,与非,或非,异或非等门,然后将他们当成最基本元素不断的搭建就会形成了加法器,在计算机当中一切的计算的基础就来源于加法器。
从上边我们可以得到一个结论:计算机的核心在于找到一种数字,并且找到一种方式让这些数字进行运算
二、计算机语言的发展
计算机本质就是用来做存储数据和数据传输
数据传递就要依靠总线(导线),导线要想传输数据就必须形成闭合电路。导线上进行数据传输用高电压来传输数据1,用低电压来传输数据0。
从上边的讲解当中我们发现计算机的底层是由一个个的电器组建组成的,通过导线来传递高低电压。
多个电路板之间通过形成闭合电路。导线在元器件之间必须是一进一出。由于硬件设置和内部结构的不同,就需要不同的电压来控制。每一根导线都只能在同一时刻发出一种电压,也就是每一根导线在每一时刻都只能传输一bit数据。
我们在编程的时候写的010101这样的数据,在实际传输中发送的是高低电压信号,我们也可以称为机器语言。
机器语言采用的是0101001这样的编码形式,他是如此的难于辨别和记忆,给整个产业发展带来了障碍。于是汇编语言就形成了
汇编语言是将大部分的有规律的机器语言进行提取,编程人员只需要记住相应的汇编指令(英文单词)就可以直接操作机器硬件。
将汇编语言进行优化
但是汇编语言对一些逻辑处理并不是很友好,比如循环,判断等等,写这样的语句还是非常麻烦的,于是我们在汇编语言上进行了优化,形成了C语言。
从当前这个脉络当中我们可以看出C语言是可以控制每个器件的出入电压。
我们将每个器件的使用都封装成相应的程序
在计算计当中每一个硬件都对应着一个驱动,我们程序员只需要知道驱动当中有哪些方法,用来驱动我们的硬件的功能
操作系统内核
我们每一个驱动都对应着一个硬件,但是我们正常使用的一个程序一般都会使用多个驱动协同工作
三、 了解磁盘的运行原理
上边我们讲了 原始的计算机的计算模型,这个模型有一个缺点就是不能对我们的数据进行存储,包括一些临时数据。这种计算是也是基于人力输入,存储的。
小知识点:
曾经我们要向给计算机输入数据进行预算,我们只能输入0和1这两个数字,
输出是以纸带的形式进行输出,在纸带上打眼的地方就代表着数字1,
在纸带上没有打眼的地方就是0,但是有一次呀人们发现电脑没有问题,但就是输出不对,
后来人们发现原来是一个小飞虫堵住了纸袋上的一个眼导致了错误的发生。
小飞虫在英文里边叫做(bug),后来人们把出现的问题就叫做bug.
1.磁盘的形式
固态盘不是主要的应用对象,因为固态盘的使用次数是有限的,无法支撑高并发场景
2.磁盘是如何存储数据的
磁盘存储的最基本原理是电生磁。 磁盘的磁道里边有很多的磁颗粒,磁颗粒上边有一层薄膜为了防止磁点氧化,很薄,手一碰就会消失。
从下图当中我们可以看到如何在磁颗粒上边写入数据
我们的磁头上边有一个线圈,我们可以通过调整线圈的电流方向来控制磁头的磁极,那么在磁头上边的磁颗粒就是出现和磁头相反的磁性。假设我们用磁极N级代表数字1,磁极S级代表数字0,这样我们每个磁颗粒都存储这相应的数据。每个磁颗粒都存储着一个数据,我们将这个磁颗粒存储的数据叫做1 比特
3.磁盘是如何读取
磁头在磁道上运转会切割磁感线,由于磁点有N极和S极。所以会产生两种方向相反的电压,所以需要我们的磁头也需要带有一定的电压。
(举例):假如正电压产生的是2V,负电压也产生2V,我们默认让磁头拥有3V的电压,当他滑到正的时候就有5V电压,当他滑动到负的时候就只有1V的电压
磁头在切割磁感线的时候必然会产生电压,但是不是所有的数据都是我们想要的如何得到我们想要的数据呢?
数据的传输必然是一个闭合的电路。我们只需要在数据传输线路上加一个数据拦截器,当传到不合法的电压的时候会出现断路,如果出现合法的电压的时候回形成闭合电路。
cpu要想读取磁盘当中的某些数据,就必须先将地址发送给磁盘。默认数据拦截器内的电路是断开的状态,数据电压要想通过就必须和地址电压共同作用将数据拦截器内的半导体变为导体。
四、 了解内存的运行原理
1.计算机的位数代表什么以及cpu的计算时间
cpu一次处理数据的量决定了我们操作系统的位数,我们的计算机当前有32位的和64位的,也就意味着我们cpu一次只能计算64bit的数据,那么也就意味着我们的总线一次只能传输64位的数据。
当代cpu的计算时间在0.2ns左右
2.内存和磁盘的速度分析
我们在磁盘上找数据的时候,首先涉及到机械臂的移动,以及盘面的转动 共需要 5ms
上边我们看到cpu的的计算速度和每次只能计算的量,那么我们可以看到我们磁盘和cpu的速度差是25000000倍
那如何解决这个问题呢?------内存
3.内存的物理特征
内存最小单位是一些类似于二极管这样的东西,它能存储一个电状态,高或低,可表示1或0;
内存在断电之后数据就会消失原因就是因为我们的内存条用的是电容存储的电荷
我们知道电容和电池一样,充满电的电池我们用0来代表,没有电的我们用1来代表。
内存的存取速度在20ns左右,如何由内存给我们的cpu提供数据,那么cpu的效率基本上能达到1%
4.内存的叶块和磁盘的扇区
有了内存以后:我们在以前没有内存的时候我们每次都只能给cpu传输64bit的数据。在我们编程当中每个数据类型都有基本单位,比如int类型的数据就是32bit,那么每次我们都只能传输两个int类型的数据。如果我们要传一个大的字符串1wbit的话需要传输5000次。有了内存以后我们一个扇区(4kb) 的数据传输到内存,大大减少磁盘的读取次数,提示效率。
内存的基本存储单元是也1字节或两字节(根据内存的不同而不同)。但是操作系统为其划分了叶块。一个叶块单元也是4Kb。这样当cpu发来一个地址信息,磁盘就马上将一整个叶块的数据全部发送到内存。这样做当读取大量数据的时候就会非常快,但是读取少量数据的时候就会造成浪费。所以我们才设计磁盘当中存储文件,在内存当中去存储变量
操作系统重现划分扇区的目的:
我们的磁盘只能提供磁道和基本的存储单元,扇区是操作系统默认划分的。在最开始的时候我们数据的读取类似于数据的当时一个数据单元代表一个数据,只需要做好分割就行。
当我们更改了默认的存储单元我们就要用地址进行记录。这就意味着我们每一个4kb的存储单元,只要用了1Kb,剩下的3Kb就不能存储数据了,一个存储单元只能存一份数据。这也就意味着我们的磁盘上只能存储文件,而无法存储其他类型的数据。
当我们在定义一个int类型的数据的时候,每个数据都会占据一个叶块单元。原因也是因为定位不到。那么假如我们现在有10个int类型的变量那就意味着需要占据10个4kb,也就是40kb,但是如果我们将一个int类型的数据,那么这些数据将全部放到一个叶块当中。内存的逻辑是有多少个数据就要分配多少叶块,假如我们将这些数据都封装到一个数组当中,那么就会大大减少我们的内存损耗,这种逻辑叫做–buffer
举例
假如我们现在有10个int类型的变量那就意味着需要占据10个叶块。
但是如果我们用一个数据去存储,他就会存储在一个叶块当中,由于每个int类型的数据都只会占据大小相同的内存空间,我们计算机只会记录每个变量的开头的地址,根据数组当中每个基本类型数据的大小进行计算,取出相应的bit数据。在这个地方我们可以看到数组类型的存储可以100%的打败链式存储。这也就是为什么操作系统的实现栈或队列全是数组类型的存储
ps:这里边有两个地址的概念,一个是操作系统分配的内存地址还有一个是内存还以一个是自带的内存地址。所以我们在输出的时候输出的是操作系统分配到内存地址。
我们在学习链表的时候有的时候会发现:链表的内存空间是连续的,但是这里的空间连续指定是我们叶块的地址连续,这是因为我们的操作系统内存分配在内存空间足够的情况下回尽量分配连续的内存空间。所以在空间足够的情况下链表的空间也是连续的,但是链表和数组不一样,数组是消耗的连续的内存空间