操作系统综合实验——动态高优先权优先进程调度算法

导读

PS:最近有很多小伙伴问我怎么准备算法竞赛和面试的问题,还有一些刚入门的新同学不知道怎么学习编程,肥学给大家准备了一些专栏有兴趣的可以去看看哦!

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个面试和考研的算法练习我们一起加油上岸之路

好了今天我们给大家准备了操纵系统的期末综合实验大家可以参考参考哦!

一、实验目的

通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。

二、设备与环境

  1. 硬件设备:PC机一台
  2. 软件环境:安装Windows操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。

三、实验内容

实验采用了java语言编程模拟N个进程采用动态高优先权优先进程调度算法。该算法就是按照优先权的大小运行进程,如果一个时间片内未运行完,则将优先权数减3后再插入到链表中按priority的顺序进行排序找到最大的priority作为下一个运行进程且在就绪队列里面的进程priority会加1。

主模块:

在这里插入图片描述

动态priority排序模块:
用来保证头部永远最大

在这里插入图片描述

到达时间进入就绪状态模块:

在这里插入图片描述

计算周转时间和带权周转时间:

在这里插入图片描述

四、实验结果及分析

输入的信息
初始权值都为100,needtime为还需要的时间
进程 到达时刻 服务时间

A	0	3
B	2	6
C	4	4
D	6	5
E	8	2

在这里插入图片描述

在这里插入图片描述

以A为例:
在这里插入图片描述

最后结束时:

在这里插入图片描述

部分代码展示

//创建结构
class PCB{
    String ID;
    int priority=-1;
    int cputime;//服务的时间
    int needtime;//进程还需的时间
    String state="wait";
    int arrivetime;
    PCB next;
    public PCB(String ID,int priority,int cputime,int arrivetime){
        this.ID=ID;
        this.priority=priority;
        this.cputime=cputime;
        this.arrivetime=arrivetime;
    }
}

判断是否到达,进程进入时间
for(int i=0;i<arr.size();i++){
                if(h==arr.get(i).arrivetime){
                    Dynamic_priority.sort(arr.get(i));
                    arr.remove(i);}}
//将进程转为就绪态并排序
public static void sort(PCB pcb){
PCB tmp=null;
        if(ready==null){//当头结点为空
            ready=pcb;
            tail=pcb;}
       else {if(pcb.priority>ready.priority){//如果这个结点priority大于头priority
               pcb.next=ready;
               ready=pcb;}
           else {
               boolean m=false;
               tmp=ready;//q
               while (m==false){
                   if(tail.priority>=pcb.priority){//插入尾端
                       tail.next=pcb;
                       tail=pcb;
                       pcb.next=null;
                       m=true; }
                   else {
                       if(tmp.priority>=pcb.priority&&pcb.priority>tail.priority){//逐渐遍历插到tmp前
                           pcb.next=tmp.next;
                           tmp.next=pcb;
                           m=true;
                       } else { tmp=tmp.next;

资料领取

回复操作系统综合实验即可获取
这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
好的,以下是一个基于优先权进程调度程序的JAVA代码: ``` import java.util.*; class Process { int id; String name; int priority; int runtime; public Process(int id, String name, int priority, int runtime) { this.id = id; this.name = name; this.priority = priority; this.runtime = runtime; } } public class PriorityScheduler { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入进程数量:"); int n = scanner.nextInt(); List<Process> processes = new ArrayList<>(); for (int i = 0; i < n; i++) { System.out.print("请输入进程" + (i + 1) + "的信息(ID 进程优先级 运行时间,以空格分隔):"); int id = scanner.nextInt(); String name = scanner.next(); int priority = scanner.nextInt(); int runtime = scanner.nextInt(); processes.add(new Process(id, name, priority, runtime)); } System.out.print("请输入每个时间片的长度(分钟):"); int timeSlice = scanner.nextInt(); int currentTime = 0; int totalTurnaroundTime = 0; int totalWaitingTime = 0; int totalResponseTime = 0; System.out.println("时间\t进程ID\t进程名\t优先级\t运行时间\t状态"); while (!processes.isEmpty()) { // 根据优先级排序 processes.sort((p1, p2) -> p2.priority - p1.priority); Process process = processes.get(0); System.out.print(currentTime + "\t" + process.id + "\t" + process.name + "\t" + process.priority + "\t" + process.runtime); if (process.runtime <= timeSlice) { // 进程运行完毕 currentTime += process.runtime; totalTurnaroundTime += currentTime; totalResponseTime += currentTime; processes.remove(process); System.out.println("\t完成"); } else { // 进程执行一个时间片 currentTime += timeSlice; process.runtime -= timeSlice; process.priority++; totalWaitingTime += currentTime; totalResponseTime += currentTime; System.out.println("\t执行中"); } } double avgTurnaroundTime = (double) totalTurnaroundTime / n; double avgWaitingTime = (double) totalWaitingTime / n; double avgResponseTime = (double) totalResponseTime / n; System.out.println("平均周转时间:" + avgTurnaroundTime); System.out.println("平均等待时间:" + avgWaitingTime); System.out.println("平均响应时间:" + avgResponseTime); } } ``` 该程序首先从用户输入中读取进程的信息,然后根据优先级选择要执行的进程,并模拟进程的执行过程。程序会输出每个进程的运行状况,并最终统计系统整体的平均周转时间,平均等待时间,平均响应时间。 需要注意的是,该程序仅仅是一个简单的示例程序,并没有考虑很多实际的情况,比如进程的抢占、进程的阻塞等。如果需要实现一个更加完善的进程调度程序,需要考虑更加复杂的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥学

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值