Java EE:1.计算机是如何工作的(第二弹)

Java EE:1.计算机是如何工作的(第二弹) 目录现代CPU关心的指标与日常开发密切相关的1.CPU的频率①基频/默频②睿频/加速频2.CPU和核心数CPU发展历程CPU执行程序指令的过程理解一段指令一段程序是如何执行的划重点操作系统Java语言的便捷闲聊CPUCPU是技术含量非常高的设备发展速度非常快大学中的一些课程与之相关比如①微机原理与接口技术②计算机组成原理其中一部分是讲CPU③计算机系统结构计组进阶课主要内容讲CPU④汇编语言⑤甚至模电、数电、大学物理也与之有关联~但是以上内容讲的大多都是8086CPU现代CPU的老祖宗是上个世纪80年代左右设计的一代经典CPU但是跟现代CPU相比差别是非常大的~著名行业①intel英特尔CPU行业的巨头之一②amd现在最牛的CPU厂商intel的市值只有amd的一半左右~这两个厂商的CPU专注于PC笔记本台式机和服务器③高通其CPU专注于移动设备手机平板除了以上三个主要的还有些小型的比如联发科、苹果、华为、龙芯……其中苹果的CPU主打的是省电能耗比比较高但大多是6核12线程就论性能的话amd、intel遥遥领先~现代CPU关心的指标与日常开发密切相关的1.CPU的频率①基频/默频1Hz表示1s多少次1GHz相当于1s计算10亿次闲聊人脑1s算几次就很不错了~但计算机能1s算几十亿次人类历史上第一台计算机埃尼阿克的频率是5000Hz现代计算机已经今非昔比了~②睿频/加速频睿频有上限的睿频是现代CPU的一个特性动态的根据当前任务量进行频率变更类似于变频空调周围温差大空调工作效率就高能够快速降温耗电量也大2.CPU和核心数内核1420线程表示6个大核8个小核表示6个物理核心16个逻辑核心物理核心真实干活的人逻辑核心实际上这些人能同时干几个活线程简单说就是要干的活CPU核心数越多CPU就越牛CPU干活效率越高CPU发展历程①追求频率最开始2008年之前的CPU都是单个核心的当时研发新的CPU就是努力提高CPU的频率~②追求构造频率提高到一定程度发现提高不上去了~CPU内部构造非常精密里面有数不清的小的计算单元电路元件计算单元越多算的就越快但是一个CPU的面积固定要想让计算单元多单个计算单元就得小但是也不能不限小因为小到一定尺度经典物理学就失效了进入到量子力学的范畴了当时的CPU都是号称4nm制程、5nm制程、7nm制程~那为啥不把CPU面积变大一点也是有的比如说服务器的CPU就面积很大但也不能大很多因为面积越大生产过程中的良品率就越低成本越高③追求技术单个核心既然已经达到瓶颈干脆引入两个核心来工作→多核心技术intel认为这还不够于是研发出了“超线程技术”让一个CPU核心顶两个于是一个CPU上就有了4个核心~目前intel自废武功从12代开始提出了“大小核”技术体系大核一个顶俩小核一个顶一个但是从14代以后根据媒体曝光的消息下一代intel已经取消了超线程技术~amd则全是大核~比如9000系列④追求多核心当前CPU往多核心角度发展也对程序员提出了新的要求多个核心就是多个牛马干活程序员写代码的时候就需要把任务拆分成多个部分交给多个牛马让他们来干如果你的代码没有把任务分好就会出现“一核有难多核围观”所以我们需要多线程来充分利用好“多核心”CPUCPU执行程序指令的过程汇编语言分成三个大类1.机器语言以二进制的形式表示的一种编程语言2.汇编语言3.高级语言C、Java~CPU上面都支持哪些指令每个指令怎么表示有哪些意义……都是CPU设计出来的时候就确定了下面用咱们自己编的一个“简化版本”指令表进行讲解真实的一条指令是8个字节64个bit位~此处咱们约定一条指令是1个字节8个bit位方便理解~一条指令4位操作码opcode4位操作数操作码≈函数名操作数≈函数参数opOperationcode码解释一下其中涉及到的陌生知识1.内存地址这属于C语言的基本功了~把内存想象成一个宿舍楼有一个长长的走廊走廊上有很多宿舍房间就给每个房间都分配了一个门牌号从0开始顺序的、连续的依次累加~这个房间的门牌号称为“房间地址”“内存地址”如果在C语言中定义一个变量保存上述内存地址这个变量就称为“指针变量”2.寄存器也是存储数据的模块长在CPU身上CPU通过寄存器存储数据断电之后数据也丢失现代一个CPU上不止一个寄存器大概有几十个~访问速度寄存器内存存储空间寄存器内存成本寄存器内存作用主要在CPU执行指令进行各种运算的时候在存储临时数据起到一些辅助效果闲聊cache是介于寄存器和内存之间的存储设施也是集成在CPU上的闲聊1.看看数据结构的知识你还记得多少①二叉搜索树查询元素时间复杂度是多少O(N)谈到时间复杂度如果不明确指出默认就是最坏情况②计算机中一个汉字占几个字节取决于字符集汉字是怎样编码的1GBK中国大陆上曾经广泛使用的一个汉字占2个字节Windows 10/11 简体中文版默认GBK使用VS写代码打印汉字strlen结果是22UTF-8当下全世界最流行的编码方式一个汉字占3个字节UTF-8本身是变长编码1~43unicodeJava的char就是使用unicode一个汉字占2个字节Java的String可就不一定嘞~2.什么是句柄Java程序员不需要关注这些~~句柄本身是计算机中的一个通用术语但是用的最多的是Windows API中Windows提供的系统函数Sleep这种需要#includeWindows.hWindows系统内核中提供很多资源可以让你程序员来使用但是直接使用不太好操作需要通过一种方式“间接的操作”这个就是句柄~简单来说就是代码中通过句柄来间接操作内核中的某个资源~比如遥控器是电视的句柄、三国演义中挟天子以令诸侯的曹操和董卓天子就相当于“天下”的句柄~在Windows API中申请某个资源调用API产生对应资源的句柄后续针对资源操作调用其他函数把句柄当作参数传进去用完了再关闭这个句柄~句柄也是有上限的不能无限申请理解一段指令一段程序是如何执行的划重点CPU执行指令的流程1.读取指令2.解析指令对照指令表理解指令含义3.执行指令机器语言程序二进制指令以下面两个图为例进行模拟计算314的过程假设CPU从0号地址这里开始执行指令执行详细流程以上过程中CPU内部有专门的寄存器负责保存读到的指令~并且寄存器不会主动释放计算过的数除非是你用一个新的指令重复写入这个寄存器把值给覆盖掉~注意大家不需要精准掌握上述的每个过程的细节通过上述例子大家需要知道以下3个概念即可①指令②寄存器③CPU执行指令的大概过程闲聊有同学可能认为上述内容距离Java程序员太远~并非如此~~1.后续学习多线程、理解线程安全问题~务必站在指令的角度CAS等相关操作~指令级别的操作~2.后续工作中可能有这样的一个场景生产环境你的服务器有一个严重BUG但是现在服务器程序还不能重启~如何给一个正在运行的程序进行修复BUG这个操作就相当于给一个正在飞的飞机修理发动机~再举个例子心脏外科手术~外科手术的巅峰之作因为你不能让心脏让停下来~医学后来发明了体外循环术核心思路热不重启补丁一个服务器程序本质上就是内存的一段指令CPU正在执行这段指令完成各种功能~我们只需要找到这段指令出现BUG的代码对应再内存指令中的位置然后把这个指令给修改掉比如再这里插入一个跳转指令让程序执行到这个指令的时候跳转到内存中的另外一段已经修复过BUG的指令进行执行~3.外挂外挂程序的原理就是上述说的这个热补丁的原理操作系统操作系统计算机中最重要的“软件”①Windows 11/10②Linux官方认可的发音“李娜克斯”在程序员圈子中非常重要~后端开发、服务器使用的系统一般都是Linux嵌入式设备Linux也是主力系统Windows Server版本~市场占有率非常低③Mac OS苹果电脑上面的系统“不坑穷人系列”④IOS苹果手机系统和Mac OS不一样~⑤Android当前市场上最多的系统包括一些高配置一点的嵌入式系统也开始使用安卓~Java语言的便捷上述系统彼此之间是不兼容的~像C别说WindowsLinux哪怕是Linux的不同版本之间都可能会有很繁琐的调整过程当前把程序Redhat 5Redhat 6Linux版本的升级都花了半年左右时间主要就是API不兼容系统函数而Java有个很好的优势跨平台~写一份Java代码不用做任何修改在另一个系统上就能有完全一样的功能~咱们以后开发虽然程序都是部署到Linux上运行但是开发阶段就在Windows上开发是毫无问题的~本质原因就是Java虚拟机~大佬设计Java时给各种主流系统都分别开发了Java虚拟机~Windows有Windows JVMLinux有Linux JVM这些JVM其实是不同的程序只不过上层支持的Java字节码是一致的~如果在新的系统上运行就需要给这个新系统开发一套新的JVM然后Java才能支持~闲聊1.Windows和Linux区别最直接的区别这俩系统提供的API系统函数截然不同你写一个程序在Windows上能跑放到Linux跑不了Windows Sleep(ms)#includeWindows.hLinux sleep(s) usleep(us)#includeunistd.h使用Windows一般都是使用图形化界面操作使用Linux一般都是命令行操作命令Linux也有图形化界面但开发中一般不使用图形化界面降低门槛各年龄段的人都能用、命令行界面才是生产力工具~2.安卓用久了会卡苹果用久了也不卡不是缓存垃圾的原因因为缓存垃圾是消耗硬盘空间而卡不卡是CPU的事情根本原因是具体的应用来的~苹果对于应用程序的审核非常严格如果应用程序里做一些流氓操作根本没法上架的~而安卓程序开发者可以写很多“流氓功能”B站、斗鱼~618的时候打开B站就有一个“摇一摇广告”小鸟壁纸则更是流氓软件的集大成者~