【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. 操作系统
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'Dream是普通小孩耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值