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

news2024/11/27 2:41:45

文章目录

前言

一、操作系统

二、进程 

     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 GHz,1秒钟有上几十亿个时钟周期~~

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

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

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

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

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

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

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

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

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

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

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

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

于是 她就决定同时交往多个男朋友(A,B,C)~

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

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

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

好啦,场景已经设立

如果此时,把 小欣 当成一个 CPU,把 A,B,C 当成是三个进程的话,

上述的时间表的安排的情况下,就是 三个进程 在 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分的精神继续学习吧!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车智能化,集度做加法

CES2023刚刚落下帷幕,这场名为“国际消费电子展”的业界盛会,近几年重心正明显转向智能汽车及其周边产业链。在2022年的CES上,集度与英伟达宣布合作,也透露了智能汽车研发的相关计划。而在本届CES之前、2022年末的广州车展上&…

一个关于image访问图片跨域的问题

一、背景 项目中遇到一个问题,同一个图片在 dom 节点中使用了 img 标签来加载,同时由于项目使用了 ThreeJS 3D 渲染引擎,在加载纹理时使用了 TextureLoader 来加载了同一张图片,而由于图片是在阿里云服务器上的,所以最…

SourceTree 拉取、重置提交、回滚、变基与合并

SourceTree的重置当前分支到此次提交 使用场景:“我想把已提交未推送的修改撤销” 使用模式说明软合并软合并是指将此次提交回滚到指定提交位置,但这个过程中会将修改过的文件暂存到暂存区。混合合并混合合并是指将此次提交回滚到指定的位置&#xff0c…

本来挺喜欢刷《剑指offer》的.......(第十一天)

跟着博主一起刷题 这里使用的是题库: https://leetcode.cn/problem-list/xb9nqhhg/?page1 目录剑指 Offer 66. 构建乘积数组剑指 Offer 68 - I. 二叉搜索树的最近公共祖先剑指 Offer 68 - II. 二叉树的最近公共祖先剑指 Offer 66. 构建乘积数组 剑指 Offer 66. 构建…

使用react-bmapgl绘制区域并判断是否重叠

需求如下: 在react项目中使用百度地图实现区域(电子围栏)的绘制绘制的区域类型为:1、多边形 2、圆形可绘制多个区域区域不能有重叠可重新编辑区域 代码如下: index.tsx import { useCallback, useEffect, useState } from rea…

Python入门实践(二)——变量的使用

文章目录变量1、变量的命名和使用1.1、避免命名错误2、字符串2.1、修改字符串大小写2.2、合并(拼接)字符串2.3、使用制表符或换行符来添加空白2.4、删除空白3、数字3.1、整数3.2、浮点数3.3、使用str()避免类型错误4、注释变量是对一种数据结构的命名&am…

2023年基建工程(设计规划施工)经验分享,超多干货

为了彻底打通从工程外业勘探调查、数据资料整理,到内业详细设计之间的一系列障碍,结合工程外业调查的特点,基于安卓(Android)操作系统,精心打磨推出了“外业精灵”移动端应用软件。 该系统把工程外业探勘、…

MPP数据库简介及架构分析

目录什么是MPP?特性并行处理超大规模数据仓库真正适合什么典型的分析工作量数据集中化线性可伸缩性MPP架构技术特性数据库架构分析Shared EverythingShared DiskShare MemoryShared NothingShared Nothing数据库架构优势什么是MPP? MPP (Massively Paral…

分享88个C源码,总有一款适合您

C源码 分享88个C源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载后可以看到。 源码下载链接:https://pan.baidu.com/s/1TT87gt66kn5BtLqgRUTlUQ?pwdwje5 提取码…

Java图形化界面---JOptionPane

目录 一、JOptionPane的介绍 二、JOptionalPane的使用 (1)消息对话框 (2) 确认对话框 (3)输入对话框 (4)选项对话框 一、JOptionPane的介绍 通过JOptionPane可以非常方便地创建…

SpringCloud复习之Sleuth+Zipkin链路追踪实战

文章目录写作背景为什么要有链路监控SpringCloud SleuthZipkin能做什么上手实战启动一个Zipkin Server微服务集成SleuthZipkin写作背景 前面复习了SpringCloud Netflix的几个核心组件,包括Eureka、Ribbon、Feign、Hystrix、Zuul,并进行了Demo级别的实战…

高精度减法【c++】超详细讲解

前言 大家学过高精度加法之后,可能已经知道高精度减法的实现方法了吧 如果你还没有学过高精度加法的话,请点击这里(很详细的)—>高精度加法【C实现】详解 最大的问题 最大的问题莫过于负数问题了。其他方法和加法一样。 负…

4.二级缓存解析

文章目录1. 二级缓存配置2. 二级缓存结构3. 二级缓存命中条件4. 缓存空间的理解5. 二级缓存执行流程二级缓存也称作是应用级缓存,与一级缓存不同的,是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合…

从南丁格尔图到医学发展史

可视化中,前端用于表现不同类目的数据在总和中的占比的场景,往往会采用饼图。 针对数据大小相近,南丁格尔图的呈现会更加美观。 南丁格尔图,又称玫瑰图,是由弗罗伦斯南丁格尔发明。 弗洛伦斯南丁格尔 开创了护理事业…

二、django中的路由系统

django中的路由系统 django中路由的作用和路由器类似,当一个用户请求Django站点的一个页面时,是路由系统通过对url的路径部分进行匹配,一旦匹配成功就导入并执行对应的视图来返回响应。 django如何处理请求 当一个请求来到时,d…

SpringSecurityOauth2架构Demo笔记

总体分为SpringSecurityOauth2授权码模式演示和密码模式演示 一直下一步,依赖手动导入,SpringBoot版本改成2.2.5.RELEASE,JDK版本1.8 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xml…

Open3D 点云投影至指定球面(Python版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设球体的相关参数:中心为 C ( x c , y c , z c ) C(x_c,y_c,z_c)

【数据结构和算法】栈—模拟实现Stack和栈相关算法题

文章目录栈的定义Stack模拟实现相关算法题1.栈的压入弹出序列2.逆波兰表达式(后缀表达式)⭐1.什么是逆波兰表达式?如何转换成逆波兰表达式逆波兰表达式如何计算3.有效的括号总结栈的定义 栈作为一种数据结构&#xff0c;是一种只能在一端进行插入和删除操作的特殊线性表。它按…

华为MPLS跨域C2方案实验配置

MPLS隧道——跨域解决方案C1、C2讲解_静下心来敲木鱼的博客-CSDN博客_route-policy rr permit node 10 if-match mpls-labelhttps://blog.csdn.net/m0_49864110/article/details/127634890?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId…

深度学习——长短期记忆网络LSTM(笔记)

长短期记忆网络LSTM&#xff1a; ①隐变量模型存在长期信息保存和短期输入缺失问题&#xff0c;解决方法是LSTM ②发明于90年代 ③使用效果和GRU差别不大&#xff0c;但是实现起来复杂 1.长短期记忆网络 ①忘记门Ft&#xff1a;将值朝0减少 ②输入门It&#xff1a;是否忽…