当前位置: 首页 > 知识库问答 >
问题:

如何计算过程的完成时间?- 最短剩余时间优先算法

蒙才
2023-03-14

我使用最短剩余时间优先算法(SRTF)来计算流程的平均等待时间和周转时间。

我想以如下所示的表格格式打印结果。

Enter the number of processess:4

Enter the process name, CPU Burst Time, Arrival Time row wise:
1 3 0
2 6 1
3 4 4
4 2 6

    Process CPU     AT      Finish  TT      WT
    1       3       0       3       3       0
    2       6       1       15      14      9
    3       4       4       5       1       1
    4       2       6       5       -1      3

The average turnaround time is: 4.000000
The average waiting time is: 3.000000

这里AT=到达时间,TT=周转时间,WT=等待时间。但是由于过程3和4的完成时间不可能,出现了一些错误。这是我的代码:

#include<stdio.h>
#include<stdlib.h>

int **a;
int return_min(int upto, int n)
{
        int min=1000, idx =-1;
        for(int i=0; i<n; i++)
        {
                if(a[i][1]!=-1 && a[i][2]<=upto && min>a[i][1])
                {
                        min=a[i][1];
                        idx = i;
                }
        }
        return idx;
}


void main()
{
        int n,i,j,time=0, idx,total_tt=0, total_wt=0;
        float  avg_tt, avg_wt;


        printf("Enter the number of processess:");
        scanf("%d",&n);
        a=(int **)malloc(sizeof(int *)*n);


        printf("\nEnter the process name, CPU Burst Time, Arrival Time row wise:\n");
        for(i=0;i<n;i++)
        {
                *(a+i)=(int *)malloc(sizeof(int)*7);
                for(j=0;j<3;j++)
                {

                        scanf("%d",&a[i][j]);
                }
                a[i][6]=a[i][1];
        }

        while((idx=return_min(time,n)) != -1)
        {
                a[idx][1]--;
                if(a[idx][1] == 0)
                        a[idx][1]--;
                time++;
                for(int i=0; i<n; i++)
                {
                        if(a[i][1]!=-1 && i!=idx && a[i][2]<=time)
                                a[i][5]++;
                }
        }

        printf("\n\tProcess\tCPU\tAT\tFinish\tTT\tWT\n");

        for(i=0;i<n;i++)
        {

                a[i][1]=a[i][6];
                a[i][3]=a[i][5]+a[i][1];
                a[i][4]=a[i][3]-a[i][2];

                for(j=0;j<6;j++)
                {
                        printf("\t%d",a[i][j]);
                }

                printf("\n");
        }
        for(i=0;i<n;i++)
                total_tt+=a[i][4];

        avg_tt = total_tt/n;
        printf("\nThe average turnaround time is: %f", avg_tt);

        for(i=0;i<n;i++)
                total_wt+=a[i][5];

        avg_wt = total_wt/n;
        printf("\nThe average waiting time is: %f\n", avg_wt);


}

我犯了什么错误?请纠正我。

共有1个答案

熊博远
2023-03-14

请注意:

周转时间=完成时间-到达时间

等待时间 = 周转时间 - CPU 突发时间

因此

您应该将主函数中第二个 for 循环中的代码更改为:

a[i][4]=a[i][5]+a[i][1];
a[i][3]=a[i][4]+a[i][2];

最终它会正常工作。

 类似资料:
  • 该算法是SJF调度的抢先版本。 在SRTF中,过程的执行可以在一段时间后停止。 在每个进程到来时,短期调度程序在可用进程列表和正在运行的进程中以最少的剩余突发时间安排进程。 一旦所有进程都在就绪队列中可用,就不会执行抢占,并且该算法将作为SJF调度工作。 当进程从执行中被移除并且下一个进程被调度时,进程的上下文被保存在进程控制块中。 该PCB在下一次执行该过程时被访问。 示例 在这个例子中,有五个

  • 我正在尝试在 java 中模拟 CPU 调度算法并使用多线程。我已经成功地实施了FCFS(先到先得)和SJF(最短的工作优先)。但问题是当我开始想到SRTF(最短剩余时间优先)时,它是SJF的一种先发制人的形式。我正在使用以下模型: CPU的线程,它有一个变量,它每保持滴答声(一个简单的时钟增量)。我有一个标志,用于在开始执行之前检查CPU是否可用。 长期调度程序(LTS)的线程,它将进程从进程列

  • 接下来的最短剩余时间如何解决这个问题?“最短作业优先”的抢占式版本。 我了解选择完成前剩余时间最少的过程来执行。但是,如果到达的新进程的突发时间与当前正在执行的进程的剩余完成时间完全相同,会发生什么情况? 如果一个新进程到达,其突发时间与当前执行的进程相同(如本例所示),那么当前执行的过程是否继续? 我的理解正确吗?提前谢谢你。

  • 如果它们是具有以下数据的两个过程,甘特图应该如何?(SRTF 调度) 进程到达突发 P1 0 17 P2 1 16 那么,进程P1会先完成,然后P2会开始执行……还是P1必须等待16毫秒?

  • 我的目标是计算抢占最短作业优先调度算法的平均等待时间。 假设作业的到达时间以2个单位为间隔,如0,2,4,6……即,第一个作业以0个单位进入,第二个作业在2个单位的时间后进入,以此类推。 我为我的程序测试了 3 个测试用例并得到了正确答案: 测试用例1: 作业:8,4,9,5 平均时间:6.5 测试用例2: 作业:7,4,1,4 平均时间:3 但是当我把一个有1000个作业的文件作为输入时,我得到

  • 引用脚本的内容: name "最大剩余空间" OutFile "maxfreespace.exe" !include LogicLib.nsh !include "FileFunc.nsh" !insertmacro GetDrives !insertmacro DriveSpace Section "" SectionEnd Var myno1 ;Var myno2 Var Dri