进程(Process)
可执行文件(.exe)
当一个程序(.exe文件)运行起来之后就形成了一个线程。
通过任务管理器我们可以观察电脑所有线程
进程管理
一台电脑时时刻刻都运行着上百条进程,为了便于管理,就有了进程管理。
进程管理的步骤
- 描述进程:通过结构体/类,把一个进程包含哪些信息表示出来
- 组织进程:使用一定的数据结构,把结构体/类存放在一起
进程控制块(PCB)
进程管理就是利用一些数据结构,把PCB组织在一起,比如双向链表。
1.创建进程:就是创建一个链表的结点
2.销毁进程:就是删除链表上的结点
3.遍历进程列表:就是遍历链表
- pid
每个进程都有唯一的一个身份标识
第一次打开QQ,会产生pid1
关闭QQ后,再次打开,会产生pid2
pid1 != pid2
- 内存指针
描述该进程的内存中哪部分是指令,哪部分是数据
操作系统有时要把一些必要的数据加载到内存中,运行的指令(代码),运行时依赖的全局变量
3.文件描述符
一个进程会打开很多的文件,对应一组文件描述符表(顺序表),每个元素代表一个打开的文件,表中对应的下标就是文件描述符
进程调度
- 进程状态
创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成(资源无法满足),就无法被调度运行,把此时进程所处状态称为创建状态。
就绪状态:进程已经准备就绪,已分配到所需资源,只要分配到CPU就能够立即运行。
执行状态:进程处于就绪状态被调度后,进程进入执行状态。
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用。
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行。
2.进程的优先级
系统按照不同的优先级调度进程的运行,优先级高的进程有先执行的权利。
A进程优先级最高、B进程优先级居中、C进程优先级最低
最后执行顺序为A>B>C
3.进程的上下文
进程在离开CPU时,会把寄存器的值保存在PCB的上下文字段中,再次执行时会把PCB中的值恢复到寄存器中并继续执行。
进程暂时离开,才会进行存档
进程执行结束,不会存档
4.进程的记账信息
统计每个进程在CPU上的执行时间,用来作为进程调度的参考依据
内存管理
操作系统对内存的分配,采用的是空间模式(不同进程使用内存中不同的区域,相互之间不会造成干扰)。
这个图描述的是进程1和进程2直接访问物理内存。这种访问可能会造成进程间相互干扰,如果进程1发生数据下标越界等问题,可能会访问到进程2所指向的内存。
虚拟地址空间:为了解决上述问题,提高进程的独立性和操作系统的稳定性,引用了虚拟地址空间的概念。
进程1、进程2分别分配一块虚拟空间,并通过页表映射到物理内存中,这样进程自身感知不到实际的物理地址。
如果某一个进程发生错误,在页表中找不到对应的地址,也就无法找到真正的物理地址。
进程间通信
进程之间并不是完全独立的,有时也需要有一些交互的操作。
进程间通信,是在进程保持独立性的前提下,通过公共区域,完成数据交换。
多进程编程
- 进程是重量级的,进程的运行需要系统分配资源(耗时操作),速度慢、消耗资源多。
- 系统首先会遍历自己的空闲内存表,找到合适大小的空间进行分配;多个进程申请资源,而系统只能一个一个进程的分配。
多线程编程
- 线程是轻量的进程
- 一个进程可以包含多个线程,每个线程都是一个可以独立调度执行的“执行流”。
- 对于线程而言,系统资源提前分配好了的,可以较少资源开销。