进程控制:七状态模型

在这里插入图片描述
首先,进程的七状态模型,分为:创造、就绪、执行、堵塞、终止、挂起就绪、挂起阻塞。

进程

进程没有一个规定的定义,一般定义为:

  • 进程是程序的一次执行
  • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  • 进程时具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位

在引入进程实体的概念后,我们可以把传统OS中的进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

进程的特征

  • 动态性:进程的实质是进程实体的执行过程。
  • 并发性:多个进程同存于内存中,且能在一段时间内同时运行。
  • 独立性:能独立运行、独立获得资源和独立接受调度的基本单位。
  • 异步性:不可预知的速度向前推进。

进程控制块

是操作系统核心中一种数据结构,主要表示进程状态。

进程控制块的作用

使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程。

  • 具体的说:
  • 作为独立运行基本单位的标志 —— 当一个程序配置了PCB后,就表示它已是一个能在多道程序环境下独立运行的、合法的基本单位。PCB已经成为了进程存在于系统中的唯一标志。
  • 能实现间断性运行方式 —— 有了PCB后,系统可以将终端进程的CPU现场信息存放在PCB中,供该进程在被调度时恢复CPU现场信息。
  • 提供进程管理所需要的信息 —— 当进程调度时、需要访问文件或I/O设备时,都需要借助PCB中资源清单的信息。
  • 提供进程调度所需要的信息 —— 进程调度时,需要提供优先级、等待时间和已执行时间等。
  • 实现与其他进程的同步与通信 —— 进程同步,需要相应的用于同步的信号量,还需要具有用于实现进程通信的区域或通信队列指针等。

进程控制块中的信息

  • 进程标识符:用于唯一标识一个进程。分为两种标识符:
    • 外部标识符:为了方便用户(进程)对进程的访问,
    • 内部标识符:为了方便系统对进程的使用,唯一的数字标识符
  • 处理机状态:也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成的。这些寄存器主要包括:
    • 通用寄存器 —— 又称为用户可视寄存器,是用户程序可以访问的,用于暂存信息,在大多数处理机中,由8~32个通用寄存器,在RISC结构的计算机中可超过100个。
    • 指令计数器 —— 其中存放要访问的下一条指令的地址。
    • 程序状态字PSW —— 含有状态信息,如:条件码、执行方式、中断屏蔽标志等
    • 用户栈指针 —— 指每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址。栈指针指向该栈的栈顶。
  • 进程调度信息 :包括进程状态、进程优先级、进程调度所需的其他信息、事件。
  • 进程控制信息:程序和数据的地址、进程同步和通信机制、资源清单、链接指针。

进程控制块的组织方式

  • 线性方式
  • 链接方式
  • 索引方式

七状态模型

进程创建

引起进程创建的事件

  • 用户登录
  • 作业调度
  • 提供服务
  • 应用请求

进程如何创建

  • 申请空白PCB
  • 为新进程分配其运行所需的资源
  • 初始化进程控制块:初始化标识信息、初始化处理机状态信息、初始化处理机控制信息。
  • 如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。

进程终止

引起进程终止的事件

  • 正常结束
  • 异常结束
    • 越界错
    • 保护错
    • 非法指令
    • 特权指令错
    • 运行超时
    • 等待超时
    • 算术运算错
    • I/O故障
  • 外界干扰
    • 操作员或操作系统干预
    • 父进程请求
    • 因父进程终止

进程的终止过程

  • 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态。
  • 若处于执行状态,终止执行,调度标志改为真。
  • 若还有子孙进程,应将子孙进程都终止,以防他们称为不可控的进程。
  • 将资源归还给父进程,或系统。
  • 将被终止进程的PCB从所在队列中移除,等待其他程序调用。

进程的阻塞与唤醒

引起进程堵塞和唤起的事件

  • 向系统请求共享资源失败
  • 等待某种操作的完成
  • 新数据尚未到达
  • 等待新任务的到达

进程堵塞的过程

  • 正在执行的进程,如果发生了上述某事件,进程便通过调用阻塞原语block将自己阻塞。
  • 可见,阻塞是进程自身的一种主动行为。
  • 进入block过程后,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的状态由"执行"改为阻塞,并将PCB插入阻塞队列。
  • 如果系统中设置了因不同事件而堵塞的多个堵塞队列,则应将本进程插入到具有相同事件的堵塞队列。
  • 最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,保留被阻塞进程的处理机状态,按新进程的PCB中的处理机状态设置CPU的环境。

进程唤醒过程

  • 当被阻塞进程所期待的事件发生时,由有关进程调用唤醒原语wakeup,将等待该事件的进程唤醒。
  • wakeup执行的过程是:首先把阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。

进程的挂起与激活

进程的挂起过程

  • 当系统中出现了引起进程挂起的事件时,OS将利用挂起原语suspend将指定进程或处于阻塞状态的进程挂起。
  • suspend的执行过程时:首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪。
  • 对于活动阻塞状态的进程,则将之改为静止阻塞。
  • 为了方便用户或父进程考察该进程的运行情况,而把该进程的PCB复制到某指定的内存区域。
  • 最后,若被挂起进程正在执行,则转向调度程序重新调度。

进程的激活过程

  • 当系统中发生激活过程的事件时,OS将利用激活原语active,将指定进程激活。
  • 激活原语先将进程从外存调入内存,检查该进程的现行状态。
  • 若是静止就绪,改为活动就绪。
  • 若是静止阻塞,改为活动阻塞。
  • 19
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
抱歉,我是一个自然语言处理模型,无法提供代码编写功能。但是,你可以参考以下伪代码实现: ``` // 定义进程控制块 PCB class PCB { int pid; // 进程ID int status; // 进程状态 int memorySize; // 内存大小需求 int runTime; // 估计运行时长 // 其他属性和方法 } // 创建进程原语 void createProc(int memorySize, int runTime) { PCB pcb = new PCB(); pcb.pid = generatePid(); // 生成唯一的进程ID pcb.status = STATUS_READY; pcb.memorySize = memorySize; pcb.runTime = runTime; allocateMemory(pcb); // 分配内存空间 addPCBToList(pcb); // 将PCB加入进程列表 } // 终止进程命令 void killProc(int pid) { PCB pcb = findPCB(pid); if (pcb != null) { releaseMemory(pcb); // 释放内存空间 removePCBFromList(pcb); // 从进程列表中移除PCB } } // 阻塞进程命令 void ioStartProc(int pid) { PCB pcb = findPCB(pid); if (pcb != null) { pcb.status = STATUS_BLOCKED; } } // 唤醒进程命令 void ioFinishProc(int pid) { PCB pcb = findPCB(pid); if (pcb != null) { pcb.status = STATUS_READY; } } // 显示所有进程状态命令 void psProc() { for (PCB pcb : processList) { System.out.println("PID: " + pcb.pid + ", Status: " + getStatusName(pcb.status) + ", Memory Address: " + pcb.memoryAddress); } } // 显示内存空间使用情况信息 void mem() { for (MemoryBlock block : memoryList) { System.out.println("Memory Address: " + block.startAddress + " - " + block.endAddress + ", Size: " + block.size + ", Status: " + getStatusName(block.status)); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值