进程
进程的定义
- 进程是一个程序的一次执行过程
- 能完成具体功能 是在某个数据集合上完成的 执行过程是可并发的
- 进程是资源分配,保护和调度的基本单位
- 程序和进程之间的关系:
1.一个程序是一个被动的实体,就像一个包含了一系列指令的文件,经常被称为可执行文件。当一个程序被加载进内存时,它就变成了一个进程,然后CPU不断地取指执行。
2.一个进程是一个活跃的实体,它包含一个程序计数器。程序计数器是一个CPU中的寄存器(寄存器是整个存储体系中最顶层的,速度最快),里面存储下一条要执行的指令的内存地址。
通常CPU在取完一条指令之后会将PC寄存器的值加“1”(加1并不是往后移动一个字节,而是移动一个指针的大小),以计算下条指令的地址。
进程在内存中的结构
- 函数return的时候会在栈中清空和该函数有关的数据。
- 在C语言中,在堆分配的内存需要手动free。
- 堆和栈共用同一块内存,一个从下往上增长,一个从上往下增长。
并发与并行
- 并发
在同一时间段运行多个进程(在某个时间点不是同时运行的) - 并行
在同一个时间点同时运行多个进程
进程状态
进程状态转换图
进程切换
中断技术
由上图可以看出,中断和系统调用很像,都是陷阱机制,其实系统调用是中断的一个特例。
中断源
中断处理过程
1.进程执行。
2.发生Exception或Interrupt。
3.保存进程的上下文,即进程的一些信息。
4.判断Exception或Interrupt的原因,选择合适的处理器。
5.选择一个进程来恢复,重新加载该进程的上下文,恢复进程的运行。
6.进程执行。
特权指令和非特权指令
模式切换
中断是用户态转换成内核态的唯一途径!!!
进程切换
切换时机
1.进程需要进入等待状态。(主动)
2.进程被抢占CPU而进入就绪状态。(被动)
切换过程
首先,从用户态切换到内核态,接下来的操作都是在内核态中完成。
1.保存被中断进程的上下文信息。(Context)
2.修改被中断进程的控制信息。(如状态等)
3.被中断的线程加入对应的状态队列。
4.调度一个新的线程并恢复它的上下文信息。
进程完整的模型
之前提到的text data heap和stack是属于进程的实体,包含了程序的二进制代码和数据。而PCB是另外一个部分,它是进程的控制信息!
进程在物理内存的分布
可以看到,每个进程的实体和PCB都是离散存放的,这样的好处是提高内存的利用率。
进程队列
进程是如何管理的呢?
可以看到,队列中的结点只存放了PCB,而没有进程的实体。这样做的好处是降低了进程切换的开销。因为PCB是进程的控制信息,找到了PCB也就能找到该进程在内存中的位置。
进程调度
进程切换的开销