温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-12-03 15:20:34 阅读:238 作者:柒染 栏目:大数据
Linux服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

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

进程的睡眠是通过调用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进程睡眠唤醒的原理分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/u/4217331/blog/4379804

AI

开发者交流群×