进程就是运行起来的程序~
同一时刻,系统中的进程有很多,操作系统就会对这些进程进行管理
管理需要包含两个方面:
1️⃣描述:
描述进程的属性/信息是通过结构体来描述的(因为是用C++ 实现的),结构体里面包含一个进程的各种信息,这个结构体叫做PCB(进程控制块)
2️⃣组织:
系统中通常会使用双向链表这样的结构来把PCB来组织在一起
🎐创建一个进程,本质上就是创建PCB,并且加入到链表上~
🎐销毁一个进程,本质上就是从链表上删除对应的PCB结点~
🎐查看任务管理器的进程列表,本质上就是在遍历这个链表~
一个进程可能是一个PCB,也可能对应多个
系统管理PCB的链表也不一定是一个

例如网易云音乐里面现在有4个进程,它们的PID都不同.
PID就是进程的身份标识
一个主机,同一时刻,这些进程的pid是唯一的,通过pid来区分一个进程

一个可执行文件,双击后开始运行,系统把文件中的核心数据(要执行的指令依赖的数据)加载到内存中!
那么就势必要给进程分配内存空间,然后这个内存空间上就有很多区域,有的用来放指令,有的用来放数据,有的用来维护运行状态…
内存指针的作用就是来分配哪块指针是干什么用的~
描述进程持有的 内存资源

每个进程都可以打开一些文件(文件其实是存储在硬盘上的数据)
文件描述符表里面就记录了当前进程都打开了哪些文件
(打开了之后就可以后续针对这些文件进行读写操作了)
描述进程持有的 文件资源

下面的一组属性都和"进程调度"有关,这一组属性存在的意义就是为了支撑"进程调度"
- 进程状态
- 进程优先级
- 进程上下文
- 进程记账信息
CPU资源有限,需要合理安排,电脑在运行时进程有很多,而6核CPU只同时可以跑6个任务,那电脑是怎么运行的呢?
CPU运算能力,和集成程度密切相关(单位面积下元件越多,单个元件足够小)
单核提升能力有限就可以搞多个核心~并行执行
每个CPU核心上都可以独立的运行一个进程(运行进程的相关指令)
多个CPU核心,就可以同时独立的运行多个进程并发执行
一个CPU核心,先运行进一下程1,再运行进程2,再运行进程3…
只要微观上切换的足够快,宏观上看起来就好像是3个进程同时运行一样~
现在计算机上都是并行和并发相结合
所谓的进程调度就是通过"并行"和"并发"的方式让计算机可以"同时"执行多个进程(任务)
这是多任务的操作系统(比如手机打游戏的时候也可以收到微信消息)

阻塞状态的进程,无法被调度到CPU上执行
就绪状态的进程,才能上CPU来执行

谁先谁后,主次之分~
喜欢的就多排一点时间,优先排!
不喜欢的就少排时间~
系统调度的时候,就会根据优先级,来给进程安排时间!
创建进程的时候,可以通过一些系统调用来干预优先级(相对的,也要看其他的进程的优先级情况)

进程再CPU上执行了一会之后,要切换给别的进程,就需要保存当前运行的中间结果(存档),下次再轮到他执行的时候,就恢复之前的中间结果(读档),继续往下执行.
对于进程来说,上下文就是CPU中寄存器的值
(寄存器的值就包含了运行的中间结果,需要把这些结果保存到PCB的上下文信息中(内存))
🎭比如我做题做一半去开门了,回来之后要继续做题(不能去刷视频)!

每个进程在CPU上执行了多久,统计信息
是辅助调动的效果~
执行进程的时候虽然有优先级,但是还是不希望让有的进程完全捞不到CPU
通过进程记账信息,看一下给某一个进程安排了多少时间,如果太少就再安排一些(优先级提高一下)
💟作用是让运行更加均衡,避免有进程完全捞不到CPU执行~
运行时会给每个进程安排一些内存资源
假如是简单的按照下图这样分配就不太科学…

💦假设出现极端情况,进程1中出现了内存访问越界这样的危险操作!(解引用 野指针:保存了一个无效的内存地址,解引用这个内存)
❗就有可能越界访问到进程2的内存中,那么就会导致进程1的bug会影响到进程2!
上述操作就会产生进程间的相互影响~
为了解决这个问题,就需要让每个进程都有各自的内存空间(活动范围)
不要让这些进程的活动范围重叠~
💌虚拟地址空间:
给每个进程划分的内存空间,都叫做"虚拟地址空间"(不是真实的物理内存地址)
通过专门的设备MMU来完成 虚拟地址 到 物理地址 之间的映射!
针对进程1和进程2来说,能够访问的内存空间就只是0x0 - 0xFFFF这么大的一段~
如果不小心访问了更大的内存空间,在MMU映射的时候就能及时发现,从而避免对物理内存产生影响
MMU就可以针对地址进行校验,如果地址非法,就直接通知进程(比如把进程给杀死),从而及时止损,避免影响到其他进程的运行~
使用虚拟地址空间,就认为进程之间存在了"隔离性"
一个进程是不能直接访问另一个进程的内存数据的!
防止干扰的操作,提高了系统的稳定性!!

有了隔离性之后,虽然进程是稳定了,但也有新的问题!
有些需求场景,就需要多个进程相互配合,进程隔离了,此时进程之间就很难交互了
所以系统又引入了一个机制:进程间通信
无论是哪种进程间通信,核心原则相同:
| 找一个多个进程都能访问到的公共资源,然后基于公共资源来交换数据~ |
目前,主流操作系统提供的进程通信机制有如下:
其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。
