• 分时进程调度和事件触发的进程调度系统


    资源下载地址:https://download.csdn.net/download/sheziqiong/85751932

    实验目的

    在这里插入图片描述

    实验内容:

    在这里插入图片描述

    6.实现一个能够实现分时进程调度和事件触发的进程调度系统,并对所实现的调度进行性能评测分析。

    实验环境及实验步骤

    实验环境

    • VMware Workstation 12 Pro
    • Ubuntu 12.04.4 LTS 32 位

    实验步骤

    1. 阅读教材
    2. 理解代码
    3. 实现要求

    实验过程

    (一)构造进程的关键技术,并解释核心流程

    1. 进程状态的保存(保存现场),包括哪些状态需要保存、何时进行保存、怎样保存。
    2. 进程状态的恢复(恢复现场)
    3. 进程表的引入
    4. 进程栈和内核栈
    5. 特权级的变换:ring0 和ring1之间的切换

    (二)核心流程:

    1、准备好进程体

    1. 初始化GDT中的TSS和LDT两个描述符,并初始化TSS

    1. 准备进程表(PCB)

    填充PCB中的相关信息,如pid、ldt selector即段、eip esp寄存器等

    1. 完成跳转,实现ring0到ring1

    将cpu交给p_proc_ready这个pcb指向的进程

    在这里插入图片描述

    关键数据结构

    1. 先要将所有的寄存器保存到pcb

    在这里插入图片描述

    1. 判断当前所处于的堆栈

    若是当前处于用户堆栈则需要切换,若处于内核堆栈就不需要再进行切换

    步骤:(以时钟中断调度为例)

    1. 进入中断后,先保存全部寄存器

    2. 判断当前所在堆栈,是否需要切换

    3. 屏蔽当前中断

    4. 置EOI位,开启中断,使cpu能接受其他中断。

    5. 进行中断处理,如进行进程调度、计算进程占用cpu时间等等

    6. 恢复接收当前中断

    7. 中断处理结束,恢复寄存器,iret

    答:

    1. 扩展单进程到多进程

    添加一个进程体

    添加任务数组,方便我们对pcb进行初始化

    添加新加入的进程

    设置进程栈大小

    扩展初始化进程表,使之能为所有进程填充pcb

    1. 扩展中断支持多进程

    需要用一个宏定义来统一中断例程的入口,方便我们扩充。

    在这里插入图片描述

    答:

    1. 规定好系统调用的调用号及对应功能的功能号

    系统调用号为0x90,功能号有两个,实现了两个功能

    1. 编写入口程序

    1. 初始化系统调用的中断门

    1. 编写int 90h中断例程

    在这里插入图片描述

    1. 编写系统调用功能程序表

    1. 编写功能程序

    1. 添加函数声明

    2. 调用系统调用

    在这里插入图片描述

    在进入中断时,会对当前进程的堆栈进行存储;在退出中断时,会对当前进程的堆栈进行恢复。如下图所示。

    在restart时进行堆栈的切换。

    所以要实现进程的切换,只需要在中断中将p_proc_ready切换成目标进程即可。

    以我实现的动态优先级时间片轮转调度算法为例,在中断中计时,并当时间片用完时,切换至下一个进程以实现进程调度。(下图红框所示,实现当前进程切换)

    在这里插入图片描述

    在中断退出时,restart函数中,恢复了p_proc_ready的堆栈,至此,实现了进程的调度。

    6.实现一个能够实现分时进程调度和事件触发的进程调度系统,并对所实现的调度进行性能评测分析。

    使用说明:

    Schedule/中有四个子文件夹,分别实现了四种调度算法:

    Final-dyna_prio: 动态优先级时间片轮转调度算法

    Final-fcfs: 先来先服务算法

    Final-nomal: 静态优先级时间片轮转调度算法

    Final-sfj: 短进程优先调度算法

    (由于不同调度算法是通过宏定义来进行选择的,为了方便后续检查,每种调度算法均编译了一次,故有四个文件夹)

    接下来以final-dyna_prio为例,展示接下来的操作。

    进入文件夹后,直接bochs即可启动

    在这里插入图片描述

    启动后System_Idle_Process开始运行,等待我们下一步操作。

    以下为功能说明:

    仅接收按键0-9,各按键功能如下

    0:清空屏幕

    	1-5号进程为实现生产者消费者模型
    
    • 1

    1:启动生产者进程;若生产者进程已经启动,再按下1则挂起生产者进程

    2:启动消费者1进程;若消费者1进程已经启动,再按下2则将它挂起

    3:启动消费者2进程;若消费者2进程已经启动,再按下3则将它挂起

    4:启动消费者3进程;若消费者3进程已经启动,再按下4则将它挂起

    5:启动消费者4进程;若消费者4进程已经启动,再按下5则将它挂起

    6-9号进程为进行调度算法性能统计分析,在不同模式下其优先级及所需要的运行时间可能不同。

    6:占用固定运行进程1

    7:占用固定运行进程2

    8:占用固定运行进程3

    9:占用固定运行进程4

    启动bochs后,按下12345678,启动8个进程


    在这里插入图片描述

    其中,Ready、HangOn、Finish代表各进程现在的状态:就绪、挂起或者结束。

    在不同调度算法中,展示出的效果稍有不同,是由于各个调度算法的特性决定的

    FCFS:(先来先服务不需要太多信息,故显示的较少)

    SFJ:(多出来的一列为剩余运行时间)

    在这里插入图片描述

    Normal:

    Dyna_Prio:

    在这里插入图片描述

    代码说明:

    由于实现的功能较多,代码也很多,故只选取有代表性的几个地方进行截图说明。

    1. 生产者消费者的实现

    在这里插入图片描述

    来保护缓冲区。

    在这里插入图片描述

    1. 固定运行时间测试进程的实现

    使用这两个数组进行占用cpu时间的计数,仅当进程在运行时才会计数。

    1. 按键就绪挂起进程的实现

    位于keyboard.c 键盘中断处理例程。

    1-5号进程就绪/挂起直接将其加入/移除进程链表即可,6-9号进程因为会退出就绪时,需要重新填充pcb

    1. 退出进程的系统调用实现:

    1. FCFS调度:

    1. SFJ
      在这里插入图片描述

    2. 静态优先级时间片轮转调度

    在这里插入图片描述

    1. 动态优先级固定时间片轮转调度算法
      在这里插入图片描述
      在这里插入图片描述
      资源下载地址:https://download.csdn.net/download/sheziqiong/85751932
      资源下载地址:https://download.csdn.net/download/sheziqiong/85751932
  • 相关阅读:
    linux ubuntu22.04 部分实用的 远程管理 命令的说明与使用
    Aspose.Slides for Python演示文稿指定幻灯片放映设置
    SwiftUI 导航教程之如何实现没有 Navigation View的 SwiftUI 导航功能
    韦东山嵌入式Liunx入门驱动开发四
    9-2-Dataset创建-import调用
    如何看待为了省小钱而花费时间
    CSDN UI 2024.06.01
    医疗小程序开发:技术门槛高?
    【鸿蒙最新全套教程】<HarmonyOS第一课>1、运行Hello World
    Java设计模式之代理模式(静态、动态)
  • 原文地址:https://blog.csdn.net/sheziqiong/article/details/125432053