20231116
操作系统 -> 软件
1.管理各种硬件设备
2.给软件提供稳定的运行环境
软件工程的本质:就是针对''复杂程度''的管理
人脑能够思考的复杂程度是有限的
如何管理"复杂程度"的核心就是"抽象封装"
--->同一时刻只关注其中的一个部分~
Windows,linux,mac,ios...
进程,任务
进程就是操作系统提供的一个软件资源
咱们现在使用的系统,都是"多任务操作系统"
--->同一时刻,可以运行多个任务
单任务没有"后台执行"
要想执行 另一个程序就需要先退出前一个程序
单任务非常不方便,所以多任务才是当下主流的方式
对于多任务的系统来说,进程的概念就非常重要了
换而言之,也可以认为计算机中的每个进程在运行的时候都需要分配一定的系统资源
进程是系统分配资源的基本单位
在计算机中都是内存和外存,不要说运存什么的...
进程在系统中是如何管理的???
操作系统的进程管理 --> 先描述,再组织
描述--->使用类或者结构体把实体的属性给列出来
组织--->使用一定的数据结构,把这些结构体或者对象给串到一起
表示进程控制的结构体,叫做PCB(Process Control Block)进程控制块
PCB是属于操作系统学科的通用概念
在Windows在Linux上都可以成为 PCB
在linux上,PCB是一个叫做struct task_struct{...}这样的结构体
(要将看到的直观效果,跟代码的图景联系起来)
在Linux中是使用链表这样的数据结构将若干个task_struct给串起来的
当我们看到任务管理器的这些进程的时候,意味着系统内部在遍历链表,并且打印每个节点的相关信息
如果运行一个新的程序,系统中就会添加一个PCB,添加到链表上,结束进程就会删除一个节点
如果程序崩溃,是属于异常,系统就能"try-catch"住这样的异常,并且对齐做善后处理
也有些程序,崩溃了可能会导致系统崩溃的
比如有些程序,是带有驱动的,驱动实在内核中执行的,可能会导致系统卡死或者崩溃
PCB中的一些核心属性
PCB这个结构体是一个非常庞大的结构体(有上百个属性)
核心属性:
pid:进程的身份标识
此处是使用一个不重复的整数来区分的
后续根据某个进程进行操作,就可以拿着这个pid来进行区分了
比如,选中某个进程,点击结束任务,此时任务管理器获取到你选中的pid
调用一个系统api,将pid作为参数传进去,从而杀死进程
内存指针
进程运行过程中,需要消耗一些系统资源,其中内存就是一个重要的资源
整个系统有16G内存,16G不能随便用,得向系统申请,才能使用
每个进程都必须使用自己申请到的内存
内存指针,就是用来描述说你这个进程,都能使用哪些内存(描述内存资源的详细情况)
一个进程跑起来之前,指令和数据都要先(数据比较大就会导致开的慢)加载到内存中
外挂的工作原理很多都是在加载内存的时候操作的
文件描述符表(描述了这个进程涉及的硬盘相关的资源)
每个进程的文件描述符表是一个数组,存指针,指针指向内核中表达打开文件的结构体
文件描述符表是通过文件描述符来管理打开的文件或io资源
进程经常要访问硬盘
操作系统对硬盘这样的硬件设备进行了封装-->文件
存储器 ->内存+外存
外存(包含但不限于硬盘,软盘,光盘,U盘flash...)
不管什么盘,都是统一的抽象,按照"文件"的方式来操作的
一个经常想要操作文件,需要先"打开文件",就是让你的进程在文件描述符表中创建一个表项(构造一个结构体),表示这个文件的相关信息,看看都打开了哪些文件
操作系统提供的api,叫做open
内存,硬盘,网卡等资源在pcb中都好体现
一个进程,消耗cpu资源是啥意思???
cpu是一个舞台,要执行的指令是演员(进程要执行指令)
cpu可能有一个核心,也可能有很多核心
演员需要登上舞台才能进行表演
同一时刻,一个舞台只能有一个演员
假设电脑有16个cpu,但是进程却远远大于cpu个数
这就涉及到一个非常关键的概念---分时复用(并发)
关键要点:多个演员轮流登台
假设现在咱们得电脑上只有一个核心
只要两个进程切换的速度足够快,人眼看起来就像多个任务是同时执行的
后来,随着多核cpu诞生,同时执行进程,就变得更加复杂了
此时此刻,在微观上,几个进程是真正的同时执行,而不是靠快速切换
但是"并发执行"仍然存在
现在计算机的执行过程往往是并行+并发同时存在的
并行和并发怎么样都是看系统调度的
咱们感知不到也干预不了
往往就把这种并行和并发统称为并发了
对应的编程方式(解决一个问题,同时高多个任务协同完成,就叫并发编程)
进程的调度 - 分时复用,并发执行
PCB就得提供一些属性来支持系统完成这些进程的调度
状态
描述某个进程是否能够描述某个进程方不方便
就绪状态:随时准备好执行
阻塞状态:这个进程不方便去cpu执行
其他的状态,暂时不做展开
优先级
多个进程等待系统调度
多个进程之间调度的先后关系不是那么平均的
先调度谁,后调度谁,谁长谁短
上下文
记账信息
针对每个进程,占据了多少cpu时间进行一个统计
会根据这个统计时间结果调整调度策略
因此就需要在下一轮次进行调整,确保每个进程都能分配到cpu