gpt4 book ai didi

c - 为用户空间线程库编写调度程序

转载 作者:行者123 更新时间:2023-11-30 16:00:10 24 4
gpt4 key购买 nike

我正在开发一个用户空间抢先线程库(光纤),它使用上下文切换作为基本方法。为此我写了一个调度程序。然而,它的表现并没有达到预期。我对此有什么建议吗?使用的thread_t的结构是:

typedef struct thread_t {
int thr_id;
int thr_usrpri;
int thr_cpupri;
int thr_totalcpu;
ucontext_t thr_context;
void * thr_stack;
int thr_stacksize;
struct thread_t *thr_next;
struct thread_t *thr_prev;
} thread_t;

调度函数如下:

void schedule(void)
{
thread_t *t1, *t2;
thread_t * newthr = NULL;
int newpri = 127;
struct itimerval tm;
ucontext_t dummy;
sigset_t sigt;


t1 = ready_q;

// Select the thread with higest priority
while (t1 != NULL)
{
if (newpri > t1->thr_usrpri + t1->thr_cpupri)
{
newpri = t1->thr_usrpri + t1->thr_cpupri;
newthr = t1;
}

t1 = t1->thr_next;
}

if (newthr == NULL)
{
if (current_thread == NULL)
{
// No more threads? (stop itimer)
tm.it_interval.tv_usec = 0;
tm.it_interval.tv_sec = 0;
tm.it_value.tv_usec = 0; // ZERO Disable
tm.it_value.tv_sec = 0;
setitimer(ITIMER_PROF, &tm, NULL);
}
return;
}
else
{
// TO DO :: Reenabling of signals must be done.
// Switch to new thread
if (current_thread != NULL)
{
t2 = current_thread;
current_thread = newthr;
timeq = 0;
sigemptyset(&sigt);
sigaddset(&sigt, SIGPROF);
sigprocmask(SIG_UNBLOCK, &sigt, NULL);
swapcontext(&(t2->thr_context), &(current_thread->thr_context));
}
else
{
// No current thread? might be terminated
current_thread = newthr;
timeq = 0;
sigemptyset(&sigt);
sigaddset(&sigt, SIGPROF);
sigprocmask(SIG_UNBLOCK, &sigt, NULL);
swapcontext(&(dummy), &(current_thread->thr_context));
}
}
}

最佳答案

似乎“ready_q”(就绪线程列表的头部?)永远不会改变,因此最高优先级线程的搜索总是找到第一个合适的元素。如果两个线程具有相同的优先级,则只有第一个线程有机会获得CPU。您可以使用许多算法,有些算法基于优先级的动态变化,其他算法则使用就绪队列内的某种轮换。在您的示例中,您可以将选定的线程从就绪队列中的位置中删除并放入最后一个位置(它是一个双链表,因此该操作很简单且相当便宜)。另外,我建议您考虑由于ready_q中的线性搜索而导致的性能问题,因为当线程数量很大时,这可能是一个问题。在这种情况下,更复杂的结构可能会有所帮助,其中具有不同优先级的不同线程列表。再见!

关于c - 为用户空间线程库编写调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com