• 【JavaEE】计算机是如何工作的



    【补充】数据库

    辛苦 当然辛苦啊! 谁不辛苦呢

    1. ① RDBMS 是SQL 的基础,同样也是所有现代数据库系统的基础,比如MS SQL Server, IBM DB2, Oracle, MySQL 以及Microsoft Access。
      ② hadoop是分布式数据库。
    2. mysql返回值相关

    ① count(*) 返回的是表的行数,如果是空表返回的是0,而不是null;
    ② max(列名) 返回的是该列的最大值,如果该列为空,返回的就是null;
    ③ MySQL concat函数使用方法:
    CONCAT(str1,str2,…)

    返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

    1. 容易引起oracle索引失效的原因很多:

    1)在索引列上使用函数。如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了。
    (即:使用了索引之后再使用了函数且没有建立索引函数,那么该索引就失效)
    2)新建的表还没来得及生成统计信息,分析一下就好了
    3)基于cost的成本分析,访问的表过小,使用全表扫描的消耗小于使用索引。
    4)使用<>(不等于)、not in 、not exist,对于这三种情况大多数情况下认为结果集很大,一般大于5%-15%就不走索引而走FTS。
    5)单独的>、<。
    6)like “%_” 百分号在前。
    7)单独引用复合索引里非第一位置的索引列。
    8)字符型字段为数字时在where条件里不添加引号。
    9)当变量采用的是times变量,而表的字段采用的是date变量时;或相反情况。
    10)索引失效,可以考虑重建索引,rebuild online。
    11)B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走、联合索引 is not null 只要在建立的索引列(不分先后)都会走。


    简介

    1. 【javaEE】主要目标就是做出一个网站
    • 一个网站= 前端(客户端,浏览器运行的网页)+后端(服务器,公司机房部署的程序——java主要进行的工作)
    • 了解:① 后端:java,C++,Go,Python,PHP,Ruby,C#,… --> 竞争关系
      ② 前端:HTML(页面结构),CSS(页面样式),JavaScript(页面逻辑) --> 合作关系
    • java主要用于: ①嵌入式开发:功能手机(如 诺基亚)app开发 J2ME
      ②服务器开发:后端 J2EE
      (但是2007年乔布斯发布苹果手机,智能手机上位,功能手机逐渐淘汰)
    1. 计算机 祖师爷:图灵(理论)、冯诺依曼
      (1946年出现 第一台电子管计算机——埃尼阿克)
    2. 内存RAM可以支持 O(1) 时间复杂度访问任意位置的数据
    3. 控制单元CU 驱动 算术逻辑单元ALU 进行计算
    4. 指令,即指导 CPU 进行工作的命令,主要有操作码 + 被操作数组成
    5. 小结:

    ① CPU 中的 PC 寄存器,是决定 CPU 要执行哪条指令的关键;
    ② 指令是由 动作 + 操作对象组成
    ③ CPU 眼中只有指令,没有其他的概念

    1. 程序 = 指令 + 指令要处理的数据
    2. 高级语言的一条语句(Statement)往往对应很多条指令(Instruction)才能完成。
    3. CPU分配:时间; 内存分配:空间。
    4. 目前,主流操作系统提供的进程通信机制有如下:

    ① 管道
    ② 共享内存
    ③ 文件
    ④ 网络
    ⑤ 信号量
    ⑥ 信号
    其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。


    一、CPU、门电路及编程语言

    1. 计算机的构成:(冯诺依曼体系结构)
      CPU、存储器(内存、外存)、输入设备、输出设备

    2. CPU中央处理器:计算机最核心的部分,用于进行算术运算和逻辑判断。
      ① CPU是人类当前科技的巅峰之作,能够和CPU相提并论的只有氢弹。但是其实CPU原理本身不难,难的是CPU的工艺,集成程度高,元件极小,一般都是使用激光进行刻蚀的
      ② 【CPU最核心的一个指标:主频
      –> (Hz:频率,即1s能够做/计算几次/时钟周期 G=10^9)
      ③ CPU这类芯片,从诞生之初到现在一直是按照“指数规律”发展的,这种规律叫做“摩尔定律”
      (摩尔是Intel的副总裁,联合创始人之一;提出“每隔18个月,芯片集成度提高一倍,运算速度提升一倍,成本降低一半”))
      ④ CPU主要就是去执行指令的,而程序员编写的程序最终就会变成指令在CPU上执行

    3. 以C语言为例: .c源文件 使用编译器编译生成 可执行文件.exe文件
      –> .exe文件是存储在硬盘上的;当双击该程序的时候,操作系统就会把可执行文件加载到内存中。该文件中包含了 程序要执行的指令 以及 指令所依赖的数据
      ——注:点击.exe文件其实只是把exe文件执行起来,指令从硬盘到内存,CPU并 没有 真正开始执行指令。

    4. CPU如何执行指令?
      ① CPU把内存中的指令读取到CPU中:CPU内部也有能存储数据的单位,称为寄存器;所以寄存器存储从内存中读取到的指令、数据
      ② CPU解析指令:内存中存储的指令都是二进制的序列,解析就是去翻译这些指令。
      ③ CPU执行指令:真正按照指令的安排来进行计算
      —— 简单粗暴的认为,以上的每一个操作都至少消耗一个时钟周期)
      (CPU为了进一步提高执行指令的效率,还会引入“流水线”式作业。)

    5. CPU基本工作过程:
      1)主频:描述了1s有多少个时钟周期(近似看成是1s执行多少个指令)
      2)执行程序的过程:硬盘=> 内存=> CPU => 解析指令=> 执行指令
      3)Java程序也是类似C语言一般:.java => .class => JVM读指令、解析指令、执行指令 => 转换成CPU能认识的二进制指令
      (不同的CPU支持的指令是不一样的,因为CPU的架构体系有差别
      ——如:平时电脑CPU一般是x86架构; 手机上使用的一般是ARM架构; 另外,还有一些MIPS架构)
      4)汇编语言其实是等价于机器指令的,汇编语言和机器指令是一一对应的关系。机器指令是二进制的,而一长串二进制序列不方便看就使用一些简单的单词来替代,而简单的单词就构成了汇编语言。

    6. CPU如何构成?
      CPU上面包含着非常多的“门电路”。这些门电路都是通过半导体元件构成的。
      (CPU就是无数这些基础门电路的组合)
      cpu 门电路
      (注:半加器、全加器都有 进位、和 两个输出位)

    7. 编程语言
      1) 无论是哪种高级语言,都是要转换成CPU能够识别的指令的。
      但是:不同的高级语言支持的语法不一样,编译器也不一样,导致转换生成的CPU指令也不一样; 不同的高级语言在完成同样的工作的时候所消耗的成本是不一样的
      2)编程语言梯队:
      ① 第一梯队:C、C++执行效率极高:主要应用场景就是对性能要求比价高的场景,如:操作系统内核、游戏引擎、搜索引擎、性能要求较高的服务器、嵌入式设备、人工智能(注意:人工智能的核心逻辑都是C++写的,为了使用方便,很多C++编写的组件都提供了Python风格的API;当然,使用别的语言也是可以调用的)
      ② 第二梯队:JAVA、Go、Rust…
      ③ 第三梯队:Python、PHP、JS… 这些语言不是追求运行效率,更看重的是开发效率
      (相较于运行效率,开发效率更重要,因为人力成本远大于机器的硬件成本)


    二、操作系统

    1. 操作系统:是一个搞管理的软件:对下能够管理各种硬件设备,对上能够给软件提供稳定的运行环境。

    2. 平时常见的操作系统:Windows、Linux(一般用于服务器和嵌入式设备)、Mac OS --> PC
      IOS、Android(本质上是Linux) -->手机端

    3. 计算机系统:(由下至上)硬件、驱动、操作系统内核、系统调用、应用程序。
      而 (驱动、操作系统内核、系统调用) 又是操作系统的范畴
      ① 操作系统内核:实现了操作系统最核心的功能,如:内存管理、硬盘管理、进程管理、设备管理、文件管理等
      ② 系统调用:操作系统提供的API,通常也是C风格的;应用程序需要调用这里的API才能完成一些具体的工作
      ③ 驱动:在设计操作系统内核的时候很难做到能够识别全部的硬件,此时就需要靠驱动程序让系统内核认识且管理硬件。
      (驱动程序,其实也是一个软件,而这个软件是由硬件产商提供的)


    三、进程

    1. 进程也叫做任务;一个跑起来的程序就称为进程。
      ① .exe文件叫做“可执行文件”/“可执行程序”,是一个存储在硬盘上的文件(静态的)
      ② 双击该.exe文件,操作系统就会把这个文件中的核心数据加载到内存中去,同时在系统中生成一个“进程”;可以在“任务管理器”中看到该进程。
      (注:程序是静态的, 进程是动态的)

    2. 辨析题
      1)有的同学说:电脑上安装的程序太多了,电脑就卡了。
      ——其实这个说法是不成立的。 程序是安装在硬盘上的可执行程序,只是占用了硬盘的空间;在双击运行之前都是不占用内存空间的,也是不占用CPU资源的;所以只要不是在硬盘空间快满了,都不会影响计算机“卡/不卡”的。
      如果运行的程序太多,也就是进程太多,占用了很多的内存资源和CPU资源,此时计算机就可能会出现卡的情况
      2)有同学说:C盘上的东西太多导致电脑卡。
      ——其实这也是不成立的,除非是C盘空间已经快要没了就可能会卡。
      理由:很多操作系统在内存空间不够的时候会使用一部分硬盘空间作为“交换分区”,如果你的C盘空间没了而影响了交换分区的使用,这个时候电脑可能就会出现卡顿。
      3)开机自启动的程序是会影响电脑运行的,一旦开机程序就变成进程开始吃内存资源和CPU资源,则可能会导致卡

    注意:入职时, 千万不要在办公电脑上安装360等软件!!

    1. 同一时刻,系统中会有很多进程,操作系统是如何管理这些进程的呢?
      ① 描述:详细地表示清楚一个进程有哪些属性/信息
      (通过结构体来描述,因为操作系统一般是使用C、C++来写的,所以没有类的概念;一个结构体中包含了一个进程的各种信息;
      该结构体又被称为PCB进程控制块
      ② 组织:通过一定的数据结构,把若干个用来描述的实体放到一起并进行增删改查(系统中通常使用双向链表这样的结构来把这些PCB给组织在一起)
    • 创建一个进程,本质上就是创建PCB,并且加入到链表上;
      销毁一个进程,本质上就是从链表上删除对应的PCB结点;
      查看任务管理器的进程表,本质上就是遍历这个链表。)

    • 一个进程可能是一个PCB,也可能对应多个; 系统这里管理PCB的链表也不一定是一个

    1. PCB里有啥?(其实就是进程里有哪些关键的要素)
      ① pid:进程的身份标识,一个主机在同一时刻进程的pid是唯一的,通过pid来区分一个进程
      ② 内存指针:描述哪块内存是干啥用的。【描述了进程持有的内存资源】
      【一个可执行文件双击开始运行后操作系统会把核心数据(要执行的指令以及指令所依赖的数据)从硬盘加载到内存中。
      故:如果要创建进程就势必要给进程分配内存空间;然后这个内存空间上就有很多区域:有的用来放指令,有的用来放数据,还有的用来维护运行状态。而内存指针就是来描述哪块内存用来干啥的】
      ③ 文件描述符表:【描述进程持有的文件资源】 每个进程都可以打开一些文件(文件其实都是存储在硬盘上的数据),而文件描述符表里面就记录了当前进程都打开了哪些文件(打开了之后后续就可以针对这些文件进行读写操作了)

    【进程是操作系统分配资源的基本单位】
    (下面的属性④⑤⑥⑦都是和“进程调度”有关系的【进程调度:CPU资源有限,需要合理安排】)

    Ps.
    n核CPU就是同时可以跑n个任务。
    ① 多核CPU:CPU的运算能力和集成程度是相关的(集成程度:单位面积下元件越多,单个元件就越小)
    ② 每个CPU核心上又可以独立运行一个进程(运行进程相关的指令), 则多核CPU就可以同时独立的运行多个进程——【并行执行
    ③ 一个CPU核心,先运行一下进程1,再运行进程2,再进行进程3…只要微观上切换的足够快,宏观上看起来就像是3个进程在同时执行——【并发执行
    (其实:并行执行是多个CPU,而并发执行是一个CPU)
    【所谓的进程调度,其实就是通过“并行”和“并发”的方式让计算机“同时”执行多个进程(任务)——多任务操作系统
    单任务操作系统不支持并发/并行】

    (下面的属性存在的意义就是为了支持“进程调度”)
    ④ 进程状态:简单分为:就绪状态(随叫随到)、阻塞状态(不能随叫随到)。
    (阻塞状态的进程就无法调度到CPU上执行,就绪的进程才能上CPU执行)
    ⑤ 进程优先级:系统调度的时候会根据优先级来安排时间,但是创建进程的时候可以通过一些系统调用来干扰优先级(相对的)
    ⑥ 进程上下文:进程在CPU执行了一会儿之后要切换到别的进程,不能一直占用,此时就需要保存当前运行的中间结果(存档),下次再轮到该进程的时候就恢复之前的中间结果(读档),继续往下执行(对于进程来说,上下文就是CPU中寄存器中的值,寄存器的值就包含了运行的中间结果,需要把这些结果保存到PCB的上下文信息中(也就是内存中))
    ⑦ 进程记账信息:每个进程在CPU上执行了多久(执行时间不是按照s去衡量的,而是按照指令执行条数去衡量的)的信息统计,辅助调度的效果;使得调度更加均匀,避免有的进程完全捞不到CPU

    (在上述的基础上就可以完成进程调度了)

    进程到这里还涉及到一个关键概念——虚拟地址空间


    四、 虚拟地址空间

    1. 给每个进程划分各自的内存空间(活动范围),不要让这些进程的活动范围重叠,这些空间就叫做“虚拟地址空间”(不是真实的物理内存地址),通过专门的设备MMU来完成虚拟地址到物理地址之间的映射

    2. 如果虚拟地址不小心访问了超过自己范围的内存空间,在MMU映射的时候就能够及时发现,从而避免对物理内存产生影响
      ——即:MMU可以针对虚拟地址空间进行校验,如果非法地址就直接通知进程(比如直接杀死进程),从而及时止损,避免影响到其他进程

    3. 【使用虚拟地址空间,就认为进程之间存在了隔离性
      一个进程是不能直接访问另一个进程的内存数据的。防止了进程间的干扰操作,提高了系统的稳定性;不会因为某个进程bug而影响到其他进程】

    4. 有了隔离性之后,虽然进程是稳定了,但是又出现了新的问题:有些需求场景其实是要求进程之间要相互配合的,而隔离之后进程之间就很难进行交互了。
      ——故:系统引入了一个机制:进程间通信(无论是哪种进程间通信,核心原则相同:找一个 多个进程都能够访问到的公共资源,然后基于该公共资源来进行数据交换)
      (公共资源:可能是一块内存,可能是一个文件,也可能是网卡…)

    5. 进程要有独立性(相互之间互不干扰);
      进程之间如果想要进行通信,就需要使用特定的通信机制(基于文件、基于socket网卡加粗样式


    五、小结

    1. 进程是如何管理的?
      ①PCB描述
      ②双向链表组织
      (具体看上面)

    2. 虚拟地址空间(进程独立性)

    3. 进程间通信(公共资源) 关系


    THINK

    1. CPU构成
    2. 进程以及辨析题
    3. 虚拟地址空间
    4. 操作系统
  • 相关阅读:
    为什么 BI 软件都搞不定关联分析
    flex布局在多层嵌套时,内层设置了justify-content: space-between;不生效问题
    C++中promise和future详解
    _c++多态_轻松入门
    独立站引流,如何在Reddit进行营销推广?
    Spring Boot 2.x源码系列【5】启动流程深入解析之准备环境
    龙讯旷腾:如何建立基于第一性原理的正向研发模式,原子级计算伴随的时间和空间尺度增长将带来的变革
    javaVue社区蔬果商城计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    排序算法总结-C语言
    程序员面试金典16.20: T9键盘
  • 原文地址:https://blog.csdn.net/weixin_54150521/article/details/127586826