操作系统设计必须满足某些一般性的需求,大多数需求都涉及进程:
- 操作系统必许交替执行多个进程,在合理的相应时间范围内使处理器的使用率最大。
- 操作系统必须按照特定的策略(例如某些函数或应用城居具有较高的优先级)给进程分配资源,同时避免死锁。
- 操作系统可以支持进程间的通信和用户创建进程,它们对构造应用程序很有帮助。
3.1:进程和进程控制块
进程的定义:
- 一个正在执行中的程序
- 一个正在计算机上执行的程序实例
- 能分配给处理器并由处理器执行的实体
- 一个具有以下特征大的活动单元:一组指令序列的执行、一个对当前状态和相关的系统资源的集合
也可以把进程当作一组元素的实体,进程的两个基本元素是程序代码(可能被执行相同程序的其他进程共享)和与代码相关联的数据集。假设处理器开始执行该程序代码,且我们把这个执行实体成为进程。在进程执行时,任意给定一个时间,进程都可以唯一的被表征为以下元素:
- 标识符:跟这个进程相关的唯一标识符,用来区别其他进程
- 状态:如果进程正在执行,那么进程处于执行态
- 优先级:相对于其他进程的优先级
- 程序计数器:程序中即将被执行的下一条指令的地址
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享内存块的指针
- 上下文数据:进程执行时处理器的寄存器中的数据
- I/O状态信息:包括显示的I/O请求、分配给进程的I/O设备和被进程使用的文件列表等
- 审计信息:可包括处理器时间综合、使用的时钟数综合、事件限制、审计号等
前面的列表信息被存在在一个
进程控制块的数据结构中。该控制块有操作系统创建和管理。如图:
进程控制块是操作系统能够支持多进程提供多重处理技术的关键工具。当进程被中断时,操作系统会把程序计数器和处理器寄存器(上下文数据)保存到进程控制快中相应位置,进程状态也改变为其他值,例如阻塞态或就绪态。现在操作系统可以自由地把其他进程置为运行态,把其他进程的程序计数器和进程上下文数据加载到处理器寄存器中,这样其他进程就可以开始执行。
每个进程都有进程控制块PCB,都存放在内存中。但是我们要尽量少的把东西放到PCB里面去。
通俗来说,进程需包含三方面内容:1. 进程在执行什么程序
2. 执行的程序在处理什么数据
3. 进程处于什么状态
对于PCB我的理解:在引进了多任务操作系统后,操作系统需要在进程切换的时候,需要把当前寄存器中的值写入当前进程PCB的registers中,保存起来。再把新进程的PCB的registers中的值装载入CPU,这样才完成了进程的切换。这些开销是额外的开销,在单机环境里面是不应该有这些开销的,进程上下文切换这种额外开销要越少越好。
3.2.进程状态
1.进程终止原因如图:
2.进程的五状态模型
如图:
- 运行态:该进程正在执行。如果只有一个处理器,一次最多只有一个进程处于改状态。
- 就绪态:进程做好了准备,只要有机会该开始执行。(注意:比如一个设备在等待I/O设备输入,这是阻塞态不是就绪态,就绪态是一切资源都准备好了)。
- 阻塞/等待态:进程在某些事件发生前不能执行,如I/O操作完成。
- 新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中。通常是进程控制块已经创建但还没有加载到内存中的新进程
- 退出态:操作系统从可执行的进程组中释放出的进程,或者是因为它自身停止了,或者是因为某种原因被取消
分析:
新建态举例:一个新用户登录到分时系统中,首先,操作系统执行一些必须的辅助工作,将标识符关联到进程,分配和创建管理进程所需要的所有表。此时,进程处于新建态,意味着操作系统已经执行了创建进程的必须动作,但还没有执行进程。例如,操作系统可能基于性能或内存局限性的原因,限制系统中的进程数量。当进程处于新建态时,操作系统所需要的关于该进程的信息保存在内存的进程表中,但进程自身还未进入内存,就是即将执行的程序代码不再内存中,也没有为这个程序相关的数据分配空间。当进程处于新建态时,程序保留在外村中,通常是磁盘中。
状态中转换有两种需要注意:
- 运行->就绪:这类转换最常见原因是,正在运行的进程达到了“允许不中断执行”的最大时间段。实际上所有多道程序操作系统都实行了这类时间限定。这类转换还有很多其他原因,例如操作系统给不同的进程分配不同的优先级,但这不是在所有操作系统中都实现了得。假设进程A给一个给定的优先级运行,且具有更高优先级的进程B正处于阻塞套。如果操作系统知道B等待事件发生,则将B转化为就绪态。然后因为优先级的原因中断A的执行,将处理器分派给进程B,我们说操作系统抢占(preempted)了进程A。最后一种情况是,进程资源自愿释放对处理器的控制,例如一个周期性地进行记账和维护的后台进程。
- 不存在:阻塞->运行。阻塞态不能直接到运行态。当锁等待的时间发生时,处于阻塞态的进程只能转换到就绪态,然后转换到运行态。