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


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

相关推荐
hopetomorrow12 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
郑祎亦21 分钟前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
不是二师兄的八戒21 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
小牛itbull21 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i30 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落33 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
爱编程的小生33 分钟前
Easyexcel(2-文件读取)
java·excel
GIS瞧葩菜42 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法