如何进行linux0.11进程睡眠唤醒的原理分析
发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,如何进行linux0.11进程睡眠唤醒的原理分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。进程的睡眠是通过调用sleep_on函
千家信息网最后更新 2025年01月28日如何进行linux0.11进程睡眠唤醒的原理分析
如何进行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进程睡眠唤醒的原理分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
进程
节点
睡眠
指向
信号
指针
函数
地址
时候
状态
原理
分析
问题
队列
保证
全局
变量
更多
切换
帮助
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发岗位津贴发放标准
数据库表怎么缩小
数据库吸客力度
为什么要创建网络数据库
网络安全实例100例
郑州软件开发驻场一天费用
数据库中如何存储图片
数据库中 top 怎么用
小红心互联网科技
pg怎么显示数据库
云服务器对网站审核
临沂市铭然网络技术有限公司
数据库对日期的条件查询条件
idea 部署到服务器
软件开发工程师就业需求
为什么学好软件开发
数据库系统软件和应用哪个好
捷顺一卡通管理服务器名称
品浪网络技术
网吧服务器怎么做
欧普康视软件开发怎样
网络安全群智分析平台
太原软件开发软件界面设计流程
数据库非空是 怎么表示
互联网金融与金融科技金雪军
linux开源数据库教程学习
网络信息安全和数据库的关系
中信通讯软件开发北京待遇
网络安全法竞答中奖名单
java获取数据库日期