大家好,我目前在学习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)。
又叫中央处理单元,它是人类当今科技领域中的巅峰之作之一。能早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:垃圾佬:他们通过低价买一些性能还能打的硬件设备,组装出性能还不差的主机~~
①主频:假如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工作流程所要用到的部件
电子开关
通过电子开关,我们可以实现 1 位(bit) 的逻辑运算
门电路:包括与门、非门、或门、异或门等等。
ALU 是计算机中进行算数、逻辑运算的核心部件,是计算机的数学大脑。
我们可以通过连接电子开关、门电路、算术逻辑单元ALU
算数单元,负责计算机里的所有数字操作,比如四则运算,当然它能做的远远不止这些。
比如8 位(bits)的加法器
逻辑单元(Logic Unit)
逻辑单元主要用来进行逻辑操作,最基本的操作就是 与、或、非操作,但不只是一位(bit)数的比较。
光有 ALU 还是远远不够的,我们无法为 ALU 提供存储的部件。利用门电路可以制作存储器。不过这些存储都是要求必须保持通电状态的,也就是这些存储都是易失的(volatile)。
下面简单说一下简单说明 下存储的制作。
中间我们隐藏了一些实现细节,最后的效果就是:使能线置位时,输入为 1,保存 1;输入为 0,保存 0。使能线不置位时,则写入无效。 我们可以利用门锁,构建我们需要的寄存器和内存。
内存的构建要比这个复杂一点,但基本原理一致。如此构建的内存被称为 RAM(Random Access Memory),可以支持 O(1) 时间复杂度访问任意位置的数据,这也就是我们数组下标访问操作是 O(1) 的硬件支持。
上面的说明都隐藏了大量的实现细节 。感兴趣的朋友可以进行深入了解。
我们现在有 ALU、存储了,但这还是不足以让我们的计算机工作起来,我们需要有一个部件来指挥 ALU 进行何种的运算,而这个部件就是控制单元(CU)。
CU 如何由门电路从无到有搭建,我们就进行抽象了,我们只需要理解 CU 可以驱动 ALU 进行具体 的计算工作
指令(Instruction)
我们知道CU 可以驱动 ALU 进行具体 的计算工作。
我们先介绍下我们需要到的指令(instruction)。 指令是cpu上能够执行的任务的最小单元
所谓指令,即指导 CPU 进行工作的命令,主要有操作码 + 被操作数组成。
其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。
指令本身也是一个数字,用二进制形式保存在内存的某个区域中。
比如:加法指令,读取内存指令,写入内存指令,条件判定/跳转指令,函数调用指令,堆栈操作指令......
最小单元由二进制的方式来表示叫做机器语言
不同架构的cpu支持的指令/机器语言是不相同的。
演示指令运行的一个周期。
总结指令的运行周期。
当然,电子计算机中的 CPU 可不像我们刚才那样,靠自己来驱动这个周期的运转,而是靠背后一个时钟 来进行周期驱动的。
粗略的讲,cpu主频就是时钟震荡的每秒次数。可以近似看作每秒执行的次数
最后,ALU + CU + 寄存器 + 时钟就组成了我们平时经常看到的一个词汇:
1. CPU 中的 PC 寄存器,是决定 CPU 要执行哪条指令的关键; 2. 指令是由 动作 + 操作对象组成 3. CPU 眼中只有指令,没有其他的概念
Windows10
Windows11
linux
mac os
android
ios
这些操作系统,本质上都是用来搞管理的软件
注意:有的数据库/虚拟机软件支持在裸机上跑...程序内置了一个操作系统,这种另当别论。
1.对下管理所有的硬件设备 操作系统知道市面上硬件设备就那么几个大类,每个大类别下面的硬件设备大概都有哪些功能~硬件厂商需要在开发硬件的时候同时开发一个驱动程序(软件)专属于这个硬件设备,让操作系统通过这个驱动程序完成对这个硬件设备的控制 2.对上要给软件提供稳定的运行环境 进程的隔离性:一个计算机可以同时运行多个程序,这些程序各自独立运行,不会互相干扰,防止如果每个程序出现bug,就直接导致系统重启,其他程序崩溃。
操作系统给应用程序提供一些API ,让应用程序去调用, 实现操作系统一些功能,比如 就可以控制一些硬件设备
是操作系统最核心的功能模块。硬件的驱动程序,都是在系统内核中执行的。内核需要给很多应用程序提供支持,提供API进行调用。此处这些系统api都被JVM封装好了,因此java程序员一般不会直接接触到系统的api~。
java具有跨平台性,不同的系统提供的api是不同的,JVM对这些系统api就封装了(类似于JABC)
内核态
用户态
一个程序在运行过程中,可能是在用户态工作,也可能是在内核态工作。
一个操作系统=内核+配套的应用程序
操作系统内核中涉及很多关键性概念,进程只是其中一个,此处重点就只讨论进程
指正在运行,已经跑起来的程序。windows这个操作系统,一开机就有百八十个进程跑起来,有些是系统自动创建的,有些是手动创建的。每个进程都是系统资源分配的基本单位。
进程在系统中如何进行管理
1.描述 使用类/结构体PCB ,把被管理的一个对象,各个属性表示出来 系统中专门有一个结构体(操作系统内核是使用c/c++写的)描述进程的属性这个结构体统称为“进程控制块”PCB,使用这个PCB描述进程的属性。一个进程就可以使用一个或多个PCB来表示 2.组织 使用双向链表,把这些表示出来的对象串起来(为了后续增删改查) 系统会使用类似于双向链表这样的数据结构来组织多个PCB。创建新的进程就是创建PCB并且把PCB插入到链表中。销毁进程就是把PCB从链表上删除并释放,展示进程链表,相当于遍历链表的每个节点。
如果想更明确认识进程详细特性,还需要讨论一下pcb里面的属性,PCB是一个庞大的结构体,包含很多属性,(操作系统源码里面有,linux这样的系统属于开源的,可以看到源代码)
linux中,pcb叫做task_struct
一.pid进程的身份标识 每个进程都会有一个pid,同一时刻,不同进程之间的pid是不同的 二.内存指针(描述了进程持有的“内存资源”是啥样的~): 每个进程运行的时候,都会分配一定的内存空间,这个进程,内存空间具体是在哪里,以及分配的内存空间中有哪些部分,每个部分都是干啥的...有这么一组指针来进行区分,最典型的,进程的内存空间,需要有专门的区域存储要执行的指令,以及存储指令依赖的数据~~同时还需要存储一些运行时产生的临时数据。 执行的指令:(C语言程序写的一些代码/函数=>exe包含了一些二进制指令,双击exe系统就会读取可执行文件,将内容加载到内存中。(exe中的数据也是要加载到内存中),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).借助网卡 后面详细介绍
①内存:速度快,空间小,成本高,掉电后数据丢失
②外存:速度慢,空间大,成本低,掉电后数据不丢失
最近两年,有商家研发出了新的存储介质,同时具备内存和外存的特性
负责将用户的指令和数据传送到计算机系统
将计算机处理后的数据和信息呈现给用户的硬件设备
计算机就像个超级快速的处理器,通过执行简单的指令(加、减、复制等),来处理和存储数据。它用电信号来表示和操作二进制数(0和1),通过组合这些操作来实现复杂的任务,比如显示网页、播放视频或运行游戏。输入设备(如键盘和鼠标)提供数据,处理器(CPU)执行程序指令,存储设备保存数据,输出设备(如显示器和打印机)展示结果。