Java 最初诞生的时候,适用于“嵌入式开发”
后来给网页网页开发逻辑(Java 在进行前端开发),迎来第一波巅峰
后来被微软打压后寻出路,开始做服务器开发(后端开发)和嵌入式开发,并推出三个版本
Java 标准版:J2SE——>JavaSE
Java 企业版:J2EE——>JavaEE
Java 精简版:J2ME——>JavaME
随后 Java 重回巅峰
但随着时代的的进步,新的风暴出现
后端领域:以 PHP 为首的后端开发技术,随着网站规模变大(2010 年后),变得难以适应
移动领域:
之后随后继续寻找出了,第三次达到巅峰,两条腿均成为大哥,Java 一跃冲到编程语言的榜首,霸榜好多年
后端领域:Java 开始逐渐摒弃 JSP 这一套技术,并且 Java 社区中诞生了新的王者,Spring,给 Java 带来了新的春天
移动端开发:JavaME 倒了,新的王者 Android 诞生了(背后是 Google)
到了 2020 年之后,Java 又面临着新的挑战
后端开发:Java 迎来最大的挑战者“Golang”,作者是肯汤姆逊(C 语言之父)
移动端开发:Java 的老板 Oracle 由于眼馋安卓的收益,直接把谷歌告了,因为其用了 Java 进行开发。这导致谷歌感觉很膈应人,之后开始主推 Kotlin 作为安卓的开发语言
计算机最早是运用于军事的
后来冯大佬带队,开发“通用计算机”。后来计算机成了民用重要的支撑
计算机内部大同小异,当前计算机内部构造整体规则就是冯大佬提出的,冯诺依曼体系结构
冯诺依曼体系结构
CPU(看 CPU 是否 nb,就看核心数数量和频率高低)
人类科技的巅峰之作,和氢弹齐名
计算机最核心部分
中央处理单元,完成算术运算和逻辑判断
CPU 主流架构
x86 / x 64 架构
arm 架构
RISC-Ⅴ
CPU 核心参数
核心数
最早的 CPU 都是单核心(CPU 里只有一个人干活),当时 CPU 往更快的速度去卷。需要让 CPU 集成程度更高,包含更多的运算单元才能算得快,因此每个单元体积就得小
既然向下不好卷,就开始横向发展,英特尔率先开始发展多核
目前 Intel 和 AMD 过不了一招,被按着打
频率
一秒执行多少个指令,随着任务量进行动态调整
寄存器
现代缓存往往是三级缓存结构(L1,L2,L3)
某个内存的数据经常使用,寄存器又存不下,就可以放到缓存中
对于 Java 程序员来说,开发程序不会把寄存器和缓存区分得这么细,通常会把他们视为一个整体
缓存如果大了,对于有些场景中性能提升是非常大的
存储器
输入设备
输出设备
这是一个简化版本,真实的 CPU 指令表,比这复杂很多很多
CPU 的基本工作流程
C 语言写好的程序,先编译成可执行文件.exe(包含了这个程序运行时要执行的指令和依赖的数据),进行运行的时候,操作系统会把 exe 加载到内存中
CPU 中有一个特殊的寄存器叫“程序计数器”,保存了接下来要从哪个内存位置来执行指令。在 exe 加载到内存后,程序计数器保存的位置就被系统自动设置好了·
执行指令的三个重要阶段
0010
是操作码,看指令表可知,这是 LOAD A 指令:把后面四位 1110
(换成十进制是 14)操作数这个地址的数据,读取到寄存器 A 中00000000
,程序执行结束[!NOTE] 游戏外挂(射击类重灾区)
- 游戏程序也是 exe,游戏逻辑的指令,也是包含在 exe 文件中,加载到内存中的。
- 有些外挂开发人员分析内存中的指令,找到一些特定的逻辑,进行修改。
- 比如:发现某几个逻辑是控制掉血的,也是就可以写另一个程序,动态修改掉游戏程序对应内存空间里的指令,变成中弹不掉血
- 现在写外挂的主要难度不在于分析指令,而是在于如何绕过游戏公司的“反外挂机制”(腾讯TP)
[!info] “打热补丁“
- 对于 Java 程序员来说,给程序“打热补丁”是一个比较典型的指令级开发场景
- 比如,在做一个服务器开发的时候,这个服务器非常重要,不能重启,但发现服务器存在严重 bug,此时就可以考虑“打热补丁”
- 写的程序的指令是在内存中的,对应的有 bug 的代码,也是其中一段指令,找到有 bug 的代码指令,直接把这里的指令修改成没有 bug 的版本,或者在这个指令前加上跳转指令,让有 bug 的指令不去执行,而是去执行新增的一个正确的指令
下面是一些主流的操作系统,他们之间都是不兼容的
一个操作系统要做很多事情
println("hello world")
println
是一个 Java 标准库中提供的函数,在 JVM 中,为了实现 println
,就会调用操作系统提供的 API 执行(Linux 对应的系统 API 叫做 write)操作系统的组成
主流系统都是用 C/C++实现的
进程(单线程)
进程管理
由于系统上进程较多,才需要管理
描述
组织
例子:
PCB:是一个非常复杂的结构体,里面包含的属性非常多 ^7eb7b0
PID:进程的标识符
内存指针(一组):描述进程依赖的指令和数据在内存的哪个区域
文件描述符表(顺序表/数组):描述了进程打开了哪些文件
进程状态
scanf/Scanner
等待控制台输入的时候会阻塞住,啥时候输入好,啥时候继续执行进程优先级
进程的上下文
进程的记账信息
优先级的加持之下,使不同的进程吃到的资源差异越来越大
操作系统统计每个进程在 CPU 上执行的时间,根据这个来进一步地调整调度地策略
上面四点都是用来支持进程的调度的,和日常开发息息相关。
计算机里的进程很多,且都需要执行,CPU 负责执行,每个核心可以执行一个进程,但其他的怎么办呢? ^87b85a