什么是进程?
进程也叫做“任务",一个跑起来的程序,就称为”进程“。例如QQ.exe叫做”可执行文件“或者是”可执行程序,是一个存储在硬盘上的文件。当我们双击QQ.exe文件,操作系统就会把这个文件的核心数据给加载到内存中,系统中就会生成一个进程,此时我们可以在任务管理器中查看。
操作系统是如何管理进程的
1.如何描述进程
操作系统通过PCB(进程控制块)来描述一个进程,一个进程中可能有多个PCB,每个PCB中存储了进程的属性/信息。
PCB
- pid: 进程的身份标识,通过pid来区分进程
- 内存指针: 描述进程持有的内存资源,在我们双击可执行文件后,操作系统就会把文件中的核心内容给加载到内存中。内存有的空间是用来存放指令的,有的用来放数据,有的用来维护运行状态…而内存指针就是用来描述哪块内存是用来干什么的
- 文件描述符表: 描述进程持有的文件资源,每个进程,都会打开一些文件,文件描述符表记录了当前进程打开了哪些文件。
由于内存指针和文件描述符表的存在,让进程成为了操作系统分配资源的基本单位
- 进程状态: 就绪状态的进程才能上CPU执行,阻塞状态不能上CPU执行
- 进程优先级:系统调度时,根据优先级,来给进程安排时间
- 进程上下文:进程在CPU上执行了一会,要切换到另外一个进程,就需要保存当前进程运行的中间结果(存档),下次再切换回来的时候,就恢复之前的中间结果(读档),继续往下执行。进程的上下文就是CPU寄存器的值,寄存器中包含了运行的中间结果,需要把这些结果给保存到PCB的上下文信息中(内存)。
- 进程记账信息:记录每个进程在CPU上执行的时间,虽然进程之间有优先级,但是操作系统要保证每个进程都能被执行到。
以上4点属性都和进程调度有关,CPU资源有限,需要合理安排
2.如何组织进程
操作系统通过双向链表来组织PCB。创建一个进程时,本质上就是创建一个或多个PCB,加入到链表上;销毁一个线程时,本质上就是从链表上删除对应的PCB节点;而我们查看任务管理器时,就是在遍历这个链表
3.虚拟地址空间
操作系统会给每个进程分配内存资源,但是在某些情况下,可能会出现内存访问越界的情况。如进程1访问了进程2的内存空间。为了避免这样的情况,就给每个进程划分虚拟内存空间(不是真实的问了内存空间)要通过专门的设备MMU来完成虚拟地址到物理地址的映射
使用虚拟地址空间,使得进程之间存在了“隔离性”一个进程是不能直接访问另外一个进程的内存数据的。
4.进程间通信
虚拟地址空间让进程间有了隔离性,但是有些场景又需要多个进程相互配合,因此又引入了进程间通信。其核心就是找到一块多个进程都能访问到的公共资源,然后基于公共资源来交换数据。类似学校放外卖的架子