JavaEE初阶系列 -开头篇:计算机是如何工作的(为下一篇的线程做铺垫


电子开关 —— 机械继电器(Mechanical Relay)

在这里插入图片描述

电磁继电器,通过通电/断电来切换开关的状态,得到 1 或者 0 这样的数据(二进制数据)。

我们可以实现 1 位(bit) 的看似无用的逻辑运算,但至少它工作起来了,不是么。

怎么使用电子开关组合出真正有用的逻辑组件,我们接来下会做进一步的学习了解。


门电路(Gate Circuit) - 模电数电知识


我们学习如何使用电子开关构建一些有用的部件 —— 门电路。可以实现 1 位(bit) 的基本逻辑

运算。

基于上述的“电子开关”就能构造出基本的门电路。


1、与门:可以针对两个二进制数(0 / 1)进行与运算

1 1 = 1

1 0 = 0

0 1 = 0;

0 0 = 0

全 1 出 1,有0出 0

5LXplbmhlaQ,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)


2、或门:与门:可以针对两个二进制数(0 / 1)进行或运算

1 1 = 1

1 0 = 1

0 1 = 1

0 0 = 0

有 1 出 1,全 0 出 0

在这里插入图片描述


3、非门:可以对一个二进制数(0 / 1)进行取反,.就是我们编程中的 按位取反。

0 ->1

1->0

取反

在这里插入图片描述


基于上述的基础门电路,能构造出一个复杂的门电路。异或门电路

在这里插入图片描述

同或门就不说,与异或相反的规则: 相同 出 1, 相异出 0


算术逻辑单元 ALU(Arithmetic & Logic Unit)

ALU 是计算机中进行算数、逻辑运算的核心部件,是计算机的数学大脑。接下来,我们用上一节构建的逻辑门来完成自己的一个 ALU,去学习理解它的工作模式,以便作为我们进一步理解现代计算机工作原理的基石。

著名的 ALU —— Intel 74181

在这里插入图片描述


算术单元(Arithmetic Unit)

算数单元,负责计算机里的所有数字操作,比如四则运算,当然它能做的远远不止这些。接下来我们会带着大家实现一个 8 位(bits)的加法器(adder)来,简单演示整个过程

半加器 - Half Adder

是针对两个比特位,进行加法运算

在这里插入图片描述


全加器

是针对三个比特位,进行加法运算

在这里插入图片描述


8 位 数加法器

A 和 B 是 2个bit 的 数字

A0 这个数字就是 第 0 位(最低位,也就是最右边)

然后 A1 是 第 1位,最右边倒数第二个、

A2、A3…依次类推

B 也是同样的。

在这里插入图片描述

至此,一个 8 位(bits) 加法器就被我们从无到有制作了出来。算术单元支持的操作当然远不止这些,通过继续组合逻辑门,算数单元可以做到加减乘除甚至更多的算术运算,但一个加法器作为演示已经足够了。实际上,乘法器和除法器的制作难度是要高于加、减法器的,有兴趣的可以尝试做更多的了解

电子开关 =》 基础门电路 =》异或门电路=》半加器=》全加器=》8位加法器。

我们只需要知道 8位加法器 包含了很多电子开关就够了。

写代码是我们的主要任务,模电和数电属于硬件方面。

搞不懂没关系!有个印象就行。

另外,还需要知道一点:有了加法器之后,除了加法,还能计算减法,乘法,触发、都是通过这个加法器来执行的。【只不过结构很复杂】


那么,减法怎么实现?

其实在 C语言初阶的内容中,在讲数据在内存中的存储。

涉及到的原码、反码、补码。

计算机如果表示一个正数,直接使用原码。

如果表示一个负数,使用补码【原码的符号位不变,其他位按位取反,再加上1】。

表示负数为什么要使用补码?

就是为了统一加法和减法。

减法:就相当于加上一个负数。

取反 =》 非门、加法我们直接用加法器去加1就行了。

乘法:就是连续相加【2 * 3 = 2 + 2 + 2 】、

除法:连续相减。


小结

目前我们认识到了门电路(电子开关)。

对于CPU 芯片来说:上面就继承了非非非常多的这些电子开关。

一个CPU上面的电子开关越多,那么就认为计算能力就越强。

28亿条指令?? 就是因为 CPU上的电子开关实在是太多了!!!

CPU 很难制作,难点不在工作原理上,因为CPU的基本工作原理 并不复杂。

按理来说任何一个计算机专业的大学生,都已掌握了 CPU 的工作原理、

通过 《计算机导论》、《大学物理》,《模电数电》、《计算组成原理》、《汇编语言》、《微机原理与接口技术》这些课程,已经给大家讲清楚了。

CPU 制作难,是难在CPU的制作工艺,因为它的制作工艺非常复杂!!!

CPU的工艺越精湛,CPU就越抗造。


拓展:

CPU 也有体质的说法

举个例子

intel CPU(酷睿系列)

i9(最好)

i7

i5

i3(最次)

这些都不陌生对吧?其实 i3 ~ i9 的加工过程是不区分的,一起加工的,工艺 和 材料上面的都是一样的。在它们做出来之后,其中体质最好的就是i9,但其实 i9 也分层次的,最好的是 i9 12900k(带k的,一般都是最好的。能超频)

不带k的 12900 就不能超频,其次就是 i7以此类推。


有的人可能会有疑问:在所有条件都是一样的情况下,制作出的CPU会有这么大的差距?

这因为CPU电子开关非常多!!!

再加上我们要将它集合在一个很小的空间。难免出错(一些电子开关没做好),导致 体质降低。再以体质进行分类。

生产是有一个良品率的。每一批的体质好的占比率。

目前 AMD的CPU 制作工艺已经达到了 7 nm 的工艺,即将推出5nm。

inter 的 CPU 是10 nm,也是即将退户 5 nm,

5 nm 是什么意思呢?

就是说: 一个电子开关大概就这么大。(1nm = 10^(-9)m)

电子开关越小,才能让 CPU 上面的集成度更高,运算效率更高。

另外,要想达到这样的精度,必须使用特殊仪器,其中最典型的就是 光刻机。

而且 nm 这个尺度,已经是分子级别了,已经脱离了力学范围,量子力学接手!

而且 美国在芯片市场上卡中国的脖子【卡的就是CPU】

假如在读的各位中有人发明了光刻机,直接拿到共和国勋章是没有问题的。


CPU 里面除了运算器之外,还有控制单元和寄存器。

========================================================================================

寄存器


寄存器是 CPU 内部用来存储数据的组件。

访问速度:寄存器 比 内存 的 3 ~ 4 数量级。

【内存访问速度比硬盘快成千上万倍,寄存器的访问速度 又是 内存的 成千上万倍】

【寄存器的访问速度 是 硬盘的是 上亿倍!!】

相对的,寄存器的存储空间 又比 内存 小上很多很多。

现在的 x64 的 CPU(64位 CPU),大概有 几十个寄存器,每个寄存器是 8 个字节。——大概就是几百个字节。(内存现在普遍都是 8G 的。可想而知 寄存器 和 内存 的 存储空间的差距是非常大)

理由很直接,成本比内存贵很多的。

另外说一点:我们平常见到的CPU大部分都是家用的,最好的CPU (i9 12900 也就5000)。

最好的CPU 是 给 服务器用的那种,比如说 inter的志强系列。

这种CPU 贵的大概 2 ~3w。

总得来说:只要钱到位,什么都好说!


寄存器的持久化存储:与内存一样,断电后消失。


控制单元(CU)


CU 协调 CPU 来去进行工作。

CPU上已经有寄存器可以存储了,又有 运算器 进行运算,但是你还得有一个进行调用工作的“人”,它来协调这些组件进行操作。

CU 最主要的工作:能够去执行指令,然后指挥 CPU 来完成一些具体的操作。


指令 (Instruction)

首先,指令 和 我们的编程密切相关。

其次,我们先介绍下我们需要到的指令(instruction),又称机械语言。

说到机械语言,就不得不讲一下 编程语言。

编程语言大概分为三类:

机器语言(通过二进制的数字,来表示不同的操作)

【1、不同的CPU,哪怕是同一个厂商,只要型号不同,CPU 所支持的 机器语言 都可能不相同。】

【2、一个CPU到底支持哪些指令,生产厂商会给我们提供一个“芯片手册”,里面会详细介绍CPU都支持哪些指令,每个指令都是做什么的】

汇编语言 (又称助记符)

【1、每一句机械指令,都用一个单词符号去表示。于是就有了汇编语言】

【2、因为机械语言是由 0 和 1 组成的,容易眼花出错。所以汇编语言使用的是 用简单的英文来表示不同的指令。】

【3、汇编语言 和 机器语言是一对一的关系(原则上完全等价)。】

【4、不同CPU支持的机械指令不一样,自然不同CPU上的汇编也是不一样的】

(大部分学校讲的汇编语言都是针对 一款上古神U,inter 8086 CPU.这款CPU统治市场20年【197x ~ 199x】,需要注意的是当年的 8086上面的机械指令【汇编】,在现在的电脑上已经跑不起来。 )

(唯一可能接替它的只有 inter E3系列)

高级语言(C、Java、C++…)

所谓指令(机械语言),即指导 CPU 进行工作的命令主要有操作码 + 被操作数 组成

其中操作码用来表示要做什么动作被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。

指令本身也是一个数字,用二进制形式保存在内存的某个区域中


指令是如何执行的?

下面一个最简单的构造手册,来帮助我们理解 指令是如何执行的。

指令表(Instruction Table) / 构造手册

假设我们的 CPU 现有两个寄存器: LOAD_A(寄存器A 00)、LOAD_B(寄存器B 01)

| 指令(instruction) | 功能说明 | 4位 opcode | 操作的地址或者寄存器 |

| — | — | — | — |

| LOAD_A | 从 RAM 的指定地址,将数据加载到 A 寄存器(读内存操作) | 0010 | 4 位 RAM 地址 |

| LOAD_B | 从 RAM 的指定地址,将数据加载到 B 寄存器 | 0001 | 4 位 RAM 地址 |

| STORE_A | 将数据从 A 寄存器写入RAM 的指定地址 | 0100 | 4 位 RAM 地址 |

| ADD | 计算两个指定寄存器的数据的和,并将结果放入第二个寄存器 | 1000 |        2 位的寄存器 ID               2 位的寄存器 ID |

示例1:我们现有一条指令(机器语言) : 0010 1010

这个指令的意思:就是把 1010 内存地址上的数据给读取到A寄存器中

在这里插入图片描述

示例2:指令(机器语言) : 0001 1111

在这里插入图片描述

示例3:指令(机器语言) :0100 1000

在这里插入图片描述

示例4:指令(机器语言) :1000 0100

在这里插入图片描述


拓展:如何计算 两个数相加?

在这里插入图片描述


题外话

==================================================================

虽然我们用的都是高级语言,汇编语言几乎不会用到、

但是在一些特殊领域上,就需要用到汇编,就需要理解机器指令。

比如:

1、游戏领域【外挂】

外挂是一个单独的程序,对于一个游戏来说,源代码是不会开源的。

虽然没有原码,但是可以有执行程序(后缀 exe 文件),这里面其实就是二进制的机器指令。

这些文件里面有特定的结构(Windows:PE结构,Linux: ELF)

这些结构,其中有个部分叫做代码,包含了程序涉及到一些逻辑。(二进制指令)

我们就可以通过研究这里的机器指令,找到一些关键逻辑。

比如:吃鸡的锁血外挂,就是找到中弹扣血逻辑。

修改一些机器指令的条件判定加上算术运算,或者把扣血量设置为0的操作。

其实就可以达到实现外挂的逻辑。

但是需要你 非常理解 汇编语言

2、安全领域(病毒)

外挂只是针对游戏病毒进行逆向,而病毒是针对系统的逆向。

两者的本质是一样的。


操作系统

===================================================================

首先,大家要知道 操作系统是一个“软件”。

这是计算机上最重要,也最最复杂的软件之一。

比如:

Windows、Linux、mac、Android、ios、openwt…


操作系统的作用是什么?


”操作系统作用主要就是管理,操作系统就是一个搞 “管理的软件

1、对下,要管理好各种硬件设备

2、对上、要给各种软件提供一个稳定的运行环境。

由此不难看出:操作系统 相当于 在 软件和硬件之间 建立了一座“桥梁”。

这个时候,我们的软件和硬件就可以更好的进行交互,更好的进行相互配合,更好的来完成一些共同的工作。

在这里插入图片描述

操作系统中提供的功能是非常复杂的。

重点给大家介绍,操作系统中对 “进程”这个软件资源的管理。


什么是进程/任务(Process/Task) - 上面你们随便看看,但是这里是重点(与线程有关)


进程就是跑起来的程序。

在这里插入图片描述

打开我们电脑的任务管理器

在这里插入图片描述

这一共有一百多个进程。【有些是系统创建的,有些是我们创建的】

有的朋友可能现在会有疑问:我们经常听说的线程又是什么?

线程 其实是 进程的一部分。(进程包含线程)

如果我们把进程想象成一个工厂,那么线程就是工厂里的流水线。

一个工厂里可以有一个生产线,也可以有多个生产线。(多线程)

【这里不多说,在下一篇多线程中,我会仔细介绍】

既然进程是一个跑起来的应用程序,这就和我们的代码怪上钩了。

我们写的代码,最终目的都是要跑起来,最终都是要成为一些进程。

对于 Java代码来说,最终都是通过 java 进程来跑起来的。

此处的这个 Java 进程,其实就是 我们平常说的JVM


操作系统是如何管理进程的?


前面我们也看到了 作者的电脑 有一百多个进程,那么操作系统又是如何进行管理的呢?


1、先描述一个进程。

明确出一个进程上面的一些相关属性。

就比如:形容一个学校的学生,你需要学校姓名,班级、专业等等


2、再组织若干个进程

使用一些数据结构,把很多描述进程的信息放在一起,方便进行增删改查。

那上面的例子来说:就是把一个学校的学生信息都列举出来。


详解

操作系统里面的主要都是通过 C/C++ 来实现的。

进程的描述,其实就是用的 C语言中的“结构体”

java的类与其差不多。

结构体 和 java的类 都是 编程语言中提供的 自定义类型。

不同的是 结构体 功能更简单。【只有包含一些成员变量,不能包含方法。也没有继承、封装这些】

类的功能很丰富【属性,方法,继承,封装,多态,反射等。。。】

操作系统 中 描述 进程的这个结构体,被称为 “PCB”(process control block - 进程控制块)

注意!这里的 PCB 不是 硬件的 那个 PCB板!而是进程控制块。


组织若干个进程:典型的实现,就是使用双向链表来把每个进程的PCB给串起来。

因为操作系统的类型是很多的,内部实现也是各有不同。所以我们此处讨论的情况就是以 linux 系统为例。

至于为什么不说Windows系统,是因为它不是开源的。我们无法得知它底层代码的程序是什么情况。

而linux 是开源的,我们是可以看到底层代码 对于 组织进程 是怎么实现的。

linux对于 组织进程的方式 就是 使用 双向链表 来把每个进程的PCB给串起来。

进一步详细的说:

所谓的“创建进程”,就是先 创建出 PCB,然后把 PCB 加到双向链表中。

所谓的“销毁进程”,就是找到链表上的PCB,并且从链表上移除。

所谓的“查看任务管理器”,就是遍历链表,依次取出 链表的每个PCB,再去取出相关资料。

我们的很多代码,最终都是会落在数据结构上。

所以一定要学号数据结构!


了解 PCB中的一些属性
1、pid(进程id) - 进程的身份标识

打开我们的任务管理器,你就可以看到 每个程序的 pid 了

在这里插入图片描述

这些 进程的 pid 可以说是 进程的身份证号。其目的:就是为了区分进程。


2、内存指针

内存指针:指明了这个进程执行的代码在内存的位置,以及 这个进程执行中依赖的数据都在哪里。

首先,我们要明确一件事:当 运行一个 exe 文件,此时操作系统就会把这个 exe 加载到 内存中,变成进程。(此时的进程 就和 这块内存 是 绑定在一起的,是相关联的)

其次,此时我们的内存就包含了很多东西,因为exe文件是加载到 内存中,所以 exe文件里有什么,这块内存中就有什么。

在 这个 exe文件中,就包含这 进程要执行的二进制指令。(通过编译器生成的)

同时,除了指令之外,还有一些重要的数据。

而 这些指令 与 数据 都会存入到内存中,并且是放在内存的不同区域里面。

这个时候,我们就需要进程知道 当前我们的指令是在哪一个内存区域中,要使用的数据 又存储在内存的哪一块区域中。

通过 内存指针,进程就能找到我们当前执行的指令有哪些,以及数据有哪些。


3、文件描述符表

我们的程序运行过程中,经常要和文件“打交道”。(文件是硬盘上的)

我们C语言中就讲过文件操作,java里面也有相关的文件操作,后面也会讲到。

不管是那种语言,这都是属于文件操作。既然是操作文件,那么本质上就是在操作键盘。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

PAPtG4-1712726976141)]
[外链图片转存中…(img-LLxa2wcR-1712726976142)]
[外链图片转存中…(img-PFE6Wbqp-1712726976142)]
[外链图片转存中…(img-HE7t07Tb-1712726976142)]
[外链图片转存中…(img-hoAEQ9cb-1712726976143)]
[外链图片转存中…(img-EqfnoNNQ-1712726976143)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-mS3BKFiX-1712726976144)]

最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了

[外链图片转存中…(img-6WCUCV3U-1712726976144)]

[外链图片转存中…(img-r22ApuD7-1712726976144)]

[外链图片转存中…(img-uGB4QJkw-1712726976145)]

[外链图片转存中…(img-2U7O8KmB-1712726976145)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-4F3RYfWs-1712726976145)]

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值