前言:
大家好,我目前在学习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 输出设备:
将计算机处理后的数据和信息呈现给用户的硬件设备
总结
标签:计算机,JavaEE,CPU,----,指令,内存,进程,cpu,操作系统 From: https://blog.csdn.net/m0_73456341/article/details/132719769计算机就像个超级快速的处理器,通过执行简单的指令(加、减、复制等),来处理和存储数据。它用电信号来表示和操作二进制数(0和1),通过组合这些操作来实现复杂的任务,比如显示网页、播放视频或运行游戏。输入设备(如键盘和鼠标)提供数据,处理器(CPU)执行程序指令,存储设备保存数据,输出设备(如显示器和打印机)展示结果。