【JavaEE】(1) 计算机如何工作
一、计算机组成
1、现代电脑有哪些部件
- 主板。(插座,把配件插上去)
- 散热器。(风扇)
- CPU。(中央处理器,整个计算机的算术运算、逻辑判断)
- 内存。(容量小、读写速度快、贵、不是持久化存储)
- 磁盘。(容量大、读写速度慢、便宜、持久化存储)
- 电源。
- GPU。(有些电脑有独立显卡,处理图像、大规模数据计算)
2、通用计算机构成
图灵提出了通用计算机理论。
冯诺依曼带领团队研发出通用计算机雏形,提出冯诺依曼体系结构。
现代计算机的显卡、电源、散热器等都是后来逐渐演化出的。
二、CPU
代码都是在 CPU 上运行的,因此 CPU 是程序员最需要关心的部件。
1、性能指标
任务管理器 >> 性能。
1.1、频率
这个是我电脑 CPU 的实时频率,任务多速度就慢点,任务少速度就快点。频率越高,代表 CPU 一秒内运算的次数越多。10 Hz 表示一秒钟运算10次,1 GHz = 10亿 Hz。
1.2、核心数
CPU 上的运算单元越多,频率就越高。但 CPU 限制了只能那么大,想 CPU速度越快,运算单元更多,那么运算单元需要越来越小,但是不可能无限小。所以 CPU 的频率已经很多年没有大的提升,达到瓶颈。以前的 CPU 只有一个核心(相当于只有一人干活),为了提高 CPU 运算速度,研发出多核心 CPU,再后来英特尔提出“超线程技术”,即一个 CPU 核心有两个逻辑核心(一人打两份工)。
2、指令
编程语言分三大类:
- 机器语言:二进制序列,不同序列代表不同含义。
- 汇编语言:将固定二进制序列转为固定英文单词。
- 高级语言:对一组汇编语言进一步封装为更具描述性的语句。
不同高级语言编写的代码最终都会转为二进制指令在 CPU 上执行:
- C语言:源代码》编译为汇编代码》转为机器代码。
- Java:源代码》编译为字节码(.class)》特定平台的汇编代码》转为机器代码。
CPU 如何执行指令?CPU 设计时,会设计指令表,说明不同二进制序列都有什么含义。CPU 会根据指令表执行指令。下面给出一个虚构的指令表,来演示 CPU 执行指令的流程。
RAM 就是内存(Random Access Memory,随机访问存储器)。寄存器是 CPU 里的临时存储器,运算数据、中间结果、计算结果都临时存在里面,速度比内存还快得多,也很小。一条指令 8 位,前 4 位是操作码,后 4 位是操作数。
比如下图是内存中存储的数据,一个存储单元(一字节)存储一条指令。
(1)执行地址 0 的指令
0010:LOAD_A,把 RAM 中 1110(14) 地址的数据(3)放到寄存器 A:
A寄存器:3
(2)执行地址 1 的指令
0001:LOAD_B,把 RAM 中 1111(15) 地址的数据(14)放到寄存器 B:
A寄存器:3 B寄存器:14
(3)执行地址 2 的指令
1000:ADD,把寄存器01(B)、寄存器00(A)的数据求和,放入寄存器00(A):
A寄存器:17 B寄存器:14
(4)执行地址 3 的指令
0100:STORE_A,将A寄存器的数据写入 RAM 中地址1101(13):
(5)执行地址 4 的指令
0000:程序执行完毕。
以上就是 CPU 执行 3+14 的过程,经过了十几条步骤。
总结:
- CPU 从内存加载指令。
- 每个指令:取指令》解析指令》执行指令。
- 计算的数据必须先放到寄存器中临时存储。
- 最终计算结果必须放回内存。
三、操作系统
前面说的都是计算机的硬件,操作系统是计算机的关键软件。
1、常见的操作系统
五大操作系统:
- Windows
- Linux(我们以后写的是服务器程序,服务器 90% 都是 Linux 系统)
- Mac OS(苹果电脑)
- IOS(苹果手机)
- Android
C语言写的程序,不同操作系统的代码功能一样,但是代码不一样。
Java 因为有 JVM 处理,完全可以在 Windows 上写程序,再放到 Linux 服务器上运行。
2、操作系统的作用
操作系统负责管理硬件设备,给应用软件提供稳定的运行环境(让应用软件不能影响其它的应用运行,大不了让它自己程序崩溃)。
在硬件开发时,会开发对应的驱动程序,它在操作系统内部运行,用于让操作系统理解硬件并管理硬件设备。如果操作系统内部运行的程序崩溃,就会“蓝屏”。
操作系统会用一个个类描述硬件、软件应用(主流操作系统都是 C语言写的,用结构体表示类),并通过一定的数据结构将类组织起来,便于增删改查,管理硬件、应用软件。
3、进程
操作系统管理的资源有很多:CPU资源、内存资源、磁盘资源、网络资源。
进程就是运行的程序(启动一个程序,会创建一个或多个进程),每个进程需要操作系统分配硬件资源,因此,进程是操作系统中资源分配的基本单位。上面所说的类描述,描述的就是进程的关键属性,包装成 PCB(process controll block)进程控制块。而组织的数据结构,最典型的是链表。
- 创建进程:创建 PCB,插入链表。
- 销毁进程:从链表上删除 PCB,并释放。
- 查看任务管理器的进程列表:遍历链表,打印每个 PCB 属性。
4、PCB 中的关键属性
4.1、PID
进程的 id,同一机器同一时刻唯一。
4.2、内存指针(内存资源)
说明分配给进程的内存的分区,哪里存放指令,哪里存放数据。
外挂就是通过修改进程的内存中的指令实现的。
4.3、文件描述符表(磁盘资源)
磁盘资源在操作系统上是以文件的形式管理的,一个进程可以打开多个文件,每个文件都有文件描述符,相当于文件的 id,多个文件描述符就被管理在顺序表中,构成文件描述符表。
进程通过进程调度分配 CPU 资源。我的电脑上大概有两百多个进程,但只有 12 个逻辑处理器。如何同时运行这么多进程?
操作系统执行中,并行、并发两种模式同时存在。
- 并行:两个核心运行两个进程。
- 并发:一个核心“分时复用”,同时运行多个进程。因为进程间切换速度太快,所以该“串行”由人眼感觉到的是“同时”运行的。
以下讲的就是进程调度,需要的 PCB 属性。
4.4、状态(CPU 资源)
进程的状态最主要的是:
- 就绪态:随时可以被调度到 cpu 的进程、正在运行的进行。(主流操作系统,没有运行和就绪之分,统称就绪态)
- 阻塞态:暂时不方便被调度到 cpu 的进程。
4.5、优先级(CPU 资源)
优先级高的多分配 cpu 资源,优先级低的少分配。
4.6、上下文(CPU 资源)
进程运行到一半,计算的中间结果(cpu 寄存器中的数据)需要保存到内存中的 PCB 中的上下文属性中,进程恢复运行时,再把中间结果加载回 cpu 寄存器。
4.7、记账信息(CPU 资源)
记录进程过去在 cpu 上一共执行了多久/多少条指令,以便找出太久没在 cpu 上运行的进程。
5、进程间通信
Java 中不鼓励多进程编程,实在要用,也只用一种进程间通信机制:网络。
网络不仅支持同主机的两个进程间通信,还支持同一个网络内的不同主机上的进程通信。
6、线程
线程是轻量级进程。进程的创建和销毁都有开销(需要申请和释放系统资源)。而同一个进程内的所有线程都是共享一个进程的资源,因此,进程是操作系统资源分配的基本单位,线程是操作系统 cpu 调度的基本单位。除了同一个进程中的第一个线程会随着进程申请系统资源,剩下的线程都不需要。
线程满足了两个要求:
- 实现并行、并发。(同一个服务器能处理多个客户端的数据请求)。
- 更轻量、高效(网络的发展,上网的人越来越多,服务器要处理的客户端请求越来越多)。