《JavaEE》----1.<计算机是怎样工作的>

前言:

      大家好,我目前在学习java。我准备利用这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论!!!

      喜欢我文章的兄弟姐妹们可以点赞,收藏和评论。如果感觉有所收获可以关注我呦。我会持续更新滴,望支持!!!!!!一起加油呀!!!!

语言只是工具,决定你好不好找工作的是你的能力!!!!!

学历本科及以上就够用了!!!!!!!!!!


本篇博客会简单介绍计算机是如何工作的、计算机的发展史、cpu的工作原理、组成、操作系统、存储器、输入设备、输出设备,

计算机的发展史

计算在过去也是普遍存在的,让我们看看计算工具是如何一步步发展知道今天的计算机的。

下面是计算工具的大致发展过程图。

冯诺依曼体系

现代的计算机, 大多遵守 冯诺依曼体系结构 

 

中央处理器CPU:进行算数运算和逻辑判断。

存储器:分为内存和外存,用于存储数据(采用2进制存储)

输入设备:用户给计算机发送指令的设备。

输出设备:计算机给用户汇报结果的设备。 

一、一台计算机的组成

硬件部分:

1. 中央处理器(CPU):计算机的核心部件,负责执行指令、处理数据和控制各种硬件设备。

2. 内存:临时存储数据和指令,用于CPU执行过程中的读写操作。内存主要包括随机存取存储器(RAM)和只读存储器(ROM)。

3. 输入设备:将外部数据转换为计算机能够识别的形式,并输入到计算机系统中。常见的输入设备包括键盘、鼠标、扫描仪等。

4. 输出设备:将计算机处理后的数据以适合人类阅读或其他设备使用的形式输出。常见的输出设备包括显示器、打印机、音响等。

5. 存储设备:用于永久性地存储数据和程序。常见的存储设备包括硬盘、固态硬盘(SSD)、光盘、U盘等。

6. 通信设备:负责计算机系统与其他设备或网络之间的数据传输。常见的通信设备包括网卡、路由器、调制解调器等。

软件部分:

1. 操作系统:计算机系统的基础软件,负责管理硬件资源、提供用户接口和运行应用程序等功能。常见的操作系统包括Windows、macOS、Linux等。

2. 应用程序:针对特定任务或需求开发的软件,如文本编辑器、图像处理软件、游戏等。

3. 系统软件:为计算机系统提供基本功能和服务的软件,如驱动程序、编译器、数据库管理系统等。

4. 工具软件:用于辅助用户完成特定任务的软件,如杀毒软件、压缩软件、文件管理器等。

5. 编程语言与开发环境:用于编写和调试计算机程序的软件和工具,如C++、Java、Python等编程语言和相关的集成开发环境(IDE)。

1.1 CPU

又叫中央处理单元,它是人类当今科技领域中的巅峰之作之一。能早CPU的国家没几个,虽然技术门槛非常高,但是却很便宜。(cpu通过大规模量产,降低成本,且升级换代非常快,每一代提升都很大,这使得旧版本cpu价格又会大幅度降低。)

主要厂商:intel和amd,高通(做手机的cpu)苹果(M2芯片和intel amd之类的没法相提并论..价格高,性能一般)。

Intel CPU首先是产品线

给服务器用:叫志强

给家用:叫酷睿

给嵌入式低功耗设备:叫赛扬

其中酷睿首先分代数,其次

i3:入门级

i5:普通级

i7:高端级

i9:旗舰级 

一般来说13代i5>12代i7

为什么分i3和i5,i7,i9呢?

cpu加工时有一个”良品率“cpu内部有非常精密的结构,存在大量的计算单元,每一个计算单元的体积都极小,给加工制造带来非常大的难度~~光刻机是制作cpu中非常重要的一个环节,制造这一个cpu,上面的计算单元不可能全是好的,通过软件/硬件把坏的计算单元屏蔽掉。好的便是i9,其次便有了i7,i5,i3。

摩尔定律

cpu这类芯片,每隔18个月,集成程度就能提高一倍,计算效率就接近提高一倍,同时成本下降一半。指数级增长。

归纳起来,“摩尔定律”主要有以下3种“版本”:
1、集成电路芯片上所集成的电路的数目,每隔18个月就翻一番;
2、微处理器的性能每隔18个月提高一倍,而价格下降一半;
3、用一美元所能买到的计算机性能,每隔18个月翻两番

cpu发展这么多年,50年+,摩尔定律始终生效。

ps:不要买品牌整机,很坑,贵,东西还不好。不如自己组装,或者买组装好的整机。

现在计算机硬件发展极快。 

ps:垃圾佬:他们通过低价买一些性能还能打的硬件设备,组装出性能还不差的主机~~

如何衡量CPU性能?

重点

①主频:假如2.50GHz,可以简单理解成一秒钟cpu可以执行25亿条指令。现在的cpu主频都是在时刻改变的,根据当前任务的负载程度,动态变化~~,任务管理器可以看到实时频率叫睿频。cpu越好,cpu睿频上限越高。甚至有的cpu还可以超频。给cpu吃更多的电,cpu就有更强的表现。

PS:笔记本cpu中U这个后缀,表示低压CPU。

②核心数:最开始cpu都是单个核心,(核心可以理解成一个能完整计算功能的整体,是由很多的计算单元构成的,提高集成程度,提升cpu的速度。但随着时代的发展,随着集成程度提高,发现进一步提高越来越难)减小单个计算单元的体积,势必就会增大工艺的难度~~当体积小到一定程度,经典力学就失效了。量子力学接管战场...因此基础物理限制了我们的工艺水平。一个核心不够,那就多个核心来凑,1核=>2核=>4核=>8核...又给摩尔定律续命一波。

在任务管理器中我们可以看到

内核(物理核心):是cpu焊上去的核心

逻辑处理器(逻辑核心):现代cpu有一个超线程技术,可以让核心一个顶俩

13代intel cpu有大小核技术,大核一个顶俩,小核一个顶一个,如果要做复杂任务就会用大核(耗电多,发热高),简单任务用小核(耗电少,发热低)尤其是笔记本。

学校学的课程对应的cpu

高数,大学物理,模电,数电,机组,计算机系统结构,微机原理和接口技术都是在讨论cpu)是一个上古时期的cpu,不是现在的cpu。8086 是intel之前一个比较知名的产品,70年代的cpu。差异还是非常大,涉及到汇编语言(CPU指令)要想运行就得用模拟器之类的东西。当然可以先学好之前简单的cpu,便于理解现代更复杂的CPU。

CPU 基本工作流程

首先介绍cpu工作流程所要用到的部件

①逻辑门

电子开关

通过电子开关,我们可以实现 1 位(bit) 的逻辑运算 

门电路:包括与门、非门、或门、异或门等等。

②算术逻辑单元 ALU:

ALU 是计算机中进行算数、逻辑运算的核心部件,是计算机的数学大脑。

我们可以通过连接电子开关、门电路、算术逻辑单元ALU

算数单元,负责计算机里的所有数字操作,比如四则运算,当然它能做的远远不止这些。

比如8 位(bits)的加法器

 

 

逻辑单元(Logic Unit) 

逻辑单元主要用来进行逻辑操作,最基本的操作就是 与、或、非操作,但不只是一位(bit)数的比较。

③寄存器(Register) 和内存(RAM)

光有 ALU 还是远远不够的,我们无法为 ALU 提供存储的部件。利用门电路可以制作存储器。不过这些存储都是要求必须保持通电状态的,也就是这些存储都是易失的(volatile)。

下面简单说一下简单说明 下存储的制作。

中间我们隐藏了一些实现细节,最后的效果就是:使能线置位时,输入为 1,保存 1;输入为 0,保存 0。使能线不置位时,则写入无效。 我们可以利用门锁,构建我们需要的寄存器和内存。

内存的构建要比这个复杂一点,但基本原理一致。如此构建的内存被称为 RAM(Random Access Memory),可以支持 O(1) 时间复杂度访问任意位置的数据,这也就是我们数组下标访问操作是 O(1) 的硬件支持。

上面的说明都隐藏了大量的实现细节 。感兴趣的朋友可以进行深入了解。

④控制单元 CU(Control Unit) 

我们现在有 ALU、存储了,但这还是不足以让我们的计算机工作起来,我们需要有一个部件来指挥 ALU 进行何种的运算,而这个部件就是控制单元(CU)。

CU 如何由门电路从无到有搭建,我们就进行抽象了,我们只需要理解 CU 可以驱动 ALU 进行具体 的计算工作

指令(Instruction)

我们知道CU 可以驱动 ALU 进行具体 的计算工作。

我们先介绍下我们需要到的指令(instruction)。 指令是cpu上能够执行的任务的最小单元

所谓指令,即指导 CPU 进行工作的命令,主要有操作码 + 被操作数组成。

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

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

比如:加法指令,读取内存指令,写入内存指令,条件判定/跳转指令,函数调用指令,堆栈操作指令......

最小单元由二进制的方式来表示叫做机器语言

不同架构的cpu支持的指令/机器语言是不相同的。

CPU 的基本工作流程

 演示指令运行的一个周期。

 

 

 

 

总结指令的运行周期。 

 

当然,电子计算机中的 CPU 可不像我们刚才那样,靠自己来驱动这个周期的运转,而是靠背后一个时钟 来进行周期驱动的。

知乎问答:时钟频率是什么 
主频:

粗略的讲,cpu主频就是时钟震荡的每秒次数。可以近似看作每秒执行的次数

最后,ALU + CU + 寄存器 + 时钟就组成了我们平时经常看到的一个词汇:

中央处理器(Center Process Unit)简称 CPU。 

CPU总结

1. CPU 中的 PC 寄存器,是决定 CPU 要执行哪条指令的关键;

2. 指令是由 动作 + 操作对象组成

3. CPU 眼中只有指令,没有其他的概念

1.2 操作系统(围绕Linux进行讨论)

Windows10

Windows11

linux

mac os

android

ios

这些操作系统,本质上都是用来搞管理的软件

1.2.1操作系统的功能

注意:有的数据库/虚拟机软件支持在裸机上跑...程序内置了一个操作系统,这种另当别论。

1.对下管理所有的硬件设备

操作系统知道市面上硬件设备就那么几个大类,每个大类别下面的硬件设备大概都有哪些功能~硬件厂商需要在开发硬件的时候同时开发一个驱动程序(软件)专属于这个硬件设备,让操作系统通过这个驱动程序完成对这个硬件设备的控制

2.对上要给软件提供稳定的运行环境        

进程的隔离性:一个计算机可以同时运行多个程序,这些程序各自独立运行,不会互相干扰,防止如果每个程序出现bug,就直接导致系统重启,其他程序崩溃。

操作系统给应用程序提供一些API ,让应用程序去调用, 实现操作系统一些功能,比如 就可以控制一些硬件设备

1.2.2操作系统内核

是操作系统最核心的功能模块。硬件的驱动程序,都是在系统内核中执行的。内核需要给很多应用程序提供支持,提供API进行调用。此处这些系统api都被JVM封装好了,因此java程序员一般不会直接接触到系统的api~。

java具有跨平台性,不同的系统提供的api是不同的,JVM对这些系统api就封装了(类似于JABC)

内核态

用户态

一个程序在运行过程中,可能是在用户态工作,也可能是在内核态工作。

一个操作系统=内核+配套的应用程序

进程/任务pocess/task

操作系统内核中涉及很多关键性概念,进程只是其中一个,此处重点就只讨论进程

指正在运行,已经跑起来的程序。windows这个操作系统,一开机就有百八十个进程跑起来,有些是系统自动创建的,有些是手动创建的。每个进程都是系统资源分配的基本单位。

进程在系统中如何进行管理

1.描述 使用类/结构体PCB ,把被管理的一个对象,各个属性表示出来

系统中专门有一个结构体(操作系统内核是使用c/c++写的)描述进程的属性这个结构体统称为“进程控制块”PCB,使用这个PCB描述进程的属性。一个进程就可以使用一个或多个PCB来表示

2.组织 使用双向链表,把这些表示出来的对象串起来(为了后续增删改查)

系统会使用类似于双向链表这样的数据结构来组织多个PCB。创建新的进程就是创建PCB并且把PCB插入到链表中。销毁进程就是把PCB从链表上删除并释放,展示进程链表,相当于遍历链表的每个节点。

如果想更明确认识进程详细特性,还需要讨论一下pcb里面的属性,PCB是一个庞大的结构体,包含很多属性,(操作系统源码里面有,linux这样的系统属于开源的,可以看到源代码)

linux中,pcb叫做task_struct

PCB里面的信息

一.pid进程的身份标识

每个进程都会有一个pid,同一时刻,不同进程之间的pid是不同的

二.内存指针(描述了进程持有的“内存资源”是啥样的~):

每个进程运行的时候,都会分配一定的内存空间,这个进程,内存空间具体是在哪里,以及分配的内存空间中有哪些部分,每个部分都是干啥的...有这么一组指针来进行区分,最典型的,进程的内存空间,需要有专门的区域存储要执行的指令,以及存储指令依赖的数据~~同时还需要存储一些运行时产生的临时数据。

执行的指令:(C语言程序写的一些代码/函数=>exe包含了一些二进制指令,双击exe系统就会读取可执行文件,将内容加载到内存中。(exe中的数据也是要加载到内存中),cpu才能从内存中取走指令,进一步进行执行指令

(cpu一般不会直接读硬盘,都是从内存里面读取数据。先从硬盘把指令加载到内存中,再让cpu从内存中读取指令)

三.文件描述符表(文件描述符表描述了进程持有的“硬盘资源”是啥样的

(类似于顺序表这样的数据结构,有很多元素)

和文件有关=>硬盘 有关,文件它是存储在硬盘上的,计算机操作硬盘,并不是直接操作硬盘这样的硬件设备,而是把硬盘上面的存储空间,以文件的形式来去进行表示,真正代码里面操作的是文件,实际上硬件上操作的就是硬盘

一个进程也需要涉及到硬盘操作(从硬盘读写数据),就需要按照文件的方式来操作,当前进程关联了哪些文件,都能操作哪些文件,就是通过文件描述符表。去进行表示的。文件描述符表将文件组织,后续的指令就可以在这里针对文件进行操作。

进程持有的cpu资源如何体现?

这个关于进程的调度

什么是并发编程?

早期的操作系统

是一个“单任务操作系统”同一时刻只有一个进程能运行,运行下一个进程,就会退出上一个...不需要考虑调度。

一个进程要执行,就是需要cpu来执行这上面的指令~早期的电脑还是单核cpu,一个cpu核心,同一时刻,只能执行一个进程的指令。

分时复用,并发执行(针对单核cpu):使多个进程在不同时间进行,如果进程在cpu上轮转速度足够快。那么看起来就像是一个cpu在同时进行多个进程。实际上同一时刻还是只执行一个进程。

逻辑处理器:16个,相当于有16个核心来处理进程。

实际上现代cpu都是多核心的,如果两个进程同时在两个cpu核心上,微观上也是“同时执行”,这个情况称为“并行”。快速轮转调度的方式,执行多个进程,宏观上是“同时”进行,微观上有先有后,这个情况称为“并发”

并发和并行,在应用程序这一层,感知不到~都是系统内部完成调度的~

普通程序员平时也不会具体区分并发还是并行,从编程角度来说,底层是并发还是并行,对代码没啥影响。  

因此平时会统一使用“并发”来代指 "并发" 和 "并行" 来。

并发编程包含了并发和并行编程。

多核心cpu时代,并发编程是一个很重要的话题,一个系统中有这么多进程,也就是为了实现并发编程的效果。假设只有一个进程,cpu搞16个核心,也没有什么用。多核心对多任务进行,有着很大的帮助。

PCB中引入了一些属性,用来支持操作系统实现进程调度的效果

四.进程的状态

1.“就绪状态” 时刻准备好去cpu上执行。

两种情况

①进程正在cpu上执行

②虽然进程没在cpu上执行,但是时刻准备着去cpu执行

2.“阻塞状态”

某个进程,某种执行条件不具备,就导致这个进程暂时无法参与cpu的调度执行,比如:进程等待用户的输入...

进程的状态还有许多其他种状态,这些状态不做进一步讨论..以上两个是最重要的两个状态。

五.进程的优先级

操作系统在调度多个进程的时候,并非是一视同仁,有些进程会给更高的优先级,优先调度。

六.进程的上下文(进程的结构)

进程从cpu离开之前,需要保存现场,把当前cpu中各种寄存器的状态,都记录到内存中。等到下次进程回到cpu上执行的时候,此时就可以把保存的这些寄存器的值,恢复回去.进程就会沿着上次执行到的位置继续往后执行。

(用于存档,读档)

cpu中有些寄存器,属于没有特定含义,就只是用来保存运算的中间结果。还有些寄存器,是有些特定含义,特定作用。

1.保存当前执行到哪个指令的寄存器 也叫(程序计数器)

是一个2/4/8字节的整数,这个整数存储的是一个内存地址。程序下一条要执行的指令所在的位置。exe里面就包含了指令和数据 把exe运行起来,操作系统就会把指令和数据加载到内存中(内存地址)CPU就会先从 内存 中取指令,然后再执行指令。初始情况下,程序计数器就指向进程指令的入口(可以当做是main方法)

每次取完一条指令,程序计数器的值都会自动更新,默认情况下,直接指向下一条(顺序执行)但是遇到 跳转类指令(jmp,jcmp,call...),就会被设置成跳转的地址......

2.维护栈相关的寄存器

通过这一组(一般是两个)维护当前程序的“调用栈”

栈,也是一块内存,这个内存里就保存当前这个程序方法调用过程中,一系列的关系。(也包含局部变量和方法参数..)

ebp寄存器始终指向栈底

esp寄存器始终指向栈顶,修改esp的值就可以实现“入栈”/“出栈” 会有push等指令完成上述操作

有了这个 我们才知道一个方法执行完毕之后,回到哪里执行。

3.其他的通用寄存器,往往是用来保存计算的中间结果的,比如程序正在计算一个表达式

10+20+30+40 假设算完10+20后,还没来得及计算后面,进程调度走了,就需要把保存10+20的寄存器的值给备份到上下文中。 10+20的计算结果存储在寄存器中。

一个cpu里的寄存器也没多少(不同cpu不一样)

几十个字节到几百个字节...(数据不多,保存也好保存,恢复也好恢复)

将这些寄存器可以很方便的存储在内存中,

存档:把寄存器的值保存在PCB中,PCB都是在内存中。

读档:等到下次执行,可以再把存在PCB的值恢复到寄存器上。

七.进程的记账信息

通过优先级机制,对不同的进程分配了不同权重的资源,有可能会出现极端情况,所有的资源都给某个进程,其他进程一点都没分配到。

为了防止这种情况发生,记账信息会记录当前进程持有cpu的情况(在cpu执行多久了)就可以作为操作系统调度进程的参考依据。

总结(操作系统对进程的管理):

关于进程,我们知道了进程,指的就是一个跑起来的程序,也就是一个正在执行的任务。它可以完成我们指定的一些实际工作,这样的操作会消耗一定的系统资源,操作系统包含的进程不是一个两个,而是非常多的进程。这时候我们想要操作系统对这些进程进行良好的管理,我们采取PCB:task_struct,来去描述一个进程,再通过双向链表来去组织这些进程,按照这样的一个方式,我们就可以把这些进程进行管理了,此时我们如果想创建新的进程,本质上就是创建新的PCB,再加到链表中,我们想去查看进程链表,就是在遍历这个链表,我们想去销毁这个进程,就是把这个进程的PCB在双向链表中进行删除。

虚拟地址空间:

早期的操作系统,程序员运行时分配的内存就是“物理内存”RAM

 这种物理内存相当于宿舍楼,有很多房间,每个房间都有一个编号,这个编号就相当于内存地址。编写代码时,申请可以进行申请内存,写出bug如果内存访问越界了,那么被称为野指针“未定义行为”。若进程A使用了某块物理内存,如果进程B不小心也使用到了进程A的物理内存,将这块物理内存做了修改,那么此时可能会导致进程A崩溃。因此这样设计不合理。

进程的独立性

操作系统引入“虚拟地址空间”概念,不是直接分配物理内存了,而是分配虚拟的内存空间,操作系统对于内存又进行了一层抽象。

此时进程A和进程B存于虚拟内存。虚拟内存和物理内存通过操作系统存在一个映射关系。进程A操作某个内存的数据,就需要把操作的虚拟地址告诉操作系统,操作系统再把虚拟地址翻译成物理地址,再操作物理地址(有一个类似于hash表这样的映射结构,称为 页表)。翻译的过程中操作系统会进行检查和校验。操作系统会看当前这个虚拟地址能否完成翻译。如果给的虚拟地址是非法的,如:越界访问,系统就能及时发现,并且对当前进程进行处理,不会波及到其他进程。(不会真的对物理内存进行修改)。

这个叫做进程的独立性:每一个进程都有自己的一套虚拟内存空间。不会影响到其他进程。

多个进程相互配合:

如果确实需要让多个进程相互配合,此时就不好操作了,我们引入了新的机制来实现进程之间的通信,“借助一个公共空间,完成数据的交互”

进程之间通信方式(有很多种,主要介绍两种)

1.通过文件.(进程A写这个文件,进程B读这个文件)

2.通过网络(socket).借助网卡

后面详细介绍

1.3 存储器

①内存:速度快,空间小,成本高,掉电后数据丢失

②外存:速度慢,空间大,成本低,掉电后数据不丢失

最近两年,有商家研发出了新的存储介质,同时具备内存和外存的特性

1.4  输入设备:

负责将用户的指令和数据传送到计算机系统

1.5 输出设备:

将计算机处理后的数据和信息呈现给用户的硬件设备

总结

计算机就像个超级快速的处理器,通过执行简单的指令(加、减、复制等),来处理和存储数据。它用电信号来表示和操作二进制数(0和1),通过组合这些操作来实现复杂的任务,比如显示网页、播放视频或运行游戏。输入设备(如键盘和鼠标)提供数据,处理器(CPU)执行程序指令,存储设备保存数据,输出设备(如显示器和打印机)展示结果。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祁思妙想

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值