一、进程的概念
1.定义:进程是对正在运行的程序的抽象。(a program in execution)
2.注意:
(1)进程与程序的区别。同样的程序处理不同的数据,是两个进程。
(2)不同的进程:
a.defferent data with same program(相同的程序,不同的数据)
b.different program with same data (不同的程序,相同的数据)
二、一个进程也包括:
1.program counter,当前执行的位置
2.stack,伴随的数据
3.data section,伴随的数据
三、从3个维度认识进程:
1.程序维度(这个进程在执行什么程序。)
2.数据维度(这个进程执行的程序,在处理什么数据。)
3.状态维度(程序可以看做是静止的。进程是一个动态的概念,有生命周期。程序运行,则进程创建;程序不执行,则进程没有了。)
四、进程的状态
1.进程的几种状态(仅做参考):
(1)new 起始状态
(2)terminated 终止状态
(3)ready 就绪状态(一个程序已经全部驻留在内存了,要处理的数据也已经到位了,只要把CPU给它,程序就可以一条一条执行下去了。)
(4)running 执行状态(正在利用CPU执行程序。)
(5)waiting 等待状态(还没有准备好,还在等某一个资源。可能是IO设备的资源,也可能是等待对方设备的通信资源。eg:一个程序执行到了输入语句上面,它在等待输入设备给它一个输入语句,即使给了CPU也做不下去。)
2.注意:一定有起始状态和终止状态,在一个OS设计时,定义了、设计了多少状态,就有多少状态,未必是如上列出的状态。
3.进程状态迁移示例:
五、进程控制块(Process Control Block PCB)
1.进程通常与下列信息关联:
(1)Process state 进程的状态
(2)Program counter 某个寄存器,总是指向下一条要执行的指令。
(3)CPU registers
(4)CPU scheduling information CPU调度的信息
(5)Memory-management information 所有和内存管理相关的信息
(6)Accounting information 记账信息
(7)I/O status information
2.每一个进程,都有一个PCB。PCB是在内存里面驻留的,反映进程概念的对应的一个实体(1对1的关系)。
3.THAT SPECIFIC TO THE PROCESS:
如果某一个数据结构、某一个信息是要两个进程共享的,那么,不要放到PCB里面去。
只有那些关于某个进程独占的信息,才放到PCB里面去。
目的是控制PCB的大小。
4.PCB示例(以Linux PCB为例)
process state 进程状态
process number 进程号,正整数,不允许重复
program counter 指向代码的指针位置的一个寄存器
registers 通用的寄存器
memory limits 关于内存使用的上下界限寄存器的值
list of open files 进程已经打开的文件的列表
六、进程调度队列,动态反映操作系统的全貌
1.Job queue 作业队列,等待进入计算机系统的待处理任务(想执行的程序,还没有开始执行,还不是进程,还没有装入内存)
2.Ready queue 等待队列,驻留内存,准备就绪,等待CPU
3.Device queues I/O设备队列,等待I/O设备的进程
七、一个进程在队列间的迁移
八、进程上下文切换(Context Switch)
1.单个CPU任何时候只能为一个进程服务;
2.当CPU转向为另外一个进程服务时,它必须保存原有(转换前)进程的状态,装入待服务(转换后)进程的状态,也即“进程上下文切换”;
3.“状态”指寄存器、标志位、堆栈等当前值;
4.上下文切换时间是一种额外开销(overhead),因为期间CPU不做对用户进程直接有益的事;
5.上下文切换时间决定于CPU硬件支持力度。
解释:程序在运行的时候,为了追求高效率,希望把它的变量是放在寄存器里面,而不是内存里面。最起码是放在内存里面,而不是放在磁盘里面。
进程在运行的时候,一定会用到寄存器。然而寄存器的数量是极其有限的。只能把关键的、使用频繁的变量放入寄存器。
解决方案:
要让PCB1用CPU之前,先要把原来的CPU保存的寄存器的值,保留起来。(保存PCB0的现场)
把PCB1的寄存器的值,装入CPU。(布置PCB1的现场)
1.暂时没弄明白的
系统调用、fork、execve、文件描述符、句柄
参考文献:
1.《操作系统概念》
2.操作系统-浙江大学