【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资源,就会进行统计,给得到的资源比较少的进程适当的多分配一点


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

相关推荐
zjw_rp20 分钟前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob33 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
TodoCoder41 分钟前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
engchina1 小时前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行1 小时前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
诚丞成1 小时前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
Smile灬凉城6661 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
lsx2024062 小时前
SQL MID()
开发语言
Dream_Snowar2 小时前
速通Python 第四节——函数
开发语言·python·算法