【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

目录
相关文章
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
5月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
850 2
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
279 2
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
300 2
|
11月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
377 67
|
9月前
|
调度 开发工具 Android开发
【HarmonyOS Next】鸿蒙应用进程和线程详解
进程的定义: 进程是系统进行资源分配的基本单位,是操作系统结构的基础。 在鸿蒙系统中,一个应用下会有三类进程:
339 0
|
12月前
|
SQL 监控 网络协议
YashanDB进程线程体系
YashanDB进程线程体系
|
消息中间件 调度
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
445 11
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
397 6
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
666 0