成都创新互联网站制作重庆分公司

如何进行linux0.11进程睡眠唤醒的原理分析

如何进行linux0.11进程睡眠唤醒的原理分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

目前创新互联公司已为1000+的企业提供了网站建设、域名、虚拟空间、网站改版维护、企业网站设计、泽州网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

进程的睡眠是通过调用sleep_on函数,该函数修改了进程的状态并且通过schedule函数切换到其他进程执行,从而实现进程的挂起,TASK_UNINTERRUPTIBLE状态的进程只能被wake_up函数唤醒。TASK_INTERRUPTIBLE状态的进程可以被wake_up和信号唤醒。唤醒的时候也是通过修改进程的状态为可运行,然后等待下一次进程调度,被唤醒的进程不一定马上得到执行。

}
// 当前进程挂载到睡眠队列p中,p指向队列头指针的地址
void sleep_on(struct task_struct **p)
{
    struct task_struct *tmp;

    if (!p)
        return;
    if (current == &(init_task.task))
        panic("task[0] trying to sleep");
    /*
        *p为第一个睡眠节点的地址,即tmp指向第一个睡眠节点
        头指针指向当前进程,这个版本的实现没有采用真正链表的形式,
        他通过每个进程在栈中的临时变量形成一个链表,每个睡眠的进程,
        在栈里有一个变量指向后面一个睡眠节点,然后把链表的头指针指向当前进程,
        然后切换到其他进程执行,当被wake_up唤醒的时候,wake_up会唤醒链表的第一个
        睡眠节点,因为第一个节点里保存了后面一个节点的地址,所以他唤醒后面一个节点,
        后面一个节点以此类推,从而把整个链表的节点唤醒,这里的实现类似nginx的filter,
        即每个模块保存后面一个节点的地址,然后把全局指针指向自己。
    */
    tmp = *p;
    *p = current;
    // 不可中断睡眠只能通过wake_up唤醒,即使有信号也无法唤醒
    current->state = TASK_UNINTERRUPTIBLE;
    schedule();
    // 唤醒后面一个节点
    if (tmp)
        tmp->state=0;
}

void interruptible_sleep_on(struct task_struct **p)
{
    struct task_struct *tmp;

    if (!p)
        return;
    if (current == &(init_task.task))
        panic("task[0] trying to sleep");
    tmp=*p;
    *p=current;
/*
    可中断地睡眠,可以通过wake_up和接收信号唤醒,不可中断的时候,
    能保证唤醒的时候,是从前往后逐个唤醒,但是可中断睡眠无法保证这一点,
    因为进程可能被信号唤醒了,所以需要判断全局指针是否指向了自己,即自己插入
    链表后,还有没有进程也插入了该链表
*/
repeat:    current->state = TASK_INTERRUPTIBLE;
    schedule();
    /*
        这里为true,说明是信号唤醒,因为wake_up能保证唤醒的是第一个节点,
        这里先唤醒链表中比当前进程后插入链表的节点,有点奇怪,自己被信号唤醒了,
        去唤醒别的进程,自己却还睡眠
    */
    if (*p && *p != current) {
        (**p).state=0;
        goto repeat;
    }
    // 类似sleep_on的原理
    *p=NULL;
    if (tmp)
        tmp->state=0;
}
// 唤醒队列中的第一个节点,并清空链表,因为第一个节点会向后唤醒其他节点
void wake_up(struct task_struct **p)
{
    if (p && *p) {
        (**p).state=0;
        *p=NULL;
    }
}

关于如何进行linux0.11进程睡眠唤醒的原理分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


文章名称:如何进行linux0.11进程睡眠唤醒的原理分析
浏览地址:http://cxhlcq.com/article/ihgccc.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部