进程(Process)
进程(Process) / 任务(Task)
进程是操作系统中的非常重要的软件资源,把一个可执行程序跑起来,系统中就会创建一个对应的进程
如果这个程序执行结束了,系统就会随之销毁对应的进程
进程就可以看成是一个程序的执行的"过程"
注意区分 程序 / 可执行文件 vs 进程 :
可执行文件
任务管理器
.exe 就是一个磁盘上的文件,静态的,如果不去动,就不会发生变化
(当双击这个exe文件时,操作系统就会加载这个可执行程序,把 exe 文件中的很多内容都加载到内存中了,分配一些资源,并开始执行这个可执行程序中包含的指令)
这就是一个 进程
进程也可认为是操作系统进行资源分配的最小单位
以 Linux 为例介绍进程 :
- 在内核中使用一个 task_struct(PCB 进程控制块) 的结构体来描述进程 (C语言)
- 每创建一个进程就同时创建一个PCB这样的类的实例,使用双向链表把所有的 PCB 对象串到一起
- 双击一个 exe创建一个进程的时候,本质上就是在内核中,先创建了一个PCB对象,然后把这个对象加入到链表中
- 关闭一个程序,结束一个进程的时候,本质上就是在内核中,找到这个对应的PCB对象,然后从链表上删掉,并且释放该对象
- 通过任务管理器查看到的所有进程信息,本质上就是在遍历内核中的这个链表,依次读取对应的PCB的节点的信息
描述 : PCB
组织 : 双向链表
PCB里面包含的信息 :
- PID (进程 id ) 进程的身份标识
PID : 进程 id 进程身份标识符
先双击 qq 音乐 得到进程 id p1;
关闭再打开 得到进程 id p2;
p1 != p2
-
一组内存指针,指向该进程持有的一些重要的数据在内存(系统给进程分配的资源的一部分)中的位置
执行的指令都有什么
这些指令依赖的数据是什么 -
状态
-
优先级 : 安排时间表的时候,优先给谁安排
-
进程的记账信息 : 记录这个进程在CPU上执行多久了,用来辅助决定这个进程是继续在CPU上执行,还是调度出去
-
上下文 : 需要记住上次运行到哪个指令了,方便下次调度的时候能够继续从这个位置来运行(存档和读档)主要是存储进程调度出CPU之前,寄存器中的信息(把寄存器信息保存到内存中),等到进程下次恢复到CPU上执行的时候,把内存保存好的的数据恢复到寄存器中.
进程的虚拟地址
一个进程要想运行,就需要给它分配一些系统资源,其中内存就是一个最核心的资源
物理地址: 真实的内存地址
为什么使用虚拟地址,不让进程直接访问真实的物理地址:
目的就是为了一定程度的减少内存访问越界,带来的后果
其他的概念
一个进程的状态:
R : 就绪状态.正在cpu上执行,或者即将执行
S : 睡眠状态, 这些进程没法在CPU上执行,而是在等待
D : 深度睡眠状态,进程在长时间的忙于IO操作,没时间理会CPU
X : 退出状态,进程已经被销毁了
抢占式调度:
操作系统的调度器会频繁的进行进程的切换,哪怕某个进程做了某个工作的一般,也是随时可能被打断
内核态与用户态
操作系统内核作位直接控制硬件设备的底层软件,权限最高,称为内核态
用户程序的权限最低,称为用户态