首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现线程调度器轮询和线程取消

实现线程调度器轮询和线程取消
EN

Stack Overflow用户
提问于 2016-11-29 19:01:26
回答 1查看 1.6K关注 0票数 2

我是C语言和linux的新手,英语不是我的母语。对此我很抱歉。

我正在做一个学校项目,它是在linux上实现一个循环调度程序,我在实现调度程序和thread_self时遇到了一些问题。

调度器首先检查就绪队列是否为空,如果是,设置时间片和告警(时间片)。否则,从就绪列表中查找新线程,调度新线程的TCB,设置时间片,上下文切换到新线程,设置告警(时间片)。但在某些情况下,我不断收到错误,并且我找不到修复的位置。

另一件事是关于thread_cancel的。int thread_cancel(thread_t tid)函数删除目标tcb,我需要使用tid查找目标tcb。我试着像

代码语言:javascript
复制
Thread* temp = getpid();
kill(pid, SIGKILL);

但是我不知道如何从队列中删除tcb。请给我一些更好的想法!

Thread.h

代码语言:javascript
复制
typedef struct _Thread{
    ThreadStatus status;
    pid_t pid;
    Thread* pPrev;
    Thread* pNext;
}Thread;
Thread* ReadyQHead;
Thread* ReadyQTail;

-Queue

代码语言:javascript
复制
typedef struct _queue{
    Thread* head;
    Thread* tail;
    unsigned int num;
} queue;

queue* runList;
queue* readyList;
queue* waitList; 

-Queue.c

代码语言:javascript
复制
void enqueue(queue * q, Thread* tcb)
{
    if(q->num == 0) {
        q->head = tcb;
        q->tail = tcb;
    } else {
        q->tail->pNext = tcb;
        q->tail = tcb;
    }
    q->num ++;
}

Thread * dequeue(queue * q)
{
    Thread * tmp;
    if(q->num == 0) return NULL;
    else if(q->num == 1) {
        tmp = q->head;
        q->head = NULL;
        q->tail = NULL;
    } else {
        tmp = q->head;
        q->head = q->head->pNext;
    }
    q->num --;
    return tmp;
}

-Scheduler

代码语言:javascript
复制
void alarmHandler(int signal)
{
    printf("Scheduler awake!!");
    /*Do schedule*/
}

int RunScheduler( void )
{
    //check if ready queue is empty
    if(is_empty(readyList) != 0)
    {
        printf("this is weird");
        signal(SIGALRM, alarmHandler);
    }
    else {
        /*Look up a new thread from ready list*/
        Thread* tmp = ReadyQHead;

        /*send sigcont*/
        kill(tmp->pid, SIGCONT);

        //dispatch TCB of new thread
        if(is_empty(runList) != 0 && runList->head->status == 0)
            enqueue(readyList, tmp);

        //pick thread at head of ready list as first thread to dispatch
        tmp->status = 0; // tmp == runningTcb
        printf("alive tcb : %d\n", tmp->pid);

        ReadyQHead = dequeue(readyList);
        //set timeslice
        signal(SIGALRM, alarmHandler);
        //context switch to new thread
        _ContextSwitch(tmp->pid, ReadyQHead->pid);

    }

    while(1){
        alarm(TIMESLICE);
    }

    return 0;
}


void _ContextSwitch(int curpid, int tpid)
{
    kill(curpid, SIGSTOP);
    kill(tpid, SIGCONT);
}
EN

回答 1

Stack Overflow用户

发布于 2016-12-02 01:25:57

下面是一个简单的round robin示例

代码语言:javascript
复制
while(1)
{
    process1();
    process2();
    process3();
    process4();
    ....
    processN();
}

任何更复杂的事情,例如在进程“休眠”时进行上下文切换,或者在等待I/O时进行上下文切换,或者由于进程需要定时运行或由于中断事件而进行上下文切换,都会增加大量的复杂性。

那么你的目标到底是什么呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40864224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档