在C中实现MLFQ(多级反馈队列)的最佳方法是什么?

时间:2014-10-12 17:24:57

标签: c multithreading scheduling

我有一个我需要实现的功能。 线程使用这些参数调用此函数。它应该以正确的时间返回它访问CPU,如果它无法访问CPU,它将等到它可以访问它。

关于正确的时间,我保留一个每次更新的全局变量,它会调用它。

如何实现等待并正确同步。

int MLFQ(float currentTime, int tid, int remainingTime, int tprio)

到目前为止,我的代码看起来像这样,但它不太有用。

update globalTime (globalTime = currentTime)
Mutex_lock
Add to MLFQ if needed (either to 5, 10, 15, 20, or 25 MLFQ)
if (canAccessCPU)
    getCPU
    unlock mutex
    return globalTime
else
    mutex_unlock
    return MLFQ(globalTime, tid, remainingTime, tprio);

1 个答案:

答案 0 :(得分:2)

您的帖子使用伪代码,并且存在一些含糊之处,所以如果我在这里做出错误的假设,请评论:

如何实现等待并正确同步 [?]

等待

线程中的等待通常以不阻塞其他线程的方式实现。线程工作者函数底部的 Sleep() 允许被调用线程休眠一段时间,即与其他进程共享时间。在Windows中,它的原型为:

VOID WINAPI Sleep(
  _In_  DWORD dwMilliseconds
);  

Linux sleep() 此处

<强> 同步
可以通过多种方式完成。假设您指的是保持调用从多个线程进入的顺序,您可以创建一个简单的结构,该结构可以作为参数传回,该参数可以包含是否访问uP的TRUE / FALSE指示,以及时间尝试了:

  

在someheader.h文件中:

typedef struct  {
    int uPAccess;
    time_t time;
}UP_CALL;

extern UP_CALL uPCall,* pUPCall;

  

在所有.c文件中,您将使用:

#include "someheader.h" 
  

在其中一个.c文件中,您必须初始化结构:也许在   主要成果:

int main(void)
{
    pUPCall = &uPCall;
    //other code  
    return 0;
} 

现在,您可以在线程工作器函数中包含指向struct的指针(通常,全局变量存在线程之间的访问争用风险,但您使用mutex进行保护),以获取访问尝试的时间,并且成功尝试