JavaEE---计算机是如何工作的?

发布于:2024-11-28 ⋅ 阅读:(14) ⋅ 点赞:(0)

1.了解冯诺依曼体系结构

2.CPU的核心概念,CPU的两个重要指标(核心数和频率)

3.CPU执行指令的流程(指令表,一条一条指令,取指令,解析指令,执行指令)

4.操作系统核心概念(管理硬件,给软件提供稳定的运行环境)

5.进程的概念(运行起来的程序和可执行文件的区别)

6.进程的管理(PCB,链表)

7.进程的调度(状态,优先级,上下文,记账信息)==>并发,并行

1.冯诺依曼体系结构

冯诺依曼体系结构由:输入设备,存储器,CPU,输出设备构成

现在的计算机大都遵循冯诺依曼体系结构

CPU中央处理器:进行算术运算和逻辑运算

存储器:分为外存和内存,用于存储数据(使用二进制方式存储)

输入设备:用户给计算机发号施令的设备

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

针对于储存空间来说:

        硬盘>内存>CPU

对于数据访问速度来说:

        CPU>内存>硬盘

对于价格来说:

        CPU>内存>硬盘

对于掉电后数据丢失来说,

        CPU,内存都会丢失

        硬盘不会丢失数据

2.CPU的核心概念

上面我们说了CPU用于算术运算和逻辑判断.

CPU市面上的常见架构有:

        1.X86/X64(桌面端/服务器)

        2.arm(移动端/嵌入式)

        3.Risc-V

CPU的核心参数有核心数和频率

核心数有各种名词,比如大小核,四核八线程(超线程技术)等等

多任务处理能力会随着核心数的数量而提高,随之功耗会提高,对散热有一定的需求

任务管理器中可以查看,图上的一个个小块就是每个核心

频率也可以在上图看出

基准速度就是标准的频率,可以模糊理解为一秒钟可以执行24亿条指令

这个是当前实际的频率

指令可以称为机器语言(二进制语言)也可以称为是汇编语言

不同的CPU支持的指令是不同的,X86上的指令和arm是不互通的(兼容性问题)

(m1后,Mac用的是arm架构,为了更长的续航)

寄存器是CPU内部存储数据的部分

成本高,访问速度比内存快,空间小,断电后会丢失数据

CPU中存在缓存,如果需要用的数据但寄存机空间不够或者常用的数据会存放在缓存中

可以看出缓存是三级结构

L1缓存空间小,读取数据速度最快

L3缓存空间大,读取数据速度最慢

3.CPU执行指令的流程

所谓指令,即指导 CPU 进⾏⼯作的命令,主要有操作码 + 被操作数组成
其中操作码⽤来表⽰要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。
指令本⾝也是⼀个数字,⽤⼆进制形式保存在内存的某个区域中。
这里展示的指令为8bit位的
前4bit位为opcode,操作码,后4位为操作数

CPU存在一个特殊的寄存器---"程序计数器"

保存了接下来要从哪个内存位置来执行指令,默认从0开始,一般执行结束会自增(没有循环条件判断等)会自动+1,遇到数据为0000000就停止,这些都是系统自动设置好的

指令集的三过程:

        1.取指令

        2.解析指令

        3.执行指令

这里给大家简单分析下上面图片

第一步:

刚开始,程序计数器默认从0开始读取,读到的数据为00101110(取指令)

0010是将1110这个地址的数据存入A寄存器中(上图有操作数的详情),1110代表的地址是14(解析指令)

而第14的地址数据为00000011,转化为十进制是3,所以是将3存入到A寄存器中(执行指令)

第二步:

程序计数器自增到1,读取的数据为00011111(取指令)

0001是将1111这个地址的数据存入B寄存器中,1111代表的地址是15(解析指令)

而第15的地址数据为00001110,转化为十进制是14,所以是将14存入到B寄存器中(执行指令)

第三步

程序计数器自增到2,读取的指令为10000100(取指令)

1000是将两个寄存器的数据相加,结果放在第二个寄存器中,(解析指令)

0100表示将寄存器A和B的值相加,00表示A,01表示B结果放在A中(执行指令)

第四步程序计数器自增到3,读取的指令为01001101(取指令)

0100表示将数据从A寄存器放入内存地址中(解析指令)

1101的数据是7,也就是将3和14相加的结果放入到7号地址中(执行指令)

第五步,读取到00000000,结束指令

以上的步骤就是很简单的两个数据相加的过程

指令集开发的场景一个是写外挂(违法行为),一个是给程序打"热补丁"

因为程序运行时,除了重启时间,大部分是没法强制重启的,这时候需要打一个热补丁将对程序数值或者错误的地方进行修改

4.操作系统核心概念

操作系统,常见的操作系统有:Windows,Linux,MacOS,Android,Unix,iOS,鸿蒙等

操作系统的分层视图

操作系统的功能:

1.管理不同的硬件

2.为软件提供稳定的运行环境

操作系统通过程序驱动间接的操作硬件

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

操作系统的内核=操作系统核心功能集合

5.进程的概念

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程

在操作系统内部,进程又是操作系统进行资源分配的基本单位

C语言编写的exe文件是可执行文件,当它被打开后被读取到内存中了才被称为进程

6.进程的管理(PCB,链表)

进程控制块抽象(PCB/Process Control Block)

计算机内部要管理任何现实事物,都需要将其抽象成⼀组有关联的、互为⼀体的数据。描述的时候需要有以下信息
进程之间是通过链表结构穿起来的,方便对进程实现增删改查
1.pid进程标识符
        同一时刻,应该机器上的多个进程之间,PID唯一的,不会重复,操作系统内部的很多操作都是通过PID找到对应的进程的
2.内存指针(一组)  侧面表示出,进程的执行需要一定的内存资源
        描述进程依赖的指令和数据都在内存的哪个区域
        操作系统运行exe,就会读取exe中的指令和数据,加载到内存中,(内存地址)
3.文件描述符表(顺序表/数组)    侧面表示出,进程的执行需要一定的硬盘资源
        描述了进程打开了哪些文件(对应硬盘上的数据)
        进程中打开了某个文件,就会在顺序表中添加一项

7.进程的调度(状态,优先级,上下文,记账信息)==>并发,并行

4.进程的状态

进程状态有就绪状态和阻塞状态等:

1.就绪状态:进程是可以随时被调度到CPU上执行指令的

2.阻塞状态:进程是无法被调度到CPU上执行,之所以阻塞是因为要做一些其他的工作,比如进行IO操作(读取硬盘/读写网卡)

除了上面之外,进程还有其他的状态,此处暂时不展开这么多

已经过的代码中,大部分不会产生阻塞的,有一个典型的代码会引起阻塞

从控制台读取输入(等待IO产生的阻塞),代码执行到这样的语句时,代码就"卡住了"

分时复用:

单核处理器下,这个时候CPU运行进程1,运行一会cpu运行进程2,过一会运行进程3

由于CPU运行的速度非常快,使上述的切换速度也非常快,肉眼察觉不到

站在宏观角度上(人),同时执行,"并发执行"

现在有了多核心CPU,此时每个核心之间,微观上能同时执行不同的进程

"并行执行"

并发/并行,都是操作系统内核统一调度的,程序员/普通用户,站址不到

因此,平时把并行和并发统称为"并发",对应的编程手法也就称为"并发编程"

5.进程的优先级

有的进程先执行,有的进行后执行

6.进程的上下文

把之前执行的中间结果(各种CPU寄存器中的值)保存起来,以备下次使用

7.进程的记账信息

操作系统统计每个进程在CPU上执行的时间,根据这个来进一步调整调度的策略