1、二者区别
(1)delay
不主动放手,直接时间片到或者系统调用/中断发生,CPU的控制权被操作系统剥夺。
(2)sleep
主动放手,调用schedule()函数主动让出CPU控制权
2、sleep的两种类型
(1)sleep————不能被信号唤醒
进程状态为:TASK_UNINTERRUPTIBLE
(2)sleep_interrupt————能被信号唤醒
进程状态为:TASK_INTERRUPTIBLE
3、sleep的实现
(1)主要在Linux内核timer.c中实现
/**
* msleep - sleep safely even with waitqueue interruptions(安全的休眠,线程在等待队列中不会被打扰)
* @msecs: Time in milliseconds to sleep for
*/
void msleep(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
while (timeout)
timeout = schedule_timeout_uninterruptible(timeout);
}
EXPORT_SYMBOL(msleep);
/**
* msleep_interruptible - sleep waiting for signals
* @msecs: Time in milliseconds to sleep for
*/
unsigned long msleep_interruptible(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1; /* 计算超时时间 */
while (timeout && !signal_pending(current)) /* 在该内核线程执行的过程中不停判断是否睡眠结束,以及是否有发给自己的信号 */
timeout = schedule_timeout_interruptible(timeout); /* 睡眠不超时,但是没有给自己的信号,那么就让出CPU控制权 */
return jiffies_to_msecs(timeout); /* 如果睡眠超时或者有给自己的信号被挂起,那么该内核线程被唤醒,获得CPU控制权 */
}
EXPORT_SYMBOL(msleep_interruptible);
3、delay的相关知识点
(1)死等直到系统调用/中断到来或者时间片用完,CPU控制权被操作系统调度模块强行剥夺。
(2)其实现,类似于spin lock获取锁的操作do{ 获取锁 } while(如果锁未获取)。其实就是类似与N年前写得裸机程序的延时函数。
(3)主要在linux内核的delay.h中实现