任务等待操作sleep_on
时间:2010-09-07
来源:互联网
本帖最后由 nathan10 于 2010-09-07 11:49 编辑
复制代码
上述代码repeat位置执行任务调度schedule()后,为何一定在当前这个等待任务*P被唤醒以后,调度程序才返回这里,并继续向下执行?这里我遗漏了什么吗?
百思不得其解。。。请教,谢谢
- static inline void __sleep_on(struct task_struct **p, int state)
- {
- struct task_struct *tmp;
- unsigned int flags;
-
- if (!p)
- return;
- if (current == &(init_task.task))
- panic("task[0] trying to sleep");
- __asm__("pushfl ; popl %0":"=r" (flags));
- tmp = *p;
- *p = current;
- current->state = state;
- /* make sure interrupts are enabled: there should be no more races here */
- sti();
- repeat: schedule();
- if (*p && *p != current) {
- current->state = TASK_UNINTERRUPTIBLE;
- (**p).state = 0;
- goto repeat;
- }
- if (*p = tmp)
- tmp->state=0;
- __asm__("pushl %0 ; popfl"::"r" (flags));
- }
百思不得其解。。。请教,谢谢
作者: nathan10 发布时间: 2010-09-07
因为这里是让进程睡眠... 等待某个特定的事件...有TASK_INTERRUPTABLE和TASK_UNINTERRUPTABLE两种睡眠方式...
在这个函数里. 将进程状态改变为这两个之一之后再执行schedule()函数就会重新调度...
而在调度进程的时候... 会将状态为TASK_INTERRUPTABLE且有pending信号到来的进程状态改为
TASK_RUNNING... 然后再计算所有处于TASK_RUNNING的goodness...最后选择一个进程运行...
所以要这个进程被唤醒之后... 且! 被调度运行... 才能返回到repeat标号处...
为何回到这里...就是进程切换的问题啦... 总之会保持进程执行的连续性...
在这个函数里. 将进程状态改变为这两个之一之后再执行schedule()函数就会重新调度...
而在调度进程的时候... 会将状态为TASK_INTERRUPTABLE且有pending信号到来的进程状态改为
TASK_RUNNING... 然后再计算所有处于TASK_RUNNING的goodness...最后选择一个进程运行...
所以要这个进程被唤醒之后... 且! 被调度运行... 才能返回到repeat标号处...
为何回到这里...就是进程切换的问题啦... 总之会保持进程执行的连续性...
作者: PCliangtao 发布时间: 2010-09-07
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28