当前位置: 首页 > news >正文

【JavaEE】认识进程


一、操作系统(operating system)

操作系统是一组做计算机资源管理的软件的统称,它能够把一个计算机上的所有硬件资源和软件资源都管理好:能够管理好各种硬件资源,让他们很好的相互配合,能够管理好各种软件资源,为每个软件都提供稳定的运行环境

操作系统的内核

操作系统由 内核配套的应用程序 组成:操作系统对硬件、软件的管理都是在内核中完成的

配套的应用程序也是靠内核一些功能作为支撑,举一个例子:

写了这样一个代码:System.out.println("hello world");

这就是一个“应用程序”,这里println需要操作显示器,而显示器是一个硬件设备,应用程序并不能直接操作,所以应用程序会告诉操作系统它要操作显示器,接下来操作系统内核就会给应用程序提供一系列的api(有的api是操作显示器的,有的是响应鼠标键盘的,有的是操作网卡的,这里会调用操作显示器的api)

具体过程:1. 应用程序执行println,调用操作系统内核给应用程序提供的api;2. 操作系统内核里感知到要操作显示器的行为;3. 操作系统通过驱动程序(操作系统和硬件设备之间的接口)找到对应的硬件设备(显示器),并且执行显示字符串的操作

二、进程(Process)

一个程序运行起来,在操作系统中就会出现一个对应的进程,换言之,进程就是程序的一次运行过程

由上图可以看出,操作系统是一个进程一个进程的分配资源的,所以又可以称进程是操作系统分配资源的基本单位

进程控制块(PCB)

一旦进程多了起来,操作系统就会对这些进程进行管理 => 所谓管理就是<先描述,在组织>

描述是通过一些 结构体/类 把进程的核心信息抽象提取出来,在操作系统中是通过PCB这样的结构体来描述进程(假设这里的进程都是单线程←这句话到后面就理解了)的,结构体中包含进程的核心信息

管理是通过数据结构例如线性表、搜索树等将每一个PCB联系起来,方便在管理时进行增删查改


假如是通过链表将每一个PCB联系起来的,

1.在上图中显示了每一个进程,这就相当于遍历链表的每一个结点,并显示每一个进程

2.创建一个新的进程(双击某个程序):新的进程创建一个对应的PCB,并添加到链表中

3.销毁某个进程(退出某个程序):把链表中某个结点删除

PCB中的主要信息

1. pid:进程的 id/标识符


2. 内存指针:一个进程运行时需要消耗一定的硬件资源,内存就是一个关键的硬件资源,一个程序在运行时,就会将运行该程序的指令和依赖的数据从硬盘加载到内存中,之后,内存指针(这是一组指针,不只有一个)就会告诉操作系统要运行的指令都在内存的哪里,进程依赖的数据都在内存的哪里

此时 test.exe 这个文件就在硬盘中

双击这个程序 => 此时操作系统就会产生一个进程,创建PCB并将PCB加入到内核的链表中


3. 文件描述符表

一个文件运行的时候,会操作一些文件,通过“顺序表”这样的数据结构,记录下当前这个进程都打开了哪些文件

文件描述符表在未来会再进行详细讲解

4. 进程调度的相关属性

进程调度的属性有:状态、优先级、上下文、记账信息;

什么是进程调度

上图是一个任务管理器的界面,可以看到有很多进程,每一个进程都要执行,但凡要执行就要占用CPU资源,我们的CPU是多核心CPU,每一个核心都可以各自工作、互不影响,但即使如此进程的数量还是远远多于CPU核心的数量,为了让核心更有效率的执行进程,就需要进程调度来负责了

并行与并发

一个核心同一时刻只能执行一个进程,有16个核心,同一时刻就可以同时运行16个进程,这就是并行执行

 虽然一个核心同一时刻只能运行一个进程,但是CPU切换进程的速度极快,比如把总的执行时间分为好几块,每一个时间块都运行一个进程,在极快的切换速度下,站在人的角度就是几个进程同时运行,这就是并发执行

操作系统会按照并行 + 并发的方式执行所有的进程

具体什么时候用什么方式,操作系统的内核都已经管理好了,编写应用程序的时候无法干预,普通用户也感知不到,所以往往会把并行和并发统称为“并发”

进程调度的相关属性

1. 状态

阻塞状态,处于阻塞状态的进程无法在CPU上执行,比如该进程在等待一些IO操作时就会处于阻塞状态(例如scanner.next,如果不输入一些东西,该进程就会一直处于阻塞状态),阻塞状态的相反就是就绪状态

状态这里在未来讲到线程的时候会做更详细的区分

2. 优先级

进程之间也会有优先级,CPU在执行进程时会考虑进程的优先级

不止是进程的执行顺序有优先级,CPU给不同的进程分配的资源也具有优先级,有的进程吃到的CPU资源多,有的少

3. 上下文

进程在CPU执行过程中,会产生很多的“中间结果”,在进程切换出CPU之前,就需要把这些中间结果(CPU的各种寄存器中的值)保存到pcb的上下文里(寄存器 -> 内存),这个操作相当于存档

下次这个进程回到CPU上执行的时候,就需要把之前的存档回复回来(内存 -> 寄存器)

4. 记账信息

延续刚才优先级,操作系统为了避免某个进程一直吃不到CPU资源,就会进行统计,给得到的资源比较少的进程适当的多分配一点


🙉本篇文章到此结束,接下来将会开启多线程的学习


http://www.mrgr.cn/news/66659.html

相关文章:

  • 【MyBatis源码】CacheKey缓存键的原理分析
  • flink 内存配置(三):设置JobManager内存
  • HarmonyOS 移动应用开发
  • Flutter UI架构(3)
  • 前端部署到Nginx服务器后产生的一些问题原因,如请求接口报错,或刷新页面后报500错误……
  • 【双指针】【数之和】 LeetCode 633.平方数之和
  • C#-MemoryMarshal
  • (十三)JavaWeb后端开发——MySQL2
  • 微控制器(MCU)如何运行存储在Flash的程序???
  • 基于python构造电影neo4j知识图谱
  • MongoDB基础介绍以及从0~1语法介绍
  • WEB:如何优化大数据菜单展示的攻略指南
  • 平衡的二叉搜索树 —— AVL树
  • 基于java+SpringBoot+Vue的旅游管理系统设计与实现
  • 小菜家教平台(二):基于SpringBoot+Vue打造一站式学习管理系统
  • 【JAVA】Java基础—基础语法:控制结构(条件语句、循环结构)
  • 省级-财政分权数据(2000-2022年)
  • redis学习万字详解(一)
  • 鸿蒙跳转商店应用页面(给我评分功能)
  • 跳表原理-课堂笔记
  • 职业院校关于大数据、云计算和物联网传感器技术的结合与应用探讨
  • TensorRT-LLM的k8s弹性伸缩部署方案
  • 用 Python 自动检测交易图形态的实用指南请查收
  • 【Rust Crate之Actix Web(一)】
  • i2c-tools 4.3 for Android 9.0
  • Redis完全指南:从基础功能到缓存管理与高可用性设计