如何进行linux0.11进程睡眠唤醒的原理分析
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,如何进行linux0.11进程睡眠唤醒的原理分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。进程的睡眠是通过调用sleep_on函
千家信息网最后更新 2025年12月03日如何进行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安全错误
数据库的锁怎样保障安全
ebay 数据库
设备管理的服务器地址是什么
前端如何与数据库交互
葫芦岛新零售软件开发设计
网络安全工作专题推进
自动化技术与数据库
吉林安防卫星授时服务器云主机
计算机网络技术专业的发展
服务器机柜维修公司哪个好
录音鉴定软件开发
网络安全泛指网络系统的
天津网络技术人员的工资
网络安全的实质和关键
软件开发做银行驻场
java软件开发学徒
如何做好网络安全
网络安全宣传周2020日程
北京 王艳 网络安全 湖南
浪潮存储服务器怎么配置
我的世界服务器给永久管理
北京联想软件开发
数据库包含几种后缀名文件
数据库何时加行锁
服务器机柜维修公司哪个好
实体linux服务器宕机
c 语句数据库信息修改
芜湖鼎文网络技术有限公司
租国外服务器安全
工信部颁发软件开发证书
长宁区专业性金融网络技术服务