【JavaEE初阶】进程与线程初步认识

简介: JavaEE初阶 & 进程与线程初步认识

JavaEE初阶 & 进程与线程初步认识

1. 操作系统简单认识

操作系统简称OS(“operating system”)


其实就是一类软件,主流的有:Windows,Android, iOS…

对硬件,很好的管理

对软件,提供良好且稳定的运行环境


4f79f5647c1c483fbee004f7429a7378.png

可见,操作系统是硬软联系的必由之路~


而我要讲的其实是它与我们密切相关的功能模块,进程管理


2. 进程(process)

2.1 进程概念

我觉得英文更能表达这个词的含义~

process表示任务的运行过程~

我们常见的【.exe】文件,这是一个可执行程序

我们只要双击一下,在系统之中就开启了一个进程~

bca3a75e339a4b3d85f1492a6c155f47.png


双击~

72cec5ae402148f7929f2d871fb33328.png


打开任务管理器(登录后~)

开始页面就是搜到~


62403e4b64004a31932df65f8529512e.png

这些就是此时电脑的一些进程~

2.2 进程管理

进程很多,当然就需要管理~

描述进程:

使用结构体/类,把进程的属性信息表示出来

组织进程:

使用一些数据结构,将结构体/对象,放到一起~

为什么说结构体呢,因为操作系统底层就是由C/C++这种偏底层的语言写的,而这类语言适合进行多进程开发~


不代表偏高层就不适合多进程,比如python多进程的API也是做得很好的~

2.2.1 结构体有哪些属性呢?(部分)

PCB(process control block)


在硬件圈子里就是个板子

在软件里,就是个结构体

pid,进程的id,进程的身份标识(唯一)

内存指针,即当前进程使用的内存是在内存条的哪一部分

描述进程使用了哪些内存资源

文件描述符表,硬件存储的数据,一般以文件形式整理的

进程每次打开一个文件,就有一个文件描述符,那么打开很多文件,就有一组文件描述符。构成一个顺序表:文件描述符表~

描述进程使用了哪些硬盘资源

eeb910bf31f0026f345b5bb34a11d671.jpg


根据冯诺依曼体系结构,操作系统的重要作用就是“联系”

而进程的这个结构体的这些属性,在联系的时候,尤为重要


0cae7ae18ea6db199ea32b5f056a8067.png

进程的运行需要通过操作系统,申请资源

内存,硬盘,CPU等…

所以进程就是操作系统进行资源分配的基本单位~

2.2.2 CPU

中央处理器(Central Processing Unit,简称CPU)


程序的运行,离不开CPU~

程序,相当于一组“二进制指令”的集合~

QQ.exe为例

55ff949e182a4494b1131a7da2ac3540.png


可以看到,一大堆二进制数,这些就是可以被CPU执行的二进制指令~

47945a08ffe5434bb98edf8973cd80c1.png

查看你得电脑的CPU

在任务管理器就能看到~


2ac7ba0303cb41339cdd5376085f0b57.png

CPU有一个概念,核心数

我的是12个内核,16个逻辑处理器

16(逻辑)核心~

即十二个打工仔,逻辑上干了十六个人的活

另一个说法:12核16线程~

为什么不是2的n次方呢

内核分大小核,大核一个顶俩~

而核心数都远小于进程数(上好几百),那么这些“打工仔”,怎么处理这么多进程的~

当然,一些超级CPU(服务器CPU)核心数会很多~

而且,我们平时的体验知道,这些进程都是同时运行的~

那么,我们就要谈谈CPU的核心,是如何打工的~

2.2.3 CPU的核心们,是如何打工的?

并行

同一时刻,两个核心,同时进行两个线程


33413c3712b04b9e8fdfd6c992da7de0.png

※ 并发

一个核心,先执行进程1,再执行进程2…

只要速度够快,肉眼感知不到,就认为是这些进程”同时“进行的~

4394864fb4aa4f908d80ab8b996a7076.gif


所以,这些CPU打工仔,就是通过并发 + 并行的方式来完成的~

2.2.4 CPU打工仔们,如何有条不紊工作的

重点重点重点:进程调度~

进程状态:

就绪态:进程时刻准备着,随时可以执行

这个就绪态,其实进程就是在运行中

只不过肉眼看不出它的间隔时期

所以也可以说“时时刻刻就绪”,“时时刻刻运行”

阻塞态:进程暂时无法执行

重点就是规划时间表,规划他们什么时候处于什么状态~

进程优先级:


进程的调度可能并不“公平”,即进程优先级调度~

谁先执行,谁后执行,谁更重要,谁时间空间占比多~

进程的上下文:


即,当前进程执行情况的“存档”

进程在离开CPU的时候,“存档”。下次回来的时候,“恢复”,继续执行。

比如关闭QQ,再重新执行的时候,可以继续之前的工作~

当然,每个进程都是独立的上下文,不然就信息错乱了。

这里的“文”指的是,CPU内部一大堆寄存器的值~


寄存器就是个“中介”

报错当前进程的“中间结果”

包括进程现在处在哪条指令~

另外,PCB有一个上下文字段


“存档”:这些寄存器的值就存放在里面~

“读档”:“恢复”的时候,就是把PCB此字段的值还给寄存器

进程的记账信息

统计每个进程,在CPU上执行了多久~

这个记账信息作为调度的参考依据

一些进程对应数据不太好,就进行调度的调整~

2.2.5 PCB在操作系统中的存储

在操作系统中其实就是一个双向链表

创建一个进程,就是多了一个节点

删除一个进程,就是删除节点

遍历一个进程,就是遍历链表

3. 内存分配

内存管理(Memory Manage)


操作系统分配的内存地址,都是“虚拟地址空间”,跟字面意思一样,每个进程访问的内存地址,不是真实的物理的内存地址

6ffeadef6eac41b9a66edf609fc27918.png

如果直接访问内存,挑战“进程之间的稳定性”


即野指针等…

af48261251bd4dfdbae417b6e3a1096e.png


这样设计,每个进程就只能访问自己的虚拟内存地址,而这个独立的空间,通过页表翻译,会被操作系统映射到对应的物理内存空间上~


即使虚拟地址是一样的,但是被页表翻译也会发生不同的映射

进程的”世界“,就这有那一部分虚拟内存空间!


世界观也仅限于此~

自然也不可能影响别的进程的”世界“


出现越界访问,页表无法翻译,直接报错给你个机灵~


这有就不会给真实的物理内存空间有所影响~


大大提升了操作系统的“稳定性”!


通过“隔离性”

4. 进程间通信

进程间通信(Inter Process Communication)


有的时候,进程之间要进行交互与配合~

如果进程没有“隔离性”,那么就进程1直接在进程2的物理内存上,进行修改咯~,这样子做,不好!


进程间通信,本质上就是在“隔离性”前提下,找一个公共区域,让两个进程借助这个公共区域,进行数据交换,即“交互和配合”


当然,这个区域不是“虚拟内存地址”,虚拟内存地址不是公共的~

就相当于,外卖小哥送外卖和我在敲代码是两个线程,我点了外卖,小哥并不是直接过来宿舍喂我,而是放在学校外卖栏这个公共区域,而我去这个公共区域拿外卖吃~

就相当于,操作系统妥协了,虽然进程间必须具有“隔离性”,但是要进行交互,就必须“开一个小口子”~


e90a1f25a0464b81afc5c4b3bce41107.png

操作系统在进程通信上有很多实现方式

如,管道,消息队列,共享内存,信号…

本质就是“开小口子”去进行进程间交互~

5. 线程与进程

多进程和多线程编程都能满足“并发编程”的需求~


进行这些编程,就需要有对应“API”


Java是特别鼓励多线程编程的~


为什么Java几乎没有多进程编程呢?

这个原因是个主观原因

制作jdk的大佬们,加入很多多线程API,而多进程几乎没有。

而C/C++,就有很多多进程API~

5.1 进程与线程的浅浅区别

进程,是比较有重量的


创建线程销毁进程,成本高~

调度进程,成本也高~

因为“隔离性”,资源分配,内存规模的比较大,通信…

多进程解决多并发

引入线程概念,是一个更轻量的进程,即轻量级进程


就是在一个进程里,开发出多条线程

这些线程共用同一份空间,同一进程不同线程没有“隔离性“

就相当于,你要搞一个企业,在一栋楼里,开多个房间给打工仔们工作,还是多建一栋楼~

前者耗时少,成本低,员工交互容易~

d67e3131ab26478890f48410c0ea8f6a.png

相关文章
|
22小时前
|
Java 调度
【Java多线程】对进程与线程的理解
【Java多线程】对进程与线程的理解
9 1
|
9天前
|
调度
线程和进程的区别?
线程和进程的区别?
|
10天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
11天前
|
调度 Python 容器
【python】-详解进程与线程
【python】-详解进程与线程
|
15天前
|
运维 监控 Unix
第十五章 Python多进程与多线程
第十五章 Python多进程与多线程
|
16天前
|
Java 数据库连接 数据处理
Python从入门到精通:3.1.2多线程与多进程编程
Python从入门到精通:3.1.2多线程与多进程编程
|
16天前
|
消息中间件 安全 调度
Python从入门到精通:3.1.1多线程与多进程——进程和线程的概念
Python从入门到精通:3.1.1多线程与多进程——进程和线程的概念
|
16天前
|
监控 安全 Java
一文讲明白Java中线程与进程、并发与并行、同步与异步
一文讲明白Java中线程与进程、并发与并行、同步与异步
8 1
|
20天前
|
监控 安全 Java
【JavaEE多线程】深入解析Java并发工具类与应用实践
【JavaEE多线程】深入解析Java并发工具类与应用实践
33 1
|
22小时前
|
Java
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
6 1

相关实验场景

更多