schedule_timeout与mdelay的区别

  简单来说,在内核中使用delay函数,如果调用schedule_timeout有可能被signal打断,导致delay的时间小于预期,而mdelay可以确保等待的时间大于等于参数设置的时间,在一些hardware驱动当中使用的delay,安全起见,一般推荐使用mdelay或者usleep_range函数。

至于里面的原理,引用公司某大牛的解释:

schedule_timeout会做两件事
1. 设置timer
2. Schedule

他不会把当前的进程的状态由TASK_RUNNING变为TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE或者TASK_KILLABLE
所以在__schedule()中,不会把这个task从runqueue中移出去。那么当系统进行调度的时候这个进程仍然会被调度进来。
所以推荐调用
Schedule_timeout_interruptible
Schedule_timeout_uninterruptible
Schedule_timeout_killable
这几个函数都会在调用schedule_timeout之前调用set_current_state,来把进程的状态设置为非TASK_RUNNING得状态。
其中msleep就是调用schedule_timeout_uninterruptible。
Unterruptible就是不能被signal打断,任何signal都不行,包括优先级最高的不可忽略的SIG_KILL。
这也就是为什么我们会ps的时候看见进程状态是”D”。之所以这么做是由于一些系统的io不能接受打扰。唯一能唤醒io等待进程的就是别人wakeup他。

VPU的驱动就是这种情况,会在release的时候等待硬件不再busy,然后关clock。如果不用uninterruptible,而用interruptible,
那么用户kill VPU的进程,尽管我们在release的时候用了schedule(schedule_timeout会调用schedule),但是schedule会立刻返回,因为其中有判断:如果是非uninterruptible并且有signal pending,那么task的状态会被设置为TASK_RUNNING,并且立刻返回,不会做context switch. 所以这儿必须要schedule_timeout_uninterruptible。

系统也提供了新的状态TASK_KILLABLE。这个和TASK_UNINTERRUPTIBLE的区别就是这个进程能被SIG_KILL的signale唤醒。在文件系统中用的可能比较多。大家可能会碰到使用这种TASK_KILLABLE的情况。

时间: 2024-10-11 19:04:09

schedule_timeout与mdelay的区别的相关文章

linux 中mdelay() 与msleep()的区别

在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的. 1.)对于模块本身 mdelay是忙等待函数,在延迟过程中无法运行其他任务.这个延迟的时间是准确的.是需要等待多少时间就会真正等待多少时间. msleep是休眠函数,它不涉及忙等待.你如果是msleep(10),那实际上延迟的时间,大部分时候是要多于10ms的,是个不定的时间值. 2.)对于系统: mdelay() 会占用cpu资源,

MTK Android Driver知识大全

转载请注明出处:http://blog.csdn.net/cbk861110/article/details/40931835 一.Display 1.lcm 相关概念 1.1) MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口).DPI(也叫RGB接口).DSI. 在使用DSI接口时,目前75/77都只支持到2条data lane,加上一条clock lane. 使用DPI接口时,根据LCM IC支持的情况,可以选择16bus.18bus传输RGB格式文件,在GPIO部分分为R.G

linux中内核延时函数

第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsigned long msecs); 说明:内核函数 ndelay, udelay, 以及 mdelay 对于短延时好用, 分别延后执行指定的纳秒数, 微秒数或者毫秒数. 它们涉及到的延时常常是最多几个毫秒. 第二类延时函数原型是:(使进程进入休眠) void msleep(unsigned int

linux delay sleep

在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的. 1.)对于模块本身 mdelay是忙等待函数,在延迟过程中无法运行其他任务.这个延迟的时间是准确的.是需要等待多少时间就会真正等待多少时间. msleep是休眠函数,它不涉及忙等待.你如果是msleep(10),那实际上延迟的时间,大部分时候是要多于10ms的,是个不定的时间值. 2.)对于系统: mdelay() 会占用cpu资源,

select、poll、epoll之间的区别

select.poll.epoll之间的区别总结[整理] select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间.关于这三种IO多路复用的用法,前面

udelay、mdelay、ndelay、msleep使用比较说明

时间单位:    毫秒(ms).微秒 (μs).纳秒(ns).皮秒(ps).飞秒(fs).阿秒.渺秒    1 s = 10^3 ms = 10^6 us = 10^9 ns = 10^12 ps = 10^15 fs=10^18阿秒=10^21渺秒=10^43普朗克常数 在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的. mdeday还忙等待函数(相当于for循环),在延迟过程中无法

转:select、poll、epoll之间的区别总结[整理]

转:select.poll.epoll之间的区别总结[整理] select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间.关于这三种IO多路复用的用法,

IO多路复用select、poll、epoll的区别

(1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作.所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长. (2)poll==>时间复杂度O(n) poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的

Nginx 反代参数:$X-Real-Ip和$X-Forwarded-For的区别

## \$X-Real-Ip和$X-Forwarded-For的区别 标签(空格分隔): nignx 负载均衡 client-ip --- ####1.如果只有一层代理,这两个头的值就是一样的####2.多层代理> * X-Forwarded-For:  header包含这样一行        `*X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3*`> * X-Real-Ip:没有相关标准,上面的例子,如果配置了X-Read-IP,可能会有两种情况`// 最