目录
进程的概念
进程
中断
并发与并行
进程和程序的关系
进程的状态
状态延申
进程的控制结构
进程描述信息:
进程控制和管理信息:
资源分配清单:
CPU相关信息:
PCB如何组织
进程的控制
创建进程
终止进程
阻塞进程
唤醒进程
进程的上下文切换
发生进程上下文切换的场景
进程的概念
进程
我们写的代码经过编译后可执行文件,运行这个可执行文件,它就被加载到了内存中,这个在运行中的程序就是进程。
中断
假设某个进程要读取磁盘,因为读取磁盘的时候,磁盘读写速度慢,如果CPU一直等待磁盘读取完,这样CPU利用率很低。于是CPU不会阻塞等待数据返回,而是执行别的进程,当硬盘数据返回的时候,CPU收到中断,CPU再运行这个程序。
并发与并行
CPU管理多个进程,一个单核CPU只能运行一个进程,在一段时间内可以运行多个进程,他们是交替执行的,这就是并发。当多个CPU处理器核,每个处理器核各自运行自己的进程,这就是并行。
对于单CPU,因为进程切换速度快,所以多个程序看起来是同时运行像并行一下,实际上微观上是并发。
进程和程序的关系
程序好比是菜谱,做菜的材料是数据,做菜是进程。假设我们是CPU,我们可以一边做菜一边熬汤,这体现CPU可以从一个进程切换到另一个进程,切换前记录一下当前进程运行的状态信息,以便下次切换回来可以恢复执行,所以,进程有运行-暂停-运行的活动规律。
进程的状态
创建状态:进程正被创建时的状态
运行状态:进程正在CPU运行的状态
就绪状态:进程可以运行了,因为CPU在运行其他进程而暂时停止运行
阻塞状态:进程正在等待某一事件完成(比如IO操作完成)而暂停运行,这时即使有CPU控制权,进程也无法运行
挂起状态:当系统内存紧张,进程占用的物理内存空间被换出到磁盘中,等在需要运行的时候,再从磁盘换入到物理内存中,这个描述进程没有占用实际物理内存空间的情况就是挂起状态。
结束状态:进程正在从系统中消失的状态
状态延申
就绪挂起状态:进程在外存,只有进入内存就进入就绪状态,等待被调度
阻塞挂起状态:进程在外存,等待某个事件出现。
进程挂起的其他情况:
sleep让进程间歇性挂起,原理是设置定时器,到时唤醒
使用ctrl+z挂起进程
进程的控制结构
操作系统用进程控制块PCB(process control block)数据结构来描述进程。
PCB是进程存在的唯一标识,进程消失了,PCB也会消失。
PCB包含的具体信息:
进程描述信息:
进程标识符:标识各个进程,每个进程都有一个唯一的标识符
用户标识符:进程归属的用户,用户标识符主要为共享和保护服务
进程控制和管理信息:
进程的当前状态:如new、ready、running、waiting、blocked等
进程优先级:进程抢占CPU时的优先级
资源分配清单:
有关内存地址空间或虚拟地址空间的信息,所打开文件的列表和所使用的IO设备信息
CPU相关信息:
CPU中各个寄存器的值,当进程被切换的时候,CPU的状态信息都会被保存在相应的PCB中,以便进程重新执行时,能从断点处继续执行
PCB如何组织
PCB通常通过链表的方式进行组织,把具有相同状态的进程链在一起,组成各种队列。比如:
将所有就绪状态的进程链在一起,称为就绪队列。
把所有处于阻塞状态的进程链在一起,称为阻塞队列。
单核CPU只有一个运行指针,因为单核CPU在某个时刻只能运行一个程序
除了链接方式还有索引方式,它的工作原理:将同一个状态的进程组织在一个索引表中,索引项指向相应的PCB。一般选择链表,因为面临进程创建销毁等调度将导致进程状态变化,使用链表更加灵活插入和删除。
进程的控制
创建进程
操作系统允许一个进程创建另一个进程,而且允许子进程继承父进程所拥有的资源
创建进程的过程如下:
1.申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息,比如进程的唯一标识等;
2.为该进程分配运行时所需的资源,比如内存资源;
3.将PCB插入到就绪队列,等待被调度运行
终止进程
三种方式:正常结束,异常结束,外界干预(信号kill)
子进程被终止时,其在父进程继承的资源应当还给父进程。而父进程被终止时,该父进程的子进程就变为孤儿进程,被一号进程收养,并由一号进程对他们完成状态收集工作。
过程如下:
查找需要终止的进程PCB;
如果处于执行状态,则立即终止该进程的执行,然后将CPU资源分配给其他进程
如果还有子进程,则应将该进程的子进程交给1号进程接管
将该进程所拥有的全部资源都归还给操作系统
将其从PCB所在队列中删除
阻塞进程
当进程需要等待某一个事件完成时,调用阻塞语句把自己阻塞等待。一旦被阻塞等待,它只能由另一个进程唤醒。
过程如下:
找到要被阻塞进程标识号对应的PCB
如果该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行
将该PCB插入到阻塞队列中去
唤醒进程
处于阻塞状态的进程不能叫醒自己,如果进程在等待I/O事件,需要别的进程发消息给它,则只有当该进程所期待的事件出现的时候,才由发现者进程用唤醒语句叫醒它。
过程如下:
在该事件的阻塞队列找到对应进程的PCB
将其从阻塞队列中移出,并置其状态为就绪状态
把该PCB插入到就绪队列中,等待调度程序调度
进程的上下文切换
一个进程切换到另一个进程称为进程的上下文切换。
CPU寄存器中有进程运行中的数据,程序计数器存储CPU正在执行的指令或即将执行的下一条指令位置。这两者是CPU上下文。
CPU上下文切换就是把前一个任务的CPU的上下文保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
根据任务不同CPU上下文切换分为:进程上下文切换、线程上下文切换、中断上下文切换。
进程由内核管理和调度,进程的切换只能发生在内核态。进程上下文切换不仅包含虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。
通常把交换的信息保存在进程的PCB,当要运行另外一个进程的时候,需要从这个进程的PCB取出上下文,然后恢复到CPU中,这使得这个进程可以继续执行。
进程的上下文切换的开销越小,则进程花更多时间在执行程序上,自然越小越好。
发生进程上下文切换的场景
1.进程的时间片耗尽,进程运行状态变成就绪状态,系统从就绪队列选择另一个进程运行
2.进程在系统资源不足时(比如内存不足),需要等待资源满足后才可以运行,进程被挂起,并由系统调度其他进程运行。
3.进程通过睡眠函数sleep这样的方法将自己主动挂起
4.有更高优先级的进程需要运行,当前进程会被挂起
5.发生硬件中断,CPU上的进程会被中断挂起,转而执行内核中的中断服务程序