计算ANSI C中先到先服务的等待时间

时间:2012-02-28 09:22:59

标签: c

在针对Linux环境的ANSI C中编写CPU调度时,我无法计算每个排队进程的等待时间。基本上,我需要使用4个cpus运行20多个进程,并测量每个进程所需的时间,平均所需时间,CPU消耗等。

以下是我尝试编写代码的过程的类比:

Click me for the image

我画的图像试图简化我的问题...... 但这是先到先得的CPU调度程序, 计数器A是CPU突发,计数器B是设备突发, 第1行是Ready Queue,第2行是Device Queue ...

直到现在,我能够将任务输出到一个数组中,但对于我的任务,我需要找出每个人等待多长时间,每个进程的周转时间以及它们的平均值倍。

每个人结构都有一个“到达时间”,可以随时更改 每个人结构也有一个在每个计数器“timeRequired []”所需的时间数组,它是交替的,索引0用于计数器A,索引1用于计数器B,索引2再用于A。 每个person结构都有一个timeRequired [],“arrayPointer”

的数组指针

我画的画面说秒,但它实际上是任何单位时间,整数, 我真的不需要实际的时钟...

到目前为止我做的是创建了2个线程函数,1个用于counterA,1个用于counterB, 当A完成为一个人排队服务时,A会把这个人塞进B线, 当B完成一个人时,它会把它塞进A线。

我觉得一切都已经存在,但我真的不知道从这里需要做什么来计算他们的等待时间......

或者有比使用线程更简单的解决方案吗?

教授给了我们2个文件

辅助方法

[http://pastebin.com/qF7nQsUR]

头文件

[http://pastebin.com/nQQNXnmq]

2 个答案:

答案 0 :(得分:0)

gettimeofday的(2)。

进程'struct

中的某个位置
struct timeval bornon;    /* time this process was born */

然后在您的分配路径中调用gettimeofday

if (gettimeofday(&process->bornon, NULL) == -1)
    err(1, "ohnoes! gettimeofday!");

然后在您的流程完成后再次调用

struct timeval doneon;
int secs, usecs;

gettimeofday(&doneon, NULL);
secs = doneon.tv_secs - process->bornon.tv_secs;
usecs = doneon.tv_usecs - process->bornon.tv_usecs;

然后进行秒/微秒的转换。

答案 1 :(得分:0)

我会这样接近:

弄清楚如何编码输入。该程序需要以某种方式提供输入“person 1 needs ...” 这些定义可以起作用:

struct need {
   int person_id, counter_id, duration
};
struct need needs[] = {
   { 1, COUNTER_A, 500 },
   { 1, COUNTER_B, 200 },
...
};

接下来,您需要随时跟踪每个人的位置 这种结构可以描述一个人现在在做什么:

struct person_activity {
    int person_id;
    struct need *activity;
    int start_time;
}

这些数组可以描述每个人在任何领带中所做的事情