首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >唤醒(Void)在xv6中是如何工作的?

唤醒(Void)在xv6中是如何工作的?
EN

Stack Overflow用户
提问于 2018-04-24 18:57:23
回答 1查看 1.9K关注 0票数 1

我正在学习关于osdev的知识,并查找xv6代码,尤其是控制台代码。基本上,我不明白控制台是如何启动进程的。

控制台.c中有一个函数:

代码语言:javascript
复制
void consoleintr(int (*getc)(void)) {
    ....
    while((c = getc()) >= 0) {
       switch(c) {
           ....
           default:
               ....
               if(c == '\n' || c == C('D') || input.rightmost == input.r + INPUT_BUF) {
                   wakeup(&input.r);
       }
    }
}

因此,当行结束(或缓冲区长度超过最大值)时,它启动唤醒(&input.r)

然后,在proc.c中出现了这种情况。

代码语言:javascript
复制
// Wake up all processes sleeping on chan.
// The ptable lock must be held.
static void wakeup1(void *chan)
{
    struct proc *p;

    for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
        if(p->state == SLEEPING && p->chan == chan)
            p->state = RUNNABLE;
}

// Wake up all processes sleeping on chan.
void wakeup(void *chan)
{
    acquire(&ptable.lock);
    wakeup1(chan);
    release(&ptable.lock);
}

这里发生了什么事?为什么它要比较控制台缓冲区的地址和proc的chan?这是什么chan

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-26 08:01:43

它适用于等待(睡眠)控制台输入的进程。见这里:

代码语言:javascript
复制
235 int                                                                             
236 consoleread(struct inode *ip, char *dst, int n)                                 
...                                                        
251     sleep(&input.r, &cons.lock);

您提到的代码唤醒了这个休眠过程,因为数据来自控制台,现在可以进行处理。chan -是一个频道。你可以等待(睡觉)不同的事情。此通道用于控制台输入数据。

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

https://stackoverflow.com/questions/50009018

复制
相关文章

相似问题

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