【kernel的一己之见】【1】might_sleep

相信初识kernel的小伙伴们一定会对这个函数有印象。

might_sleep 直译过来就是可能会睡眠。

简单的搜索下这个函数的作用,很容易被告知:

这个函数正常是没有作用的,只是用来标示这一段代码可能会睡眠。

 

那么就出现了两个问题:

1.这个睡眠是啥,deepsleep?

2.没有作用为什么要写他?

以我个人的理解,这个睡眠是线程交出cpu的使用权,让其他代码运行。

而这个函数的作用,是给使用者一个寻问代码上下文的机会,

“嘿kernel,这个线程现在可以休息会儿吗?”

1.“当然可以” 那么无事发生,这个函数就当注释理解就好啦。

2.“不行,你看你手边的那个disable_irq标志是不是满足拉?我正在处理中断呢,如果现在休息了,大家都得等你”

“那咋整啊?” “这样,我给你打个log,你出去把代码改了,下次憋在这里用这种费时间的函数”

 

 

在debug模式下,如果在原子上下文(持有spinlock 或者irq disable)的状态下,默认是不能切换进程,进行睡眠操作的,如果直接或间接的调用了这个函数(如使用kmalloc分配内存),不管程序是否确实发生了睡眠,都会打印这一段log。

这就导致了你如果在suspend流程,cpu关完外设和全局中断,或者刚刚醒来,全局中断还没开,这个时候分配内存,就会打印警告。

 

结论:might_sleep和进程睡眠没有直接的关系,但是他会告知你这段程序写的不行,这个地方如果睡下去事情会很大条。记得将他放在可能会睡眠的函数中,好提醒别人这个函数不能这么调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值