sleep,msleep,ssleep都是一开睡眠延时的方式来实现的,这种方式不占用cpu资源,他会使线程可以继续被调度 udelay,ndelay,mdelay,他们的实现都是一种忙等待。让cpu进行一定次数的循环,忙等待会占用cpu资源,delay的线程不会被调度 内核中最好不要使用mdelay().这会无谓的消耗cpu资源。udelay,ndelay只是为了在机制上配合硬件的短暂延时 之前的认识更正: 但是sleep()是会受到cpu的调度影响的,cpu很忙的时候sleep是很不准确的,比如msleep(10)。结果肯能会导致20-40ms的延时,sleep是一个很不精确的操作 但是dealy()却可以相对精确的延时,它霸占cpu不受调度的影响。所以,delay可以用,但是不要使用在频繁被调度的线程中,例如while(1)中, 他会不断调用delay(),这会使cpu的负载加大,导致性能降低。
在内核线程中一定要使用 msleep_interruptible( ) 来进行睡眠释放cpu,尽量不要使用msleep( )是毫秒级的不要微秒级的。 函数 延时单位 返回值 是否可被信号中断 msleep 毫秒 无 否 msleep_interruptible 毫秒 未完成的毫秒数 是
最主要的区别就是msleep会保证所需的延时一定会被执行完,而msleep_interruptible则可以在延时进行到一半时被信号打断而退出延时,剩余的延时数则通过返回值返回。两个函数最终的代码都会到达schedule_timeout函数 sleep的使用场景: 一般在内核线程中,最好使用一个可中断的msleep_interruptible(2),最好2ms以上。因为线程的调度节拍由HZ来决定,这个可以配置,一般为1000,即1ms。,所以sleep 1ms 会让cpu切换很吃力, 所以最好出让cpu 2ms 以上
