专栏简介: JavaEE从入门到进阶
题目来源: leetcode,牛客,剑指offer.
创作目标: 记录学习JavaEE学习历程
希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长.
学历代表过去,能力代表现在,学习能力代表未来!
目录
1. javaEE概述
2. 计算机发展史
3. 冯诺依曼体系
4. 操作系统
4.1 操作系统的定位
4.2 什么是进程/任务
4.3 进程控制块抽象
4.4 进程控制块的属性
4.4并行与并发的区别
4.5 进程调度
4.6 内存分配 --- 内存管理
4.7 进程间通信
前言
由于JavaEE涉及许多计算机操作系统中多线程的知识 , 本文作为javaEE的第一篇文章 , 旨在了解多线程的基础知识 , 为后续JavaEE并发编程的学习打好基础.
1. javaEE概述
javaEE是基于javaSE基础构建的, 用来实现企业级和Web应用级企业的开发, 它不是编程语言而是一系列的技术规范和实现, 技术平台的核心思想是容器加组件.
2. 计算机发展史
计算机的需求在人类的历史中广泛存在, 发展大体经历了从一般计算机工具到机械计算机再到目前的电子计算机的发展历程.
人类对计算机的需求, 驱动我们不断的发明, 改善计算机.目前这个时代是"电子计算机"的时代, 发展的潮流是:更快速, 更稳定, 更微型,.
3. 冯诺依曼体系
现代计算机大多遵循冯诺依曼体系
- 输入设备 : 用户给计算机发号施令的设备(键盘 , 鼠标 , 摄像头 , 麦克风)
- 输出设备 : 计算机个用户汇报结果的数据(显示器 , 音响)
- CPU 中央处理器 : 进行算数运算和逻辑判断
- 存储器 : 分为内存和外存, 用于存储设备(二进制存储)
影响存储空间:
硬盘 > 内存 >>CPU
影响访问速度:
CPU > 内存 > 硬盘
4. 操作系统
操作系统是一组计算机资源管理的软件的统称 , 目前常见的操作系统有 : Windows系列 , Unix系列 , Linux系列 , Android系列(本质Linux) , iOS系列(与Mac同源) , 鸿蒙等等.
4.1 操作系统的定位
操作系统有两个基本功能:
- 防止硬键被时空的应用程序滥用
- 向应用程序提供API来控制复杂而又通常大相径庭的低级设备.
4.2 什么是进程/任务
一个运行起来的程序 , 就可以称之为"进程" , 如果没运行起来就只能叫程序. 同时 , 在操作系统内部 , 进程又是操作系统进行资源分配的基本单位.
4.3 进程控制块抽象
进程是一个重要的软件资源 , 是由操作系统内核负责管理的.(描述+组织)
- 描述:
使用结构体(c语言的结构体) 来描述进程属性 , 与java中的类具有相似的功能.
用来描述进程的结构体又被称为PCB(programe control block)进程控制块
- 组织:
通过双向链表 , 把多个PCB串联到一起.(当然实际情况更加复杂 , 这里以开源的Linux操作系统为例)
创建一个进程 , 本质上就是创建一个PCB这样的结构体对象 , 把它插入到链表中.
销毁一个进程 , 本质上就是把链表上的PCB节点删除掉.
查看任务管理器的进程列表 , 本质上就是遍历这个PCB链表 , 取出相关的资料.
4.4 进程控制块的属性
- 1.pid 进程的身份标识符.(唯一的数字)
这些pid可以说是进程的身份证号 , 目的是区分进程.
- 2.内存指针
指明了这个进程执行的代码在内存的什么位置 , 以及这个进程中执行的数据都在哪里.
- 3.文件描述符表
文件描述符表可以视为是一个数组 , 里面每一个元素又是一个结构体.每一个结构体对应一个文件的相关信息.进程每打开一个文件就会在文件描述符表上多增加一项.
假设我们的代码中不操作文件 , 只有一个打印"HelloWorld"的语句 , 还是需要文件描述符表~~
一个进程只要启动 , 不管是否有操作文件的代码 , 都会默认打开三个文件 , 标准输入(System.in) , 标准输出(System.out) , 标准错误(System.err).此时对应的文件描述符表 , 会创建三个表项 , 标准输入 , 标准输出 , 标准错误 , 对应下标分别是0 , 1 , 2.这个文件描述符表的下标被称为是文件描述符.
4.4并行与并发的区别
一个系统中进程有上百个 , 这些进程希望能够"同时运行""分时复用" , CPU虽然是多核但数量有限.由此引出并行与并发的概念.
- 并行:
如果系统有多个CPU , 一个CPU执行一个线程 , 另一个CPU执行另一个线程 , 两个线程之间互不抢占CPU资源 , 我们称之为并行.
~~微观和宏观都是同时执行.
- 并发:
当有多个线程执行在运行时 , 如果系统只要一个线程 , 则它不可能同时运行一个以上的线程 , 它只能将CPU的运行状态划分成若干个时间段 , 再将线程分配给各个时间段运行 , 当一个线程运行时其他线程出于挂起状态 , 我们称之为并发.
~~微观串行 , 宏观并行.
eg: 在一个CPU核心上 , 先运行一下QQ音乐 , 再运行一下TX视频....只要切换速度足够快 , 我的电脑主频是3.2GHz一秒可以执行32亿条指令(细品) , 宏观上人感知不到.
由于并行和并发是内核负责处理的 , 应用程序感知不到.因此往往也把并行和并发 , 统称为并发.
除非显示声明 , 否则谈到并发 , 就是指并行+并发.
4.5 进程调度
为了给这些进程更好的分配CPU资源 , 操作系统里面有一个重要的资源调度器 , 就负责让有限的CPU来调度执行这么多的线程.
进程调度的相关属性.
- 进程的状态
就绪状态:随叫随到 , 进程随时准备好了去CPU上执行
运行状态:正在CPU上运行的
阻塞状态(睡眠状态):短时间无法到CPU上执行了 .eg:进程正在进行密集的IO操作 , 读写数据.
- 进程的优先级
当有很多进程需要运行时 , CPU先给谁排 , 后给谁排 , 给谁排多点 , 给谁排少点.
eg:(本段子纯属虚构)
小美排时间优先给小A排 , 周一周二周三都和小A逛街吃大餐可以获取物质上的实惠 , 周四周五给小B排 , 因为小B长的帅赏心悦目.周六分单双周给小C排 , 防止小C不舔了.
进程也是有优先级的~~
操作系统调度并不是一碗水端平的.
- 上下文
操作系统在进行进程切换的时候 , 就需要把进程执行的"中间状态"记录下来保存好,下次这个进程再上CPU运行时 , 就可以恢复上次的运行状态 , 继续向下执行.
进程的上下文 , 就是CPU中的各个寄存器的值 (寄存器是CPU内置的存储数据的模块 , 保存的就是程序运行过程中的中间结果)
保存上下文 , 就是将这些寄存器的值保存到内存中去.
恢复上下文 , 就是把内存中这些寄存器的值恢复回去.
eg:
因为小美要同时和3个人谈恋爱 , 因此她必须记住上次和某个人进行都什么程度了 , 是否有啥未完成的任务之类的.
上一月
小A对小美说 , 下个月我带你去三亚玩 , 让小美提起准备准备~~
小B对小美说 , 下个月我爸过生日 , 想让小美帮忙准备准备~~
下一月
小A问小美:你准备好了吗?小美说:我给你爸买了一个剃须刀
小B问小美:你准备好了吗?小美说:我已经买了一套泳衣了.
很明显这时就穿帮了 , 为了解决这个问题 , 就需要记录好 , 上次约会都有哪些进展 , 方便下次执行.
- 记账信息
操作系统 , 统计每个进程在CPU上占用的时间和执行的指令数目.根据这个来决定下一阶段如何更好的调度.
eg:
小美和各个男友每相处一段时间 , 就做一个总结 , 统计一下每个人身上大概花费了多少精力.始终保持好一个合适的尺度 , 不能太远 也不能太近.让每一个人都感受到温暖.
PCB中包含的属性非常多 , 上述是主要属性~~
4.6 内存分配 --- 内存管理
内存指针所指向的并非是真实的物理地址 , 而是经过了一层抽象 , 虚拟出来的地址空间.类型与C语言学过的指针 , 这里的内存地址就是虚拟内存地址.
内存物理上是个内存条可以存储很多的数据 , 内存条可以想象成一个很长的走廊 , 走廊有很多的房间.走廊有很多的房间 , 每个房间的大小1Byte.每个房间还有个编号 , 从0开始依次累加.这个内存编号就是内存的"物理地址".
内存有个了不起的特性~随机访问.访问内存上的任意地址的数据 , 速度都极快且时间也差不多.因此造就了数组下标操作是O(1).
如果进程操作内存的物理地址就会出现如下图所示 , 如果进程1的代码出现bug就可能导致访问的内存越界 , 进程1的越界访问到进程2的内存.
eg:
当你写一个程序一运行 , 不一会QQ崩溃了 , chrome也崩溃了.....那么这锅谁背~~
内存使用虚拟地址就可以有效解决该问题 , 操作系统的MMU一但发现进程1的访问超出了访问范围 , 此时会直接向进程反馈一个错误.(具体来说就是SIGN SEGEMENT FAULT 信号 , 引起进程的崩溃) , 这样就可以保证谁出bug谁奔溃 , 其他无关线程不受影响.增强进程间的隔离性.
主要目的就是解决进程间相互影响的问题.
4.7 进程间通信
虽然进程隔离了 , 但又引入了新的问题.有时候 , 确实进程之间 , 需要数据的交互.(相互配合)
在隔离性的基础上 , 开个口子 , 进程间通信实现方式很多 , 但核心思路是一致的.需要搞一个多个进程都能访问到"公共空间" , 基于这个公共空间来进行数据交互即可.
eg:
在当前疫情时代的背景下 , 点外卖提倡无接触配送 , 外卖小哥可以将外卖放到指点的地点就可以实现.
这里的通信方式/公共空间 , 有很多具体的体现.
JavaEE主要涉及两种方式 , 基于文件 , 基于网络.