【JavaEE初阶】第二节.进程篇

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

前言

一、操作系统

二、进程 

     2.1 进程的概念

     2.2 进程的管理​​​​​​​​​​​​​​

     2.3 PCB

            2.3.1 PCB里面的一些属性

            2.3.2 进程的调度 

            2.3.3 进程的虚拟地址空间

            2.3.4 进程间通信

总结


前言

本节内容我们继续对JavaEE的有关内容进行学习本节内容我们主要学习有关操作系统和进程的相关概念的理解和学习接下来就让我们进入到这个课程的学习吧!!!!

一、操作系统

像之前所说的CPU、存储器、输入设备、输出设备

总体上来说都属于 "硬件" 设备 

而对于咱们普通用户和硬件打交道并不是一件方便的事情

为了可以更好的和这些 "硬件" 设备打交道聪明的程序员发明了一个 "软件"  —— 操作系统

操作系统的核心功能

  1. 对下要管理各种硬件设备
  2. 对上要给各种软件提供稳定的运行环境

举例说明

如Windows、Mac、Android、IOS 都是操作系统虽然厂商不同细节上有所差别但是核心操作都是这两条

如张三在QQ中写一段话点击发送这个过程 就是操作系统在进行工作

操作系统本身就是一个非常复杂的软件

如内存管理、文件管理、设备管理、进程管理、......其中"进程管理" 是一个非常重要的概念作为程序员就必须要去深入了解它

二、进程 

2.1 进程的概念

"进程process" 是操作系统里面的一个非常重要的概念虽然 可能在不同的操作系统里面的叫法也许会有所差别叫做 "任务task" 但是其实它们都是一个意思一个正在运行的程序都是以 "进程" 的方式来体现出来的

通过双击 可执行文件.exe文件操作系统就会把 可执行文件的核心信息 加载到内存上并且开始运行里面的代码从而形成了一个进程这个进程 就是可执行程序跑起来的模样

现在的电脑可以有多个进程一起执行起来的可以打开任务管理器看看此时电脑的进程

大家需要注意区分"进程" 和 "程序可执行文件"  之间的区别 

这是一个 进程是QQ所跑起来的模样是动态的被加载到内存中的

                                                                                                                                                                                                                                                  

 这是一个 可执行文件是静态的躺在硬盘上的

换句话说

一个计算机的硬盘上可能会躺着很多的可执行文件

同一时刻可能只有一小部分在运行变成了进程

2.2 进程的管理

一个操作系统上同时跑着许多个进程;

有的是自己双击过后打开的进程如QQ还有的是电脑一开机 操作系统自动打开的进程;

既然有这么多的进程操作系统就需要对它们进行管理把它们安排的明明白白;

管理 的思路就是先描述再组织;

  1. 先描述使用一个类/结构体把这个东西有啥特征 都表示出来;
  2. 再组织使用一个数据结构把很多个这样的 对象/结构体 给整理到一起;

                                                                                                                                                                                                                                                  

比如说现在有一个需求场景需要给正在好好学习的同学发奖品:

那么首先需要把这些同学的信息给描述出来虽然信息有很多但是 此时我们只需要知道 这些同学的学号、姓名就可以了至于说同学的性别、身高、体重啥的都不关心

然后就可以用一些数据结构 把这些同学整理到一起然后就可以发奖品啦

 类似的操作系统在进行管理进程的时候首先用一个 结构体 把很多进程相关的特征 都去进行了一些表示再用数据结构把这些结构体变量组织在一起 

2.3 PCB

PCB叫做 "进程控制块" 

它就是一个结构体这个结构体里就包含了一些表示进程的核心信息

在操作系统内核中就把若干 PCB 串成了一个双向链表这就是进程管理的核心模块

在任务管理器中看到了许多的进程本质上 每一个进程都是一个 PCB

进程与进程之间 是通过双向链表串起来的

当我们运行一个进程就是在链表里面 新增一个节点

当我们销毁一个进程就是在链表里面 删除一个节点

2.3.1 PCB里面的一些属性

pid进程的身份标识唯一类似于 "学号"

内存指针操作系统要把一些必要的数据加载到内存中

必要的数据有些是运行的指令代码有些是运行时依赖的数据全局变量

内存指针就描述了 该进程中哪些部分是指令哪些部分是数据

文件描述符表表示了当前进程都打开了哪些文件进程每打开一次文件就会在文件描述表上记录一些重要的信息

在代码中打开一个文件就会在进程的 文件描述符表 里给这个文件分配一个表项

可以看作 数组每个元素代表了一个打开的文件它对应的数组下标就是 "文件描述符"

所以说内存指针 和 文件描述符表 就描述了进程有哪些系统的资源也认为 进程是操作系统中 "资源分配" 的具体单位  

2.3.2 进程的调度

进程里面还有一组比较关键的属性用来实现进程的调度

  1. 进程的优先级
  2. 进程的状态
  3. 进程的记账信息
  4. 进程的上下文

什么是调度

本质问题当前计算机 CPU 是有限的但是进程的数量却比较多都需要消耗一定的资源但是 每个进程都需要消耗一定的 CPU~

操作系统要做到尽可能的公平这时候就需要进行 "调度"~

需要让这些有限的资源 贡献出更多的力量~

类似于高铁站的 "调度"工作铁轨就只有几根但是每天在上面跑的高铁 确实有许多的那么 "调度" 就是要规划好 高铁什么时候开从哪条铁轨上开从哪里开到哪里......"调度"工作就是需要保证 这些高铁之间需要有条不紊的开相互之间不可以打架~~ 

这里的解决方法就是 "轮流来"虽然进程的运行速度会受到一定的影响但是 受到的影响是比较小的~

毕竟CPU的主频是 XX GHz1秒钟有上几十亿个时钟周期~~

人是感受不到这样的轮转的~

比如说此时 我正在打开 CSDN但是 QQ也照样是开着的

从宏观上面来说就好像这些进程是同时执行一样

但是 从微观上来说并不是同时而是 "轮流" 的方式占用 CPU 执行~~

类似于这种方式我们称之为 "并发式的执行"~~

由于 CPU 上有多个核心每个核心上都可以跑一个进程某一时刻 两个进程就是在两个 CPU 核心上同时执行的~~

宏观上和微观上都是同时执行的~~

我们把这种方式称之为 "并形式的执行"~~

那么现在就可以来解释 进程里的那些关键属性了~

为了方便理解我们首先需要引进一个场景大家不要模仿哦

假设 小欣是一位漂亮小姐姐追求者有很多她的选男友的标准是 有钱+长得帅~~

但是没有哪个追求者具备这两个条件~

于是 她就决定同时交往多个男朋友ABC~

其中A 有钱B 长得帅C 虽然没有这两个条件但是他会舔~

所以小欣 不能让 A、B、C 之间有交集~

于是小欣 就需要化身为一个 "时间管理大师"即 规划一个时间表规划哪段时间给和谁干什么~

好啦场景已经设立

如果此时把 小欣 当成一个 CPU把 ABC 当成是三个进程的话

上述的时间表的安排的情况下就是 三个进程 在 CPU 上并发的执行

进程的优先级

那么什么是 进程的优先级 呢 

简单的来说就是 小欣在安排时间表的时候先安排哪一个再安排哪一个......

假设小欣比较喜欢 money然后再考虑其他的

那么 她就可以优先给 A 安排时间把一周的大部分时间都陪伴在 A 的身边

其次在分出一点时间 陪伴 B

至于 C就看剩下的时间了

进程的状态

指的是安排时间表的时候需要考虑到每个人的当前的特定情况~~

比如说A 说他这周需要出差两个礼拜不能够陪她了

于是 接下来的时间就只给 B 和 C 了~~

对于 进程 来说有很多的状态其中最典型的就是 就绪状态 和 堵塞状态

就绪状态进程是准备就绪的随时都可以让 CPU 执行~

阻塞状态进程在等待某个任务结束之后才可以让 CPU 执行在完成之前就没法继续执行~

比如说正常情况下A、B、C 都是就绪状态小欣随便安排时间他们都是随叫随到

但是如果 A 出差了就相当于进入阻塞状态此时就没法给 A 安排时间了~~

进程的记账信息

在安排时间的时候就需要考虑到一些历史记录以往的安排~~

比如说连续有好几个礼拜给 C 安排的时间都太少了小欣一看历史记录发现了这个问题再不进行一些调整的话就要失去 C 这个小可爱啦~

于是就在下一周安排时间的时候就给 C 多安排一些时间~

操作系统 在安排进程的时候也会记录以往每个进程在 CPU 上执行的时间如果发现某个进程被安排得太少就会适当的调整策略~~

而 记录以往每个进程在 CPU 上执行的时间就叫做 进程的记账信息

当然也不一定是一执行的时间为单位也可能是以执行的指令数为单位

进程的上下文

比如说某一次 小欣和 A 在一起的时候和 A 说好了两周之后 一起去夏威夷旅游~

有一次 小欣和 B 在一起的时候和 B 说好了下次见面的时候 他会带来一个小礼物~

于是当小欣下次遇到 A 的时候就可以问他说夏威夷那边准备的咋样了~

下次遇到 B 的时候就可以问他说礼物准备的怎么样了~

当然在这个过程中 可千万不要把 A 和 B 两个对象给搞反了不然就 "穿帮" 了~

为了避免出现 "穿帮" 的情况小欣就需要记录好 每次约会后的一些关键信息尤其是 这次约会还没有处理完的一些事情 需要在下次处理就需要明确的记录好当前处理的进度/中间结果这样下次约会的时候就可以继续从上次的结果中继续往下进行了~

进程在调度的时候也是一样进程很可能执行了某一个操作执行到一半就被调度走了~

过一段时间进程还是要回来的~

回来就需要从上次执行的位置继续执行下去了~

这就很类似于 玩游戏的时候的 存档和读档存档保存的信息就是上次退出之前 的游戏的状态这个就是 "上下文"~~

对于进程来说"上下文"具体指的就是 CPU 里的一堆寄存器里面的值上下文 就会在进程被切出 CPU 的时候把寄存器的状态保存到 PCB里内存 里下次进程回到 CPU 上就把 PCB 里的上下文读取出来恢复到 CPU 寄存器中做到从上次执行的结果 继续往下执行了~~

2.3.3 进程的虚拟地址空间

这是一个和进程非常相关的概念;

进程需要调用一些系统的资源其中的内存资源就是一个很关键的资源;

我们期望每个进程都用自己的内存不要相互干扰

但是在 C语言 中有一个操作叫做 指针解引用

解引用的时候我们需要保证 这个指针里包含的地址指向的是自己搞得合法的内存地址

此处必须有程序员来保证当前指针指向的内存是否合法

如果指向的内存地址不合法甚至会伴随着这个操作把别的进程就直接搞挂了

但是但凡是由人来操作的都会有出错的可能性甚至使得整个操作系统都不稳定

为了让各个进程之间不要相互干扰操作系统就引入了 "虚拟地址空间" 这样的概念

每个进程都只能访问到自己的地址空间相互之间都不会有影响了哪怕指针指错操作系统也能及时发现不会影响到其他的进程

就算出问题问题也会被限制到进程的内部不会把其他的进程搞挂了

正因为有了 虚拟地址空间进程有了一个非常重要的特性隔离性

一个进程的运行一般不会影响到另一个进程尤其是一个进程崩溃也不会影响到另一个进程崩溃;

现在又引出一个问题

每个进程都有一个 "虚拟地址空间"那么 一个系统里面的进程又那么多这些虚拟地址空间加到一起比物理内存大了那怎么办呢

1.虽然系统里面的进程有这么多但是 实际上同一时刻进行的进程没有几个
2.即使同一时刻有好几个进程在跑这些进程也不是同时把所有的虚拟内存地址空间的内存都用上了假设 同时有6个进程在跑很可能每个进程只用了 1M 的内存空间虽然每个进程的虚拟空间很大但实际使用的内存只有一小部分物理内存只需要把真实使用的这部分内存数据给表示出来即可
3.极端情况下同时跑的几个进程同时吃了很多的真实内存会导致物理内存不够此时 出现这种情况算 bug程序员需要想出办法来优化一下内存占用或者扩容换一个内存更大的机器

2.3.4 进程间通信

进程引入了隔离性确实使得系统更稳定了但是也带来了其他的问题

如果多个进程之间想要配合工作就麻烦了

操作系统又引入了 "进程间通信"在隔离行的前提下 开了个口子让多个进程之间能相互通信

操作系统提供的进程通信方式有很多种但是本质上都是一样的搞一个多个进程之间都能访问到的公共资源借助公共资源来进行通信

举例说明

就类似于之前疫情比较严重的时候点外卖的时候要求 "无接触配送"外卖小哥直接把外卖放到一个专门的 集中放置的地点点外卖的人直接去那个地点去取外卖


总结

今天的内容我们学习了有关进程的基本概念以及认识了操作系统对PCB也有了一定的认识下面的课程我们将进入到更加困难的线程的学习让我们打起12分的精神继续学习吧

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java