【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/标识符

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

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

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


  1. 文件描述符表

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

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

  1. 进程调度的相关属性

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

什么是进程调度

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

并行与并发

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

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

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

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

进程调度的相关属性

  1. 状态

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

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

  1. 优先级

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

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

  1. 上下文

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

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

  1. 记账信息

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


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

相关推荐
appearappear1 分钟前
Mac 上重新安装了Cursor 2.2.30,重新配置 springboot 过程记录
java·spring boot·后端
CryptoRzz10 分钟前
日本股票 API 对接实战指南(实时行情与 IPO 专题)
java·开发语言·python·区块链·maven
yugi98783811 分钟前
基于M序列的直扩信号扩频码生成方法及周期长码直扩信号的MATLAB实现方案
开发语言·matlab
程序员水自流12 分钟前
MySQL数据库自带系统数据库功能介绍
java·数据库·mysql·oracle
谷哥的小弟17 分钟前
Spring Framework源码解析——RequestContext
java·后端·spring·框架·源码
乾元18 分钟前
基于时序数据的异常预测——短期容量与拥塞的提前感知
运维·开发语言·网络·人工智能·python·自动化·运维开发
江上清风山间明月19 分钟前
使用python将markdown文件生成pdf文件
开发语言·python·pdf
j_xxx404_22 分钟前
C++算法入门:二分查找合集(二分查找|在排序数组中查找元素的第一个和最后一个位置)
开发语言·c++
天远Date Lab22 分钟前
Java微服务实战:聚合型“全能小微企业报告”接口的调用与数据清洗
java·大数据·python·微服务
ss27325 分钟前
阻塞队列:ArrayBlockingQueue如何用Lock与Condition实现高效并发控制
开发语言·python