delay和sleep的区别

57 篇文章 4 订阅

1、 udelay(微秒级)一般适用于一个比较小的delay,如果你填的数大于2000,系统会认为你这个是一个错误的delay函数,因此如果需要2ms以上的delay需要使用mdelay函数。
2.由于这些delay函数本质上都是忙等待,对于长时间的忙等待意味这无谓的耗费着cpu的资源,因此对于毫秒级的延时,内核提供了msleep,ssleep等函数,这些函数将使得调用它的进程睡眠参数指定的时间。

应用层:
#include <unistd.h>

1、

unsigned int sleep(unsigned int seconds); //秒级

2、

int usleep(useconds_t usec); //微秒级:1/10^-6

3、

msleep(200)的时候实际上延迟的时间,大部分时候是要多于200ms

4、

#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
struct timespec {
time_t tv_sec; /* seconds */
long   tv_nsec; /* nanoseconds */
 };
 // The value of the nanoseconds field must be in the range 0 to 999999999.

内核层:

 include <linux/delay.h>
 1void ndelay(unsigned long nsecs); 纳秒级:1/10^-10
 2void udelay(unsigned long usecs); 微秒级: 1/10^-6
 3void mdelay(unsigned long msecs); 毫秒级:1/10^-3

sleep_on(), interruptible_sleep_on();
sleep_on_timeout(), interruptible_sleep_on_timeout();

udelay()等函数是cpu忙等,没有传统意义上的sleep且等待时间准确。这些函数相当于我们平时的阻塞读、写之类的语义,主要用于等外设完成某些操作。

task_delay
是通过把当前线程挂起,实现时间的延时,同时释放CPU给其他线程使用。
但其精度将由线程的切换时间片决定,比如线程的切换时间是10ms,那么每次task_delay就是比10ms要大,那怕你task_delay(1),那也是10ms,而不是1ms.
cond_resched
而在内核不可抢占系统中(如centos系统),在内核态运行的程序可调用cond_resched主动让出cpu,防止其在内核态执行时间过长导致可能发生的soft lockup或者造成较大的调度延迟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值