🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!欢迎志同道合的朋友一起加油喔🦾🦾🦾
目录
前言
进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备“隔离性”。
什么是进程?
简单理解为跑起来的程序~~
像点开许多桌面软件的图标
XX.exe都称为“可执行文件”
这些文件在双击前都静静的躺在硬盘上,双击前,这些文件不会对你的系统有任何影响。
但双击执行exe文件后,操作系统就会把这个exe给加载到内存中,让CPU执行exe内部的一些指令。开始进行一些具体的工作,把这些运行起来的可执行文件,称为“进程”
通过电脑的任务管理器就可以查看当前运行的进程信息:
那要管理那么多内存,操作系统应该怎么进行区分和管理呢:
1.描述,使用一个类或者结构体,把这个进程的信息表示出来,我们简称PCB(progress control block)进程控制块,不是PCB板,这就是一个结构体,里面包含了进程的核心信息;
2.组织:利用数据结构把多个PCB给整理到一起,比如双向链表
创建进程:先创建出PCB,然后把PCB加入到双向链表中;
销毁进程:找到链表上的PCB,将其从链表上删除;
查看任务管理器:遍历链表。
二.PCB中的一些属性
pid(进程id)
这个很好理解,就是进程的身份标识(进程的身份证号)
内存指针
指明了这个进程要执行的代码/指令在内存的哪里,以及这个进程执行中依赖的数据都在哪里~~当运行一个exe
,此时操作系统就会把这个exe
加载到内存中,变成进程。
简而言之内存指针就像航海指南,能够给进程指一条明路~
文件描述符表
程序运行过程中,经常要和文件打交道,进程每次打开一个文件,就会在文件描述符表上多增加一项(这个文件描述符表可以视为一个数组,里面的每个元素又是一个结构体,就对应一个文件的相关信息)一个进程只要一启动,不管你代码中是否打开/操作文件的代码都会默认的打开三个文件~~(系统自动打开的):标准输入(System.in
)标准输出(System.out
)标准错误(System.err
)
这个文件描述符表的下标,就称为文件描述符~
进程调度的基本过程是怎样的?
进程的调度,其实就是,操作系统在考虑CPU资源如何给各个进程分配~
上面的属性是一些基础的属性,下面的一组属性,主要是为了能够实现进程的调度~
状态
这个状态就描述了当前这个进程接下来应该怎么调度~~
就绪状态:随时可以去CPU
上执行。
阻塞状态/睡眠状态:暂时不可以去CPU
上执行。
优先级
先给谁分配时间,后给谁分配时间,以及谁分的多,给谁分的少。(这里的优先级只是建议,系统不一定采取)
记账信息
统计了每个进程,都分别被执行了多久,分别都执行了哪些指令。分别都排队等了多久,目的是给进程调度提供指导依据的。
上下文
表示上次进程被调度出CPU
的时候,当时程序的执行状态~~,下次进程上CPU
的时候,就可以恢复之前的状态,然后继续往下执行。
进程被调度出CPU
之前,要把CPU中的所有的寄存器中的数据都给保存到内存中(PCB
的上下文字段中)
相当于玩单机游戏的时候的存档~~
下次进程再被调度上CPU
的时候,就可以从刚才的内存中恢复这些数据到寄存器中
相当于读档继续玩游戏~
存档+读档~存档存储的游戏信息,就称为“上下文”
总结
所谓的调度就是进行时间管理
进程的调度,其实就是操作系统在考虑CPU资源如何给各个进程分配--
由于操作系统上,同时运行多个进程,此时如果某个进程出现BUG,进程崩溃了,是不会影响其他进程的,因为进程之间通过虚拟地址空间,已经各自隔离开了,但实际工作中进程之间还是需要相互交互的。