当前位置: 技术问答>linux和unix
怎么判断linux内核函数是否会引起休眠?
来源: 互联网 发布时间:2016-03-14
本文导语: 还想问的是"函数引起内核线程休眠是一个什么概念?" linux里面线程和进程是不分的,除了线程共享内存管理以外. 因为内核会有多个线程(进程),而休眠一说是针对进程来讲.所以当前的内核线程休眠了,内核调度可以运行...
还想问的是"函数引起内核线程休眠是一个什么概念?"
linux里面线程和进程是不分的,除了线程共享内存管理以外.
因为内核会有多个线程(进程),而休眠一说是针对进程来讲.所以当前的内核线程休眠了,内核调度可以运行其他的内核线程,或者用户进程.
关键我是不清楚,什么样的动作会引起内核线程的休眠,请教各位兄弟姐妹了!
linux里面线程和进程是不分的,除了线程共享内存管理以外.
因为内核会有多个线程(进程),而休眠一说是针对进程来讲.所以当前的内核线程休眠了,内核调度可以运行其他的内核线程,或者用户进程.
关键我是不清楚,什么样的动作会引起内核线程的休眠,请教各位兄弟姐妹了!
|
什么样的动作会引起内核线程的休眠
------------------
自己sleep,等待IO等。
ps:中断处理程序(上半步)没有进程环境,运行时处于中断上下文中而不处于进程上下文中,谈不上被schedule。
------------------
自己sleep,等待IO等。
ps:中断处理程序(上半步)没有进程环境,运行时处于中断上下文中而不处于进程上下文中,谈不上被schedule。
|
还有看你在什么地方使用,要是是编写中断处理就不要用导致休眠的函数,楼上都说了
我再补充几个吧,信号量,wait队列,completion,自己调用schedule,用GFP_KERNEL指定的内存分配kmalloc,get——free——page等函数会睡眠
从代码上分析,如果函数调用了其他函数,追朔回去只要有对scheduled的调用就会睡眠。
从操作系统原理解释就是,当你需要获取资源(硬件资源,内存资源,一个数据结构等),而资源不可得,此时不应该忙等本进程就应该睡眠,直到资源可用。你可以试着分析是否有这种‘请求语境’出现,比如请求内存,而内存可能分配给了其他进程,要分配给你内存就意味着可能从其他进程把內存页调来给你用,请求io,io设备有可能不可得,这些情况下都会带来休眠。
我再补充几个吧,信号量,wait队列,completion,自己调用schedule,用GFP_KERNEL指定的内存分配kmalloc,get——free——page等函数会睡眠
从代码上分析,如果函数调用了其他函数,追朔回去只要有对scheduled的调用就会睡眠。
从操作系统原理解释就是,当你需要获取资源(硬件资源,内存资源,一个数据结构等),而资源不可得,此时不应该忙等本进程就应该睡眠,直到资源可用。你可以试着分析是否有这种‘请求语境’出现,比如请求内存,而内存可能分配给了其他进程,要分配给你内存就意味着可能从其他进程把內存页调来给你用,请求io,io设备有可能不可得,这些情况下都会带来休眠。
|
楼上的兄弟说了, 会引起睡眠的函数就那么几个。
睡眠 的本质是 该进程 处于一种特殊的不可执行状态,(TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE)
这样, 调度程序就不会去执行他,而实现睡眠。
进程睡眠的原因, 肯定是为了等待一些事情,从文件 I/O读取数据,或者是某个硬件时间,或者等待一个信号量。
睡眠 的本质是 该进程 处于一种特殊的不可执行状态,(TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE)
这样, 调度程序就不会去执行他,而实现睡眠。
进程睡眠的原因, 肯定是为了等待一些事情,从文件 I/O读取数据,或者是某个硬件时间,或者等待一个信号量。
|
你说的内核线程是什么?
如果是kernel_thread创建的话,应该和普通的进程一样具有进程环境,可以被调度到的
如果是中断处理程序这样的,如果调用schedule切换出去,由于没有进程环境,会引起系统崩溃的,halt了,也不是休眠阿
如果是kernel_thread创建的话,应该和普通的进程一样具有进程环境,可以被调度到的
如果是中断处理程序这样的,如果调用schedule切换出去,由于没有进程环境,会引起系统崩溃的,halt了,也不是休眠阿
|
没遇到过这种情况.