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

在c中首先调度最短的作业

郑光济
2023-03-14

所以我正在研究调度,包括FCFS和最短作业优先。我首先真的在纠结我最短的工作,我看不到我的逻辑错误。我把它打印出来,有些数字是正确的,但不是全部。我使用的测试文件包含以下文本:

1   0   6
2   3   2
3   5   1
4   9   7
5   10  5
6   12  3
7   14  4
8   16  5
9   17  7
10  19  2

我使用

任何帮助,指针或代码,将不胜感激!

编辑我认为我的问题是基于sfj函数的逻辑。对于输入,第一列是进程id,第二列是到达时间,第三列是突发时间或进程需要cpu多长时间。

我得到的输出是:

Shortest Job First
PID     WAIT    TURNAROUND
1       0       6
2       15      17
3       3       4
4       0       7
5       6       11
6       9       12
7       10      14
8       12      17
9       16      23
10      21      23
Average Wait: 9 Average Turnaround 13

当我真正期望时:

Shortest Job First

Pid     Wait    Turnaround
1       0       6
2       4       6
3       1       2
4       0       7
5       15      20
6       4       7
7       7       11
8       14      19
9       18      25
10      0       2
Average wait: 6.3 Average turnaround: 10.5
//  File.c
//  Project6
//
//  Created by Chris on 6/19/14.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#define LINELEN 512
#define MAX_PROCESS 100

typedef struct process
{
    int ID;
    int arrival_time;
    int time_to_completion;
    int wait_time;
    int turn_around;
    int active;

}process;
void fcfs(struct process[MAX_PROCESS], int);
void sjf (struct process[MAX_PROCESS], int);
void srtn(struct process[MAX_PROCESS], int);
void rr (struct process[MAX_PROCESS], int);
void rrc(struct process[MAX_PROCESS], int);
void print_info(struct process[MAX_PROCESS], int);
void sort_by_time(struct process array[MAX_PROCESS], int num_valid_pid);

int main(int ac,char *av[])
{
    int counter=0;
    int p1=0, p2=0, p3=0;
    process array[MAX_PROCESS];
    while ( scanf("%d %d %d", &p1, &p2, &p3) != EOF ){//Get all the info available and put it in array of structs
        array[counter].ID = p1;
        array[counter].arrival_time = p2;
        array[counter].time_to_completion = p3;
        counter++;
    }
    fcfs(array, counter);
    sjf (array, counter);
    /*srtn(array, counter);
    rr (array, counter);
    rrc(array, counter);*/
    return 0;
}
void fcfs(struct process array[MAX_PROCESS], int num_pid){
    //for loop num_pid
    int i;
    int current_time = 0;
    for(i=0; i<num_pid; i++){
    //if arrival is < current time, wait time = current time - arrival
        if(array[i].arrival_time < current_time)
            array[i].wait_time = current_time - array[i].arrival_time;
    //if arrival is >= current time, wait time = 0;
        else if(array[i].arrival_time >= current_time)
            array[i].wait_time = 0;
    //current time = current time + wait time + time to completion
        current_time= current_time + array[i].time_to_completion;
    //turnaround time = wait time + time to completion
        array[i].turn_around = array[i].wait_time + array[i].time_to_completion;
    }
    printf("First Come First Serve\n");
    print_info(array, num_pid);
}
void sjf (struct process array[MAX_PROCESS], int num_pid){
    printf("Shortest Job First\n");//for the output so we know what algorithm
    //create an array of pids that are valid to search.
    int num_valid_processes = 0, current_time=0, i,j, next_process, counter = 0;//declarations
    process to_sort[MAX_PROCESS];

    //we want to do this next loop for as many processes as we have, or num_pid
    for(j=0; j<num_pid; j++){
        //adds all the available processes to the to sort array to be sorted
        //available means that it has arrived, which means it is <= current_time
        //after it gets all the processes, it breaks out of the for loop
        for(i=counter; i<num_pid; i++){
            if(array[i].arrival_time<=current_time){
                to_sort[i]=array[i];
                num_valid_processes++;
                counter++;
            }
            else
                break;
        }
        //sort the to_sort array by the time_to_completion
        sort_by_time(to_sort,num_valid_processes);

        //set the wait time and turnaround time for the next process
        next_process = to_sort[0].ID;
        array[next_process].wait_time = current_time-array[next_process].arrival_time;
        array[next_process].turn_around = array[next_process].wait_time + array[next_process].time_to_completion;
        //change the current_time and continue
        //current time = current time + wait time + time to completion
        current_time= current_time + array[next_process].time_to_completion;

        //delete the process we just worked on so we don't get duplicates.
        num_valid_processes--;
        for(i=0;i<num_valid_processes;i++){
            to_sort[i]=to_sort[i+1];
        }
    }
    //loop back up to get available processes
    //now all the info in out first array is filled out, print it out.
    print_info(array, num_pid);
}

void print_info(struct process array[MAX_PROCESS], int num_pid){
    int i;
    int tot_wait=0, tot_turn = 0;
    printf("\x1b[04mPID\tWAIT\tTURNAROUND\n\x1b[24m");
    for(i=0; i<num_pid; i++){
        printf("%d\t%d\t%d\n", array[i].ID, array[i].wait_time, array[i].turn_around);
        tot_wait=tot_wait+array[i].wait_time;
        tot_turn = tot_turn +array[i].turn_around;
    }
    printf("Average Wait: %d Average Turnaround %d\n", tot_wait/num_pid, tot_turn/num_pid);
}

void sort_by_time(struct process array[MAX_PROCESS], int num_valid_pid)
{
    int i,j;
    for (i = 0; i < num_valid_pid; i++)
    {
        int min = i;
        for (j = i+1; j < num_valid_pid; j++)
            if (array[j].time_to_completion < array[min].time_to_completion)
                min = j;
        process temp = array[i];
        array[i] = array[min];
        array[min] = temp;
    }
}

共有1个答案

施利
2023-03-14

问题最终出在sjf函数中,赋值的for循环不正确,应该是

for(i=counter; i<num_pid; i++){
        if(array[i].arrival_time<=current_time){
            to_sort[num_valid_process]=array[i];
            num_valid_processes++;
            counter++;
        }
...
 类似资料:
  • 假设以下进程在指定的时间到达执行。每个进程将运行列出的时间量。 我想绘制甘特图并计算抢占式最短作业优先调度的平均等待时间。 解决办法 http://imgur.com/fP8u61C 等待时间为2毫秒。 请告诉我这是否正确。 我怀疑的步骤是,在进程B到达的3ms时,调度程序是完成进程A还是启动进程B。

  • 我已经创建了一个C程序来模拟非抢占式最短作业优先算法,但它在某些输入上有缺陷。最短作业优先算法程序接受所需数量的过程的到达和突发时间的输入,并将过程安排在两个阶段中。第一阶段涉及根据到达时间来安排节目,第二阶段根据突发时间来安排节目,假设它们的到达时间低于前一过程完成的时间。这一切最终都会被编译并显示出来。 这些是预期的结果: 这些是我通过我的程序获得的结果: 任何帮助都将不胜感激。谢谢!

  • 到目前为止,我们根据它们的到达时间(在FCFS调度中)调度这些进程。 但是,SJF调度算法根据其突发时间安排进程。 在SJF调度中,就绪队列中可用进程列表中的突发时间最短的进程将在下一个进行调度。 然而,预测一个过程所需的突发时间是非常困难的,因此这个算法在系统中很难实现。 SJF的优势 最大吞吐量 最低的平均等候时间和周转时间 SJF的缺点 可能会面临饥饿问题 这是不可实现的,因为一个进程的确切

  • 我熟悉最短进程下一个调度算法(SJF),它是一种非抢先算法。但是,该算法一次只能处理一个突发时间最小的进程。是否可以一次修改为“下一个最短流程2”? 所以对于这里提到的例子: 第一行表示进程总数。随后的行表示进程ID、到达时间、突发时间。 一次有两个流程的SJF计划将按如下方式工作: 这里 Idle表示当前有多少处理器空闲。在这种情况下,有2个处理器。可以观察到,在时间< code>t=4,有2个

  • 我正在尝试在java中编写CPU调度模拟器。进程按照顺序处理,因此应该首先处理具有最少突发时间(处理时间)的进程。在开始之前,我在ArrayList中输入所有进程,指定名称,突发时间 问题是进程有不同的到达时间。我如何编辑代码来考虑这个到达时间。 我只需要编辑代码的一部分,让我的进程具有最少的突发时间(相对于到达时间) 样本输出

  • 我了解最短作业优先(非抢占)调度是如何工作的。基本上,当CPU完成当前作业时,它会选择队列中最短的作业进行下一步执行。 这是我在网上找到的一个例子。 我试图理解这个例子会是什么样的,如果它是对SJF未来的预测。关于如何计算下一个预测的例子有很多[举例]。但是我找不到一个例子来说明预测的CPU突发时间将如何用于选择下一个要执行的作业。 假设Tn是第n个作业的预测突发时间。tn是实际突发时间。最初的预