[JavaEE]———进程、进程的数据结构、进程的调度
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你!
目录
一:操作系统
1:操作系统的定位和功能
2:多任务操作系统
3:单任务操作系统
二:进程、任务
1:进程概念
2:进程是“系统分配资源”的基本单位
3:操作系统的进程管理
(0)PCB
(1)描述PCB
(2)组织PCB
(3)实例
(4)PID
(5)内存指针
(6)文件描述符表
三:进程的调度
1:分时复用,并发执行
2:并行执行
3:并发编程
4:状态
(1):就绪状态
(2):阻塞状态
5:优先级
6:记账信息
7:上下文
引入:软件工程的本质,针对“复杂程度”的管理,管理的本质就是“抽象和封装”
一:操作系统
1:操作系统的定位和功能
(1)管理各种硬件设备
(2)给软件提供稳定的运行环境
2:多任务操作系统
顾名思义,在同一时刻,后台可以有多个应用程序,比如我可以开着qq,微信聊天,听着网易云,时不时刷刷知乎........
3:单任务操作系统
一个时刻只能有一个程序,像以前市面上的山寨机,多是这种操作系统,
二:进程、任务
1:进程概念
正在运行的程序就叫做进程或者任务
2:进程是“系统分配资源”的基本单位
每个任务在执行的过程的当中,都需要消耗一定的硬件资源。换而言之(等价说法),进程在运行过程中,都需要给进程分配系统资源。
3:操作系统的进程管理
简述(具体过程比下文更加复杂):
(0)PCB
①PCB:表示进程信息的结构体,进程控制块(Process Control Block)简称为PCB,这个概念是操作系统中通用的概念
在Linux上PCB具体表现为一个叫做 struck task_struck{......}这样的一个结构体。
②类/结构体:用来描述一些实体的属性的集合
(1)描述PCB
通过PCB来描述实体的属性
(2)组织PCB
通过数据结构,把这些进程控制块串在一起
在Linux中,通常用链表来把若干个进程控制块串联在一起
(3)实例
在我们打开任务管理器的时候会显示很多进程,其实就是系统在遍历链表后,打印链表上节点的信息。
如果运行一个新的程序,系统就会多一个进程,就需要构造一个新的PCB,并把这个PCB加入到链表的节点中去
如果退出一个进程,就把对应的PCB在链表上删除,并且回收掉相关的PCB的资源
(4)PID
PID是PCB的核心属性之一
PID是进程的身份标识,具体表现形式为,一个整数,同一台机器,同一时刻,每一个进程都有一个不同的整数数字标号,后续如果要对进程进行一些操作,我们就可以根据这个数字来区分进程
比如:当我们要结束一个进程的时候,选中进程,点击结束任务,任务管理器获取到这个进程的PID,然后调用一个系统API,把这个pid作为参数传入,最后完成杀死进程的一个操作
(5)内存指针
内存指针就是描述进程使用内存资源的详细情况。
进程在运行起来之前,需要向系统申请一块内存空间,系统同意后给进程分配内存资源,进程才可以运行,
进程运行起来之后,也需要和“数据”“指令”进行配合,所以进程需要知道哪里存的是“数据”,哪里存的是“指令”
(注:数据和指令也都是需要存到内存当中的,在进程跑起来之前,数据和内存就需要提起加载到内存当中去)
打个比方:进程现在要去住旅馆,像旅馆馆主申请房间,馆主同意后分配给你一个房间,你就只能在这个房间中活动,
(6)文件描述符表
文件描述符表是用来描述进程所涉及到的硬盘资源
存储器=内存+外存,外存包括但不限于(硬盘,光碟,u盘,软盘等),因为现在硬盘居多,所以我们说的外存默认都指硬盘。
进程想要修改文件,那么就得先“打开文件”——:在文件描述符表上分配一个表项,构造一个结构体,来描述这个文件的实体信息
三:进程的调度
背景描述:进程在运行的时候需要消耗占用一定的CPU资源,而在同一台机器同一时刻有5个进程需要“同时”运行,那cpu是如何处理的呢?
1:分时复用,并发执行
打个比方——只有一个单核CPU(一个舞台),现在需要5个进程同时运行(上舞台表演),(同一时刻,同意舞台只能有一个进程)怎么办,那就只能压缩每个进程表演的时间,(进程ABCDE超速轮回切换上台),人是感知不到这个切换的过程的(因为cpu的频率足够高),这样肉眼就会误以为是五个进程在“同时运行”。
当然也有极端情况,进程数量太多了,cpu处理不过来,表现出来就是系统卡顿,鼠标转圈。
2:并行执行
同样打比方——现在我们有一个四核cpu,8个进程,同样要让这些进程满足同一时刻,同一舞台,只能有一个进程表演,要达到肉眼难以区分的切换速度,这个过程就要复杂许多了
但是这里任然满足“分时复用,并发执行”这一概念,在此基础上多了一条“并行执行”(因为舞台数多了嘛)
3:并发编程
我们现在计算机的执行过程是 “并发执行”+“并行执行”同时存在的,所以我们就把这两者结合统一叫成“并发编程”
但是两个进程如何运行需要看系统如何调度,这里涉及到系统调度器模块的实现(略)
4:状态
状态是描述进程是否能被cpu调用执行
(1):就绪状态
进程此时空闲,整装待发,操作系统知乎一声,进程直接就上cpu那开始干活了
(2):阻塞状态
也可以理解成进程正在等待,比如用户调用Scanner,进程需要等待用户输入东西,在这个过程中,进程是不方便被操作系统调用去干别的事的,这就是阻塞状态。
5:优先级
我们在前面说了,舞台只有4个,但是我有很多个进程,那么谁先上呢?这里就涉及到一个优先级的问题了,看那个进程比较重要,由操作系统来进行统一调配。
比如:我在打王者农药,同时又挂着微信,此时有人给我发消息,系统肯定是先紧着农药,消息晚点收也无所谓~~~~这就是优先级
6:记账信息
这个概念也很好理解,,这个红字中怎么判断,哪个进程重要呢?这就涉及到了记账信息。
我们还是用进程舞台演出的例子哈,在一个轮次中,每个进程表演的时间不同(即进程在CPU中占用的时间比例不同),我们统计这一轮中进程的时间占比,作为记账信息,在下一轮中操作系统根据这个信息来对新一轮的进程进行优先级安排。
7:上下文
也是pcb(进程控制模块)中的一种数据结构,支撑进程调度的重要属性之一,相当于单机游戏中的存档和读档。
1:存档
在进程被cpu调度之前,把普通寄存器当中的信息,单独保存到一个地方(一般是内存的关键寄存器中),不要让这些信息被覆盖或者消失。
2:读档:
在下一次进程被cpu调度之前,把关键寄存器当中的信息给恢复加载到普通寄存器当中
注:无论存档还是读档都是在cpu调度进程之前