先进先出c ++算法

时间:2011-03-29 05:16:01

标签: c++

我被要求编写一个代码来计算Cpu算法的平均等待时间和平均周转时间。 FIFO,SJF,RR和基于优先级的调度。我应该从一个看起来像这样的文本文件中读取...除了很多longers ..大约2100个进程。

Process Arrival Burst   Priority
p1       31      9       41
p2       35      21      36
p3       6       55      61
p4       42      50      13
p5       36      85      58

我设法从文件中读取到一个2D数组..但我不知道我应该如何使用数组来进行那些计算..我对整个指针的事情并不透彻。那么..无论如何都要在不使用指针的情况下进行这些计算?这是我到目前为止编写的代码..

int main()
{
    string text[15][4]; 
    string f_comp[15][4];

    ifstream stream1("D:\\College\\OS\\OSassignment_sol\\idiot.txt");   
    if(!stream1)
    {
        cout<<"Cannot read file\n";
        exit(1);
    }

    while(!stream1.eof())               
    {
        for(int i=0; i<15; i++)
        {
            for(int j=0; j<4; j++)
            {
                stream1>>text[i][j];    
            }

        }

    }  


    //Checking if the stream has been assigned into the array correctly.
    for(int i=0; i<15; i++)
    {
        for(int j=0; j<4; j++)
        {
            cout<<text[i][j]<<"\t";

        }
        cout<<endl;
    }

    int z;
    cin>>z;
}

2 个答案:

答案 0 :(得分:0)

您可能需要实现每个调度算法并编写某种模拟器。

不要使用数组,因为我总是发现很难记住在哪里,考虑使用结构。

struct Process {
    std::string name;
    int arrival;
    int burst;
    int priority;
};

然后,您可以为您正在使用的任何调度算法选择适当的数据结构。模拟器应该做这样的事情......

  1. 将此时应启动的所有进程放入runnable queue
  2. 安排是否需要发生某些事情(由于定时器中断或当前进程等待)
  3. 减少当前正在运行的进程突发时间(因为它已经运行了额外的滴答)
  4. 在当前时间添加一个
  5. 重复完成
  6. 如果你能用你想要的任何语言做到这一点,那么使用脚本语言可能会更容易,因为这可能不是性能关键(真正的调度程序)。

    我建议你不要使用数组,因为它们会变得非常混乱。即使这是C,我仍然建议使用结构来代替数组。

    特别是,FIFO非常简单。您只需将活动进程保持在列表/向量结构中并继续运行,直到突发为0.然后弹出容器的前面并执行相同的操作,直到您的进程用完为止。

    为了保持等待时间,您可以只计算每个滴答中等待队列中当前有多少进程并将它们放在一起。对于周转时间,您可以保留添加流程的时间以及流程何时完成,计算流程完成所需的时间。然后将该时间添加到您保留的平均值。

答案 1 :(得分:0)

如果您创建一个表示流程的结构,您会发现这更容易:

struct Process
{
    std::string name_;
    int arrival_, burst_, priority_;
};

然后,您应该创建std::vector<Process> processespush_back()以从输入中添加新值:

Process process;
while (std::cin >> process.name_ >> process.arrival_ >> process.burst_ >> process.priority_)
    processes.push_back(process);

然后,您需要使用这些数字来模拟每个调度策略,收集到达时间和完成之间的时间单位(到达时间和突发数量似乎在任意时间单位)的统计信息:即突发时间_该工作已完成工作单元。

例如,对于FIFO,您可以按到达时间对进程向量进行有效排序,然后按递增到达时间的顺序对它们进行迭代。具有最低到达率的进程在没有等待的情况下开始,并在burst_之后完成。因此,下一个作业的开始时间不能在第一个作业的完成时间之前:到达_ +爆裂_:如果第二个作业提前到达,则会累积其结果的等待时间,否则第二个作业也不必等待。继续重复所有工作。

其他一些算法会更复杂:例如,对于SJF,您需要在每次调度模拟完成上一个作业时跟踪哪些作业正在等待,因为它将从该组中选择最短的burst_值工作是下一个执行的过程。