广州大学操作系统课程设计:优先级调度

这篇博客介绍了广州大学操作系统课程设计,内容涉及优先级调度算法的模拟。实验采用Java在Linux环境下进行,模拟抢占式优先级法,优先级随等待时间增加而提升。程序包括Main类、SchedulingThread类等,通过流程图和源代码展示调度过程。实验要求包括程序设计、数据结构说明、运行结果分析等。
摘要由CSDN通过智能技术生成

源文件下载://download.csdn.net/download/qq_40752913/12047066

一、 实验目的

通过模拟Linux优先级调度算法,加深对进程调度算法的理解

二、实验内容

优先级调度算法实现处理机调度的程序设计提示如下:

(1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。进程的优先数、到达时间和估计运行时间由用户程序任意设定,且优先数越低,优先级越高。调度时,总是选择优先级最高的进程运行。

进程名
链接指针
进程的到达时间
进程的优先级
估计运行时间
进程状态

(2) 为了调度方便,设计一个指针指向就绪队列的第一个到达进程。另外再设一个当前运行进程指针,指向当前正运行的进程。

(3) 处理机调度时,总是选择已经到达队列的优先级最高的进程运行。为了采用动态优先级调度,进程每运行一次,其优先级就减1。

(4) 由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:

  • 优先数加1;
  • 估计运行时间减1;
  • 输出当前运行进程的名字。
    用这三个操作来模拟进程的一次运行。
  • 进程运行一次后,应判断该进程的剩余运行时间是否为0,若不为0,且其优先级低于就绪队列的其他进程的优先级,则选择一个高优先级进程抢占CPU运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并撤出就绪队列。
  • 若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
  • 在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后进程的变化以及就绪队列中各进程排队情况。

三、实验原理

此实验模拟的是进程调度的优先级法。优先级法有抢占式和非抢占式两种,这里模拟的是“抢占式优先级法”。

抢占式优先级法的原理是:当前进程在运行过程中,一旦有另一个优先级更高的进程出现在就绪队列中,进程调度程序就停止当前进程的运行,强行将CPU分给那个进程。

那这里的优先级是怎么确定呢?优先级是“一定终身”还是“随机应变呢”?

这里是选择跟Linux一样的,这里采用“随机应变”的优先级,优先级有两部分组成,一部分是一开始用户指定的优先级,另一部分是根据进程等待CPU的时间,随着等待CPU越长,优先级不断提升。

四、实验设备

Linux环境下,语言使用Java,编译器用IDEA

五、实验要求

书写课程设计报告,报告中应该包含如下内容:
(1) 课程设计题目及内容
(2) 程序中使用的数据结构及主要符号说明
(3) 程序流程图和带有详细注释的源程序
(4) 执行程序名,并打印程序运行时的初值和运算结果
(5) 实验结果分析,实验收获和体会
(6) 实验的改进意见和建议。

六、实验程序

实验的类结构图为:

在这里插入图片描述

Main类

package com.zhengzeliang;

/**
 * @author Zzl
 */
public class Main {
   

    public static void main(String[] args) {
   
        SchedulingThread processSchedule = new SchedulingThread();

        new Thread(processSchedule).start();
    }
}

SchedulingThread类

	package com.zhengzeliang;

/**
 * @author Zzl
 */
public class SchedulingThread implements Runnable{
   
    /**
     * @author Zzl
     * @date 2019/12/16 13:13
     * @description 调度管理类的实体,用于实现优先级的调度
     */
    private ScheduleManagement scheduleManagement = new ScheduleManagement();
    /**
     * @author Zzl
     * @date 2019/12/16 13:13
     * @description 对将要到达的进程的管理
     */
    private ReachingProcessManagement reachingProcessManagement = new ReachingProcessManagement(scheduleManagement);

    @Override
    public void run() {
   
        reachingProcessManagement.initReadyToArriveProcessTable();
        while (true){
   
            System.out.print("当前时间为:" + reachingProcessManagement.getTimeCounter());
            reachingProcessManagement.enterReadySequenceOrNot();
            scheduleManagement.priorityScheduling();
            reachingProcessManagement.addTimeCounter();
            try {
   
                Thread.sleep(1000);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }
    }

}

ProcessObj类

package com.zhengzeliang;

/**
 * @author Zzl
 */
public class ProcessObj {
   

    ProcessObj(String processName, ProcessObj nextProcess, int arriveTime, int priority, int runTime, String status) {
   
        this.processName = processName;
        this.nextProcess = nextProcess;
        this.arriveTime = arriveTime;
        this.priority = priority;
        this.runTime = runTime;
        this.status = status;
    }

    public ProcessObj() {
   
    }

    ProcessObj(ProcessObj process) {
   
        this.processName = process.getProcessName();
        this.nextProcess = process.getNextProcess();
        this.arriveTime = process.getArriveTime();
        this.priority = process.getPriority();
        this.runTime = process.getRunTime();
        this.status = process.getStatus();
    }

    /**
     * @author Zzl
     * @date 2019/12/15 16:53
     * @description 进程名
     */
    private String processName;
    
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、课程设计题目及内容 时间片轮转法实现处理机调度的程序设计提示如下: (1)假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。 进程名 链接指针 到达时间 估计运行时间 进程状态 (2)按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。 (3)执行处理机调度时,首先选择队首的第一个进程运行。 (4)由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:1)估计运行时间减1; 2)输出当前运行进程的名字。 用这两个操作来模拟进程的一次运行。 (5)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时还应判断该进程的剩余运行时间是否为0,若不为0,则等待下一轮的运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。 (6)若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。 (7)在所设计调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最短作业时间优先(抢占式和非抢占式)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参数 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程的进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格式显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间。 进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值