sleep_on()函数主要是为了在一个进程所请求的资源忙的时候进行进程调度,并把该进程放到等待队列上等待一段时间。代码如下:
void sleep_on(struct task_struct **p)
{
struct task_struct *tmp;
if (!p)
return;
if (current == &(init_task.task))
panic("task[0] trying to sleep");
tmp = *p;
*p = current;
current->state = TASK_UNINTERRUPTIBLE;
schedule();
if (tmp)
tmp->state=0;
}
分析:首先应该理解下这个tmp的作用,在这段函数中主要用到三个指针:*p,current和tmp,其中*p指向等待队列的头,也就是最近被放入等待队列的任务,current指向当前任务,tmp是在任务内核堆栈上建立的一个临时指针。在sleep的入口处,会让
tmp = *p;
*p= current;
这样的话tmp指向原来的头,*p指向新的头,这样就相当于串联起一个链表一样的结构,通过*p可以找到第一个等待任务,再通过第一个任务里面的tmp结构又可以找到下一个等待任务。下图可以帮助理解:
之后执行current->st

本文详细解析了Linux 0.11内核中的sleep_on()和interruptible_sleep_on()函数,阐述了这两个函数如何处理进程的休眠与唤醒,特别是在等待队列中的任务调度。通过对函数执行流程的分析,探讨了不同休眠状态下,进程如何响应信号以及唤醒机制的工作原理。
最低0.47元/天 解锁文章
1614





