计算机底层结构

一、人类关于计算领域的发展

人类的祖先从树上下来以后开始了一轮新的生存挑战。与其他动物相比人类没有尖牙厉爪,只能去发展大脑,随着大脑的发展人类逐渐的站在了食物链的顶层。但是受制于人类活动和自然因素的发展,许多大型动物越来越少,所有人类从最开始的狩猎生活逐步发展成了定居的生活,人类开始种植粮食和养殖一些动物,那么统计和记录这些动物的方式就出现了。
最早期的人类将自己养的牛羊的数量画在一根根的骨头上,假设我们用一条横线代表一头羊,随着人类生活越来越丰富,羊群的数量也越来越多,那么在骨头上画的线也就越来越多,数起来也就原来越麻烦,于是有些聪明的人就发现我们为什么不将每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语言是可以控制每个器件的出入电压。
我们将每个器件的使用都封装成相应的程序
在计算计当中每一个硬件都对应着一个驱动,我们程序员只需要知道驱动当中有哪些方法,用来驱动我们的硬件的功能
操作系统内核
我们每一个驱动都对应着一个硬件,但是我们正常使用的一个程序一般都会使用多个驱动协同工作
在这里插入图片描述

三、 了解磁盘的运行原理

上边我们讲了 原始的计算机的计算模型,这个模型有一个缺点就是不能对我们的数据进行存储,包括一些临时数据。这种计算是也是基于人力输入,存储的。
小知识点:

曾经我们要向给计算机输入数据进行预算,我们只能输入01这两个数字,
输出是以纸带的形式进行输出,在纸带上打眼的地方就代表着数字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:这里边有两个地址的概念,一个是操作系统分配的内存地址还有一个是内存还以一个是自带的内存地址。所以我们在输出的时候输出的是操作系统分配到内存地址。
我们在学习链表的时候有的时候会发现:链表的内存空间是连续的,但是这里的空间连续指定是我们叶块的地址连续,这是因为我们的操作系统内存分配在内存空间足够的情况下回尽量分配连续的内存空间。所以在空间足够的情况下链表的空间也是连续的,但是链表和数组不一样,数组是消耗的连续的内存空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划】Leetcode 70. 爬楼梯

【动态规划】Leetcode 70. 爬楼梯 解法1 ---------------🎈🎈题目链接🎈🎈------------------- 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 输入…

CICD流水线(ali)

后端CICD 一、打开云效流水线,创建流水线

【2024第十二届“泰迪杯”数据挖掘挑战赛】B题基于多模态特征融合的图像文本检索—解题全流程(持续更新)

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛B题 解题全流程(持续更新) -----基于多模态特征融合的图像文本检索 一、写在前面: ​ 本题的全部资料打包为“全家桶”, “全家桶”包含:数据、代码、模型、结果csv、教程…

十分钟掌握redis精髓指令

编译安装 git clone https://gitee.com/mirrors/redis.git cd redis make make test make install # 默认安装在 /usr/local/bin # redis-server 是服务端程序 # redis-cli 是客户端程序启动 mkdir redis-data # 把redis文件夹下 redis.conf 拷贝到 redis-data # 修改 redis.…

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i 运行测试

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i 运行测试 1 Prerequisites1.1 C11 or C0x Compiler1.2 Pangolin1.3 OpenCV1.4 Eigen3 2 安装 Intel RealSense™ SDK 2.02.1 测试设备2.2 编译源码安装 (Recommend)2.3 预编译包安装 3 编译 ORB-SLAM34 使用 D435i …

网络学习:RIPNG

目录 前言: 一、RIPNG与RIP的区别 二、如何配置RIPNG 如何解决RIPNG环路问题呢? 控制RIPNG的选路 1、修改RIPNG默认优先级 2.配置接口附加开销值从而干涉RIPNG的选路 RIPNG拓展配置 1.RIPNG的认证 配置RIPNG进程下的IPsec认证: 配…

解决淘宝镜像过期问题 ERR! request https://registry.npm.taobao.org

目录 一、问题描述 二、解决方案 2.1、针对于域名更换解决方案 2.2、针对于证书过期解决方案 三、进行测试 一、问题描述 针对于2022年5月31号和2024年1 月 22 日前的前端项目 npm.taobao.org和旧域名于2021年官方公告域名更换事件,已于2022年05月31日零时起…

Spring Bean加载优先级

当我们使用 ConditionalOnMissingBean / ConditionalOnBean注解去给某个 bean 注入赋予条件时,那在条件判断时我们需要确保条件判断过程所需的环境已准备好。 举个例子 下面的代码中有两个配置类,涉及两个 Bean 的注入 配置类 ConfigA 需要注入一个 A…

IDEA-JAVA 常用的的插件

文章目录 一、常用插件 一、常用插件 CodeGlance:在编辑器侧边栏显示代码缩略图。 Key Promoter X:在你使用快捷键时提示你相应的操作可以使用快捷键来完成。 BashSupport:提供 Bash 脚本语言的支持。 IdeaVim:将 Vim 的快捷键…

Unity与鼠标相关的事件(自己记忆用)

1. OnMouseDown:当用户按下鼠标按钮时调用。 - 参数:MouseEvent,可以用来确定哪个鼠标按钮被按下。 2. OnMouseUp:当用户释放鼠标按钮时调用。 - 参数:MouseEvent,可以用来确定哪个鼠标按钮被释放。…

SpringBoot源码探险 —— SpringBoot启动流程详解

一&#xff0c;SpringBoot启动流程 本人使用的SpringBootParent版本为 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.1</version><relativePath/>…

vsto worksheet中查找关键字【关键字】获取对应的整列 union成一个range

要在 VSTO 中的工作表中查找包含特定关键字的单元格&#xff0c;并将这些单元格所在列合并为一个范围&#xff0c;可以使用以下代码&#xff1a;csharp using Excel Microsoft.Office.Interop.Excel;// 在工作表中查找包含特定关键字的单元格&#xff0c;并返回这些单元格所在…

HTML世界之标签Ⅶ

目录 一、source 标签 二、span 标签 三、strong 标签 四、style 标签 五、sub 标签 六、summary 标签 七、sup 标签 八、textarea 标签 九、template 标签 十、time 标签 十一、title 标签 十二、track 标签 十三、video 标签 十四、wbr 标签 一、source 标签 …

计算机网络——26通用转发和SDN

通用转发和SDN 网络层功能&#xff1a; 转发&#xff1a; 对于从某个端口 到来的分组转发到合适的 输出端口路由&#xff1a; 决定分组从源端 到目标端的路径 网络层 传统路由器的功能 每个路由器(Per Route)的控制平面 &#xff08;传统&#xff09; 每个路由器上都有实…

Oracle数据库如果出现乱码,需要查看是否时字符集不一致导致乱码,这样解决

1、如果出现乱码&#xff0c;需要查看是否时字符集不一致导致乱码 以修改为ZHS16GBK字符集为例&#xff0c;具体字符集需要sql查询。 Oracle查看字符集 SELECT * FROM NLS_DATABASE_PARAMETERS p where p.PARAMETERNLS_CHARACTERSET; SELECT USERENV(language) FROM DUAL; 1.…

uni-app从零开始快速入门

教程介绍 跨端框架uni-app作为新起之秀&#xff0c;在不到两年的时间内&#xff0c;迅速被广大开发者青睐和推崇&#xff0c;得益于它颠覆性的优势“快”&#xff0c;快到可以节省7套代码。本课程由uni-app开发者团队成员亲授&#xff0c;带领大家无障碍快速掌握完整的uni-app…

STM32 CubeMx创建Lwip+FreeRtos时出现ping不通的问题

STM32 CubeMx创建LwipFreeRtos时出现ping不通 1、配置ETH&#xff0c;使用中断 2、配置Lwip&#xff08;使用静态ip&#xff09;&#xff0c;其余什么都不用管 3、配置FreeRtos&#xff08;选择V2版本&#xff09;&#xff0c;其余什么都不用管 4、创建代码 5、查看自动生…

目标检测预测框可视化python代码实现--OpenCV

import numpy as np import cv2 import colorsys from PIL import Image, ImageDraw, ImageFontdef puttext_cn(img, text, pt, color(255,0,0), size16):if (isinstance(img, np.ndarray)): # 判断是否OpenCV图片类型img Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2…

注册中心的基础知识

什么是注册中心 当服务启动时,将服务信息服务名称/IP/端口写入注册中心.注册中心接收服务端信息时保存服务信息,并且维护服务列表数据当服务消费者启动时会通过IP:端口(注册中心)远程链接注册中心. 获取服务列表信息.缓存到本地 当消费者调用服务时,查找缓存到本地的服务列表…

XSS一-WEB攻防-XSS跨站反射型存储型DOM型标签闭合输入输出JS代码解析

演示案例&#xff1a; XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM #XSS跨站-输入输出-原理&分类&闭合 漏洞原理&#xff1a;接受输入数据&#xff0c;输出显示数据后解析执行 基础类型&#xff1a;反射(非持续)&#xff0c;存储(…