一、 什么是进程
1、背景
直接根据给定的硬件平台写应用程序程序效率低下,原因在于:
(1)处理器本身只能对多道程序设计提供有限的支持,需要用软件去管理处理器和其他资源,以保证他们可以同时被多个程序共享。
(2)如果多个程序在同一个时间是活跃的,那么需要保护每个程序的数据、I/O使用和其他资源不被其他程序占用。资源包括内存、网络接口和文件系统。
2、进程和进程控制块
(1)进程的两个基本元素是程序代码和代码相关联的数据集。
(2)进程控制块中的信息:
标识符(PID号):区别其他进程的唯一标识符。
状态:如果程序正在执行,程序处于执行态。
优先级:相较于其他程序的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:程序代码和进程相关数据的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
进程控制块包含了充分的信息,这样就可以中断一个进程的执行,并且在后来恢复执行进程时就好像未被中断过。这是操作系统能够支持多进程和提供多处理的关键工具。当进程被中断时,操作系统会把程序计数器和处理器寄存器(上下文数据)保存到进程控制块中相应的位置,进程状态也被改变为其他值。
二、 进程的状态
1、(1)五状态模型
运行态:该进程正在执行。
就绪态:进程做好了准备,只要有机会就开始执行。
阻塞态:进程在某些事件发生之前不能执行,如I/O操作完成
新建态:进程控制块已经创建,但还没有加载到内存当中的新进程。
退出态:从可执行进程组中释放出的进程。
(2)事件转换:
空---新建:将标识符关联到进程,分配和创建管理进程所需 要的所有表。但自身还未进入内存。
新建---就绪:操作系统准备好再接纳一个进程时,将其从新建态转换为就绪态。
就绪---运行:调度器选择就绪态的程序运行。
运行---退出:自己完成或取消。
运行---就绪:a、正在运行的进程达到了“允许不中断”执行的时间段。(优先级抢占资源)
b、进程自愿释放对处理器的控制
运行---阻塞:当进程互相通信等待另一个进程提供输入时,或者等待来自另一个进程的信息时
阻塞---就绪:当所等待的事件发生时,完成该转换
就绪---退出:父进程在任何时候终止子进程或本身终止。
(3)被挂起的进程
交换的必要性:将内存中的某个进程的一部分或全部移到磁盘中。当内存中没有处于就绪态的进程时,操作系统就会把被阻塞的进程换出到磁盘中的“挂起队列”中,内存中释放的空间可被调入的另一个进程使用。
我们引入以下两个状态:
阻塞/挂起态:进程在外存中并等待一个事件。
就绪挂起态:进程在外存中,只要被载入内存就可以执行。
(4)状态转换:
阻塞---阻塞/挂起:前提是没有就绪进程,将至少一个阻塞进程唤出,为另一个没有阻塞的进程让出空间。需要更多的内存空间,就绪态进程也会出现这种转换。
阻塞/挂起---就绪挂起:等待的事件发生了
就绪/挂起---就绪:
就绪---就绪/挂起:通常挂起的是阻塞态进程,以释放内存得到足够的空间。
新建---就绪挂起或新建---就绪:操作系统提前建立一些表用来管理进程,并为其分配地址空间,帮助其维护大量的未阻塞进程。导致内存中没有足够的空间进行分配,因此利用新建---就绪挂起的状态转换。
阻塞挂起---阻塞:阻塞挂起队列中有优先级较高的进程。
三、 进程描述
1、 操作系统的控制结构
操作系统维护着四种不同类型的表:内存、I/O,文件和进程。
内存表:分配给进程的内存、分配给进程的外存、内存块或虚拟内存块的任何保护属性,如哪些进程可以访问某些共享内存区。
2、进程控制结构
包括两部分:进程的位置和进程的属性。一个进程至少包括足够的内存空间(保存进程的程序和数据),用于跟踪过程调用和过程间的参数传递的栈,进程控制块称为进程映像。
进程位置:若操作系统要管理进程,其进程映像至少有一部分位于内存中,未执行该进程,整个进程映像必须载入内存中或至少载入虚拟内存中,因此操作系统需要知道每个进程在磁盘中的位置。
进程属性(PCB):
包括三部分:进程表示信息、进程状态信息、进程控制信息。
处理器状态信息:当一个进程正在运行时,其信息当然在寄存器中。当进程被中断时,所有的寄存器信息必须保存下来,使得进程恢复时这些信息都可被恢复。
进程控制信息:操作系统控制和协调各种活动所需要的额外的信息。
使用top、ps –ef|grep 命令来追踪进程状态
四、 进程控制
1、 执行模式
执行模式有两种:用户态和内核态。使用两种模式的原因是它可以保护操作系统和重要的操作系统表不受用户程序的涉。
执行模式的改变:在典型情况下。当用户调用一个操作系统服务或中断触发系统例程的执行时,执行模式被设置为内核态,当从系统服务返回到用户进程时,执行模式被设置为用户态。
2、 进程的创建
进程创建的步骤:
(1) 给新进程分配一个标识符。
(2) 给进程分配空间。包括进程映像中的所有元素。
(3) 初始化进程模块:包括进程PID号、处理器状态信息部分的大多数项目通常初始化为0;进程控制信息部分的初始化基于标准默认值和为该进程所请求的属性。
(4) 设置正确连接。
(5) 创建和扩充其他数据结构。
Linux具体实现:
fork()通过拷贝当前进程创建一个子进程。fork()函数调用一次返回两个不同值,若返回值为0,则代表当前进程是子进程,若返回值大于0,则代表当前进程是父进程。PPID=0是系统,且父进程优先执行。
写时拷贝:只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。
3、进程切换
何时切换进程:
中断:正在进行的进程无关的某种类型的外部事件(i/o操作)
时钟中断:进程运行时间已经超过了时间片。
I/O中断:优先级高的是否抢占
陷阱:错误致命,则转换为退出态。否则,切换或继续执行。
系统调用:使用系统调用会导致把用户进程置为阻塞态。
模式切换:
当存在未处理的中断时,处理器需要做:
(1) 把程序计数器置成中断处理程序的开始地址
(2) 从用户态切换到内核态,使得中断代码可以包含有特权的指令。
被中断的进程上下文保存在被中断程序的进程控制块中。保存处理器状态信息的进程控制块部分(寄存器和栈信息)
完整的进程切换步骤:
扩展:
1、进程之间的切换是操作系统最大的开销。
2、并行与并发的区别:
并发是指一个处理器同时处理多个任务,是逻辑上的并发。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务,是物理上的并行。
3、 虚拟内存:
虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。在使用虚拟寻址时(用逻辑地址),CPU会生成一个虚拟地址(逻辑地址),用这个虚拟地址来访问主存时需要经过一个MMU(内存管理单元)来对这个虚拟地址进行翻译,把这个虚拟地址变为真正的物理地址。
4、swap分区
Swap分区在系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。