「JavaEE」初识进程

初识进程

  • 🍉进程
    • 🍌操作系统的进程管理
  • 🍉PCB 重要属性
    • 🍌进程的身份标识
    • 🍌内存指针
    • 🍌文件描述符表
    • 🍌进程的状态
    • 🍌优先级
    • 🍌记账信息
    • 🍌上下文
  • 🍉内存分配(内存管理)
  • 🍉进程间通信

🍉进程

进程是操作系统提供的一种软件资源

我们现在用到的系统,都属于是“多任务操作系统”,即在同一时刻,可以同时运行多个任务
这里所说的“任务”,就是指正在运行中的程序,也可以称为“进程”

与其对应的就是“单任务操作系统”,它在同一时刻只能运行一个程序

打开任务管理器,我们可以看到:每个任务在执行过程中,都需要消耗一定的硬件资源(内存、硬盘等)
在这里插入图片描述
也就是说,计算机的每个进程在运行的时候,都需要给它分配一定的系统资源。可见进程是系统分配资源的基本单位

🍌操作系统的进程管理

操作系统在管理进程时,会先使用类/结构体实体属性给列出来(因为操作系统一般是用C/C++实现的,所以可以使用结构体),这一步称为“描述”表示进程信息的结构体,称为PCB(进程控制块,Process Control Block)

每个正在运行或等待被调度的进程都有一个对应的PCB,操作系统通过访问和操作PCB来实现进程的管理和调度

补充:PCB 是操作系统学科中的通用概念。Windows 上表示进程的结构,可以称为 PCB;Linux 上的也可以称为 PCB
具体到 Linux 上,PCB 是一个叫作 struct task_struct{…}这样的结构体

在描述之后,使用一定的数据结构,把这些结构体/对象串到一起,这一步叫作再组织
在 Linux 中,若干个 task_struct 之间是使用链式结构串起来的

当我们看到任务管理器中的进程时,系统内部此时在遍历链表,并且打印每个节点的相关信息
如果运行一个新的程序,那么系统中就会多一个进程,多出来的这个进程就需要构造一个新的 PCB,添加到链表上
与之对应的,如果某个运行中的程序退出了,那就需要把对应进程的 PCB 从链表中删掉,并销毁对应的 PCB 资源

注意:此处的表述是一个简化版本,实际上组织的方式更加复杂(内部不是一个链表,而是更加复杂的链式结构)


🍉PCB 重要属性

🍌进程的身份标识

不同进程之间是通过一个简单的不重复整数来区分的,称为 pid。后续要针对某个进程进行操作时,就可以用 pid 来区分
在这里插入图片描述

比如选中某进程,点击“结束任务”,那么此时任务管理器就会获取到你选中的进程的 pid,然后调用一个系统 api,把 pid 作为参数传进去,从而完成杀死进程的操作


🍌内存指针

内存指针是用来描述某个进程能使用哪些内存,即描述了进程使用内存资源的详细情况

进程在运行过程中需要消耗一些系统资源,其中内存就是一种重要的资源
如果要使用内存,那就得先向系统申请,得系统给你分配一块内存之后,你才能使用
一个进程要想跑起来,需要有指令(代码),也需要有数据,而指令和数据都是要加载到内存中的,所以进程需要知道指令和数据分别存在哪里

而内存指针保存着一个内存地址,指向内存中的特定位置。通过内存指针,可以访问和操作内存中的数据和指令(代码)


🍌文件描述符表

文件描述符表是操作系统中的一个数据结构,它描述了某个进程所涉及的硬盘相关的资源
进程经常需要访问硬盘,操作系统对于硬盘这样的硬件设备进行封装,按照文件的方式来操作(这里的“文件”,指的就是我们电脑里面的文件,它们是存在硬盘中的)
一个进程要想操作文件,就需要先打开文件,这个过程就是在文件描述符表中给这个进程分配一个表项(构造一个结构体),表示这个文件的相关信息


前面我们说进程是系统分配资源的基本单位,像内存、硬盘、网卡等资源就会在 PCB 中有所体现,而且它们在PCB 中都好体现。但是一个进程消耗 CPU 资源,这个要如何看待呢?

一个 CPU 可能有一个核心,也可能有多个,一个核心在同一时刻只能处理一个进程,但是系统上的进程远多于电脑的核心数,此时就涉及到一个关键的概念——分时复用(并发)
就是 CPU 的核心先执行进程1的代码,执行一段时间之后,让进程1下来,换进程2上去……依此类推

而 CPU 一秒可以执行几十亿条指令,也就是说在短时间内可以进行很多次任务切换,在切换进程的速度足够快的情况下,人是感知不到这个切换的过程
而如果是多核 CPU,比如四核,那么就可以同时执行四个不同的进程,这称为并行执行。虽然有多个核心,但每个核心仍然要分时复用,快速切换

当代计算机,基本是并行和并发同时存在的,两个进程是并行执行还是并发执行,要看系统的调度
我们把并行和并发统称为“并发”,对应的编程方式(解决一个问题,分成多个任务来执行,这多个任务协作解决)称为并发编程

说到这里,再回到上面的问题,一个进程消耗 CPU 资源代表该进程在 CPU 上消耗的时间

在这里插入图片描述

任务管理器中是按百分比算的,就表示某进程在 CPU 上消耗的时间的百分比
如果某个进程把 CPU 占到 100%,那就意味着其他进程都没有执行的时间,相当于这个进程霸占了 CPU,这时候很可能会造成系统卡顿

为了避免发生这种情况,就需要对进程进行调度,使各个进程可以顺利并发执行。PCB 中提供了一些属性来支持系统调度进程,下面我们来看一下


🍌进程的状态

所谓的状态,是描述某个进程能否到 CPU 上执行,主要有两个状态
就绪状态:进程随时准备好到 CPU 上执行
阻塞状态:进程当前不方便去 CPU 上执行,不应该去调度它,比如进程在等待 IO

这里所说的 IO,可能是来自控制台的输入/输出(比如等待 Scanner 的输入,也可能是硬盘的输入/输出、网卡的输入/输出)

🍌优先级

有多个进程等待系统调度,这些进程获得的资源和调度顺序是有优先级的。优先级越高,获得资源的机会就越大,同时一般会优先执行
比如电脑上在运行游戏和微信,显然游戏的优先级更高

🍌记账信息

针对每个进程占据多少 CPU 时间进行统计,然后根据统计结果进一步调整调度的策略。这样做是为了确保每个进程不会出现完全没有到 CPU 上执行的情况

🍌上下文

每个进程在运行过程中,会产生一些中间结果,这些结果会保存在 CPU 的寄存器中。因此,在进程调度出 CPU 之前,需要把当前寄存器中的信息单独保存到一个地方。在该进程下次去 CPU 上执行的时候,再把这些寄存器的信息恢复回来

保存上下文:把 CPU 的关键寄存器中的数据,保存到内存中(PCB的上下文属性中)。相当于游戏中的存档操作
恢复上下文:把内存中关键寄存器中的数据,加载到 CPU 对应的寄存器中,使之前的进程能够继续执行。相当于游戏中的读档操作


🍉内存分配(内存管理)

核心结论:每个进程的内存是彼此独立、互不干扰的
也就是说,通常情况下进程A不能直接访问进程B的内存(这也称为进程独立性),这样做利于系统的稳定性。
如果某个进程的代码出 bug 了,那么只会影响到当前这个进程,不会影响到其他进程


🍉进程间通信

虽然进程之间有独立性,但是有时候也需要多个进程相互配合完成某个工作,所以进程间需要进行通信

进程间通信和进程的独立性不矛盾,因为系统会提供一些公共的空间(就是多个进程都可以访问到的),让两个进程借助这种公共空间来交互数据

操作系统提供了多种方式供进程进行通信,但本质上都是上述思路

常用的方式有:

  1. 文件:Java 程序员主要使用的进程间通信方式
  2. 网络:可以支持同一个主机的不同进程,也能支持不同主机的不同进程(适用性更高)
  3. 管道
  4. 共享内存
  5. 信号量
  6. 信号

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Data Shapley Value 笔记

本文为 Data Shapley: Equitable Valuation of Data for Machine Learning 的阅读笔记,涉及论文中的 Data Shapley Value 计算公式、两种实现算法、实验应用部分的梳理。 为理解 Data Shapley Value,本文首先讨论 Shapley Value的相关内容,利…

深入了解与全面解析华为认证(HCIA/HCIP/HCIE)

一、网络行业技术认证 网络行业对于技术评定一般分为两种,一种是企业认证,一种是国家认证 企业认证属于技术认证,在国内的互联网企业都会承认,用于评定一个人的技术等级或者企业招投标的资质。 网络行业认证最好的有三种&#…

SpringBoot内容协商快速入门Demo

1.什么内容协商 简单说就是服务提供方根据客户端所支持的格式来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格式进行返回,而如果需要一个接口即支持 json,又支持其他格式,开发和维护多套代码显然是不合理…

Python 全栈体系【四阶】(二十五)

第五章 深度学习 三、计算机视觉基本理论 11. 图像梯度处理 11.1 什么是图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化…

elementui 实现一个固定位置的Pagination(分页)组件

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、 elementui 实现一个固定位置的Pagination(分页)组件 文章目录 系列文章目录…

基于“PLUS模型+”生态系统服务多情景模拟预测

工业革命以来,社会生产力迅速提高,人类活动频繁,此外人口与日俱增对土地的需求与改造更加强烈,人-地关系日益紧张。此外,土地资源的不合理开发利用更是造成了水土流失、植被退化、水资源短缺、区域气候变化、生物多样性…

HTTP 摘要认证

文章目录 一、什么是摘要认证二、工作流程三、实例演示 一、什么是摘要认证 摘要认证,即 Digest Access Authentication,是一种HTTP身份验证机制,用于验证用户的身份。相较于基本认证(Basic Authentication)使用用户名…

【随笔】Git 高级篇 -- 相对引用2 HEAD~n(十三)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

Mongodb入门--头歌实验MongoDB 数据库基本操作

一、数据库创建 任务描述 本关任务:创建数据库。 相关知识 本关评测是在 Linux 环境下进行的,MongoDB 的安装与配置测评系统均已默认完成。 为了完成本关任务,你需要掌握: 1.如何连接数据库; 2.如何创建数据库。 连接数…

sqlmap(四)案例

一、注入DB2 http://124.70.71.251:49431/new_list.php?id1 这是墨者学院里的靶机,地址:https://www.mozhe.cn/ 1.1 测试数据库类型 python sqlmap.py -u "http://124.70.71.251:49431/new_list.php?id1" 1.2 测试用户权限类型 查询选…

Vue3 ts环境下的PropType

简介 在Typscript中,我们可以使用PropType进行类型的推断与验证。在日常的开发中我们常常会遇到下面这样的场景: 我们通过request请求从服务端获取了一条数据,数据是个Array的格式,Array中的每个元素又是一个对象,像下…

Web前端—属性描述符

属性描述符 假设有一个对象obj var obj {a:1 }观察这个对象,我们如何来描述属性a: 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符 var desc Object.getOwnPropertyDescriptor(obj, a); console.log(desc);我…

Python-VBA函数之旅-bytearray函数

目录 1、bytearray函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:非风V非雨-CSDN博客 bytearray函数在Python中提供了一种可变字节序列的表示方式,这在实际编程中有多种应用场景。常见的应用场…

RabbitMQ3.13.x之九_Docker中安装RabbitMQ

RabbitMQ3.13.x之_Docker中安装RabbitMQ 文章目录 RabbitMQ3.13.x之_Docker中安装RabbitMQ1. 官网2. 安装1 .拉取镜像2. 运行容器 3. 访问 1. 官网 rabbitmq - Official Image | Docker Hub 2. 安装 1 .拉取镜像 docker pull rabbitmq:3.13.0-management2. 运行容器 # lates…

蓝桥杯-数组分割

问题描述 小蓝有一个长度为 N 的数组 A 「Ao,A1,…,A~-1]。现在小蓝想要从 A 对应的数组下标所构成的集合I 0,1,2,… N-1 中找出一个子集 民1,那么 民」在I中的补集为Rz。记S∑reR 4,S2∑rERA,,我们要求S、和 S,均为偶数,请问在这…

Spring6-单元测试:JUnit

1. 概念 在进行单元测试时,特别是针对使用了Spring框架的应用程序,我们通常需要与Spring容器交互以获取被测试对象及其依赖。传统做法是在每个测试方法中手动创建Spring容器并从中获取所需的Bean。以下面的两行常见代码为例: ApplicationCo…

【教程】混淆Dart 代码

什么是代码混淆? 代码混淆是一种将应用程序二进制文件转换为功能上等价,但人类难于阅读和理解的行为。在编译 Dart 代码时,混淆会隐藏函数和类的名称,并用其他符号替代每个符号,从而使攻击者难以进行逆向工程。 Flut…

基于SpringBoot的“垃圾分类网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“垃圾分类网站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统功能界面图 用户登录、用户注…

SpirngBoot开发常用知识

springboot开发常用知识 命令行打包SpringBoot打包插件window端口命令临时属性设置热部署启动热部署热部署范围 常用计量单位数据校验加载测试的专用属性Web环境模拟测试如何发送虚拟请求业务层测试回滚随机产生测试用例内置数据源 命令行打包 对SpringBoot项目进行打包命令行…

适用于 Windows 10 的 10 大免费数据恢复软件

数据丢失可能是一场噩梦,尤其是在涉及重要文件和文档时。无论是由于意外删除、系统崩溃还是病毒攻击,找到适合 Windows 10 的文件夹恢复软件都可以在恢复丢失的数据方面发挥重要作用。在本指南中,我们将探索适用于 Windows 10 用户的 10 大免…