void interruptible_sleep_on(struct wait_queue **p) { __sleep_on(p,TASK_INTERRUPTIBLE); } void sleep_on(struct wait_queue **p) { __sleep_on(p,TASK_UNINTERRUPTIBLE); } 这样,就是我们想要的等待队列方式了。
*/ voidinterruptible_sleep_on(structtask_struct **p) { structtask_struct *tmp; if(!p) return; /* * task[0]不允许睡眠 */ if(current == &(init_task.task)) panic("task[0] trying to sleep"); /* *和sleep_on函数的说明一样,但是唤醒后的处理不一样 */ tmp = *p; *p = current; ...
*/tmp=*p;*p=current;// 不可中断睡眠只能通过wake_up唤醒,即使有信号也无法唤醒current->state=TASK_UNINTERRUPTIBLE;schedule();// 唤醒后面一个节点if(tmp)tmp->state=0;}voidinterruptible_sleep_on(struct task_struct**p){struct task_struct*tmp;if(!p)return;if(current==&(init_task.task))panic("...
按照道理说,唤醒首进程xxx后,应将*p置为下一等待PCB的地址,但在sleep_on的分析中,下一PCB地址放在局部变量tmp中,也就是说要到xxx的内核栈寻找,此时xxx的栈中有schedule()的返回地址(163行的地址),函数schedule的局部变量,越过这些之后,应该可以找到tmp。 这里直接将*p=NULL,当再次wake_up此等待进程链表时,会失...
Linux 0.11 中的阻塞与唤醒,就是 sleep_on 和 wake_up 函数。 其中sleep_on 函数将 state 变为 TASK_UNINTERRUPTIBLE。 // sched.cvoidsleep_on(structtask_struct**p){structtask_struct*tmp;...tmp=*p;*p=current;current->state=TASK_UNINTERRUPTIBLE;schedule();if(tmp)tmp->state=0;} ...
544_linux内核学习___sleep_on函数功能分析 https://github.com/GreyZhang/little_bits_of_linux 这次看一下__sleeo_on函数。按照我的初步理解,我先做了一下注释说明如下: 接下来,看看这个函数的调度。 这个函数一共有两个调用的位置,接下来逐个看一下。
linux的可中断sleep_on函数分析 voidinterruptible_sleep_on (structtask_struct **p)// **p是个全局变量 {structtask_struct *tmp;if(!p)#没有进程等待就返回return;if(current == &(init_task.task)) panic ("task[0] trying to sleep"); tmp= *p;#在自己的内核堆栈中,暂时保存原来保存在**p中的...
首先,Sleep on 命令对于需要进行大规模文件操作的用户来说非常有用。比如,在需要复制或移动大量文件时,由于文件较多或者文件较大,操作系统可能会需要一些时间来完成这些任务。在这种情况下,通过在命令中加入 Sleep on 命令,可以让操作系统在执行耗时操作后暂停一段时间,使用户可以在这段时间内完成其他任务,从而有效提高...
sleep_on()的基本类似,只是在进行调度之前是把当前任务置成了可中断等待状态,并在本任务被唤醒后还需要队列上是否有后来的等待任务,若有,则调度它们先运行。在内核0.12 开始,这两个函数被...。另一个值得一提的函数是sleep_on(),该函数虽然很短,却要比schedule()函数难理解。这里用图示的方法加以解释。简单...
void sleep_on(wait_queue_head_t *wq) { wait_queue_t wait; //定义等待队列 init_waitqueue_entry(&wait, current);//初始化等待队列 current->state = TASK_UNINTERRUPTIBALE; //设置进程状态 add_wait_queue(wq,&wait);//加入等待队列