在针对Linux环境的ANSI C中编写CPU调度时,我无法计算每个排队进程的等待时间。基本上,我需要使用4个cpus运行20多个进程,并测量每个进程所需的时间,平均所需时间,CPU消耗等。
以下是我尝试编写代码的过程的类比:
我画的图像试图简化我的问题...... 但这是先到先得的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]
头文件
答案 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;
}
这些数组可以描述每个人在任何领带中所做的事情