免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3136 | 回复: 11
打印 上一主题 下一主题

[进程管理] schedule返回的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-10 10:36 |只看该作者 |倒序浏览
sleeping_task = current;
set_current_state(TASK_INTERRUPTIBLE);
schedule();
func1();
/* The rest of the code */

我看到如上的代码,就是把当前进程睡眠,问题是func1什么时候执行?
调用schedule后,返回点在哪里?

论坛徽章:
0
2 [报告]
发表于 2013-10-10 10:57 |只看该作者
本帖最后由 我爱芒果叶 于 2013-10-10 11:00 编辑

回复 1# chengboye


    该进程被schedule回来再次运行时,就立刻执行func1;返回时刻为该进程被再次分配到CPU时

论坛徽章:
0
3 [报告]
发表于 2013-10-10 11:16 |只看该作者
我的理解是该进程睡眠,那么切换其他的进程的时候,保存该进程的最后指令在哪里?
是内核里的func1, 还是应用程序的下一条指令。
比如有个进程读一个设备,
read("/dev/foo",buf, 2);
test();

driver把这个进程用上面的过程,设置下state,然后调用schedule把进程从RUNNING QUEUE弄出来,到
另外一个队列。 如果后来被wake up了,进程又被调度执行,到底是做func1,还是做test函数啊。
对内核非常不了解,菜鸟一个。

回复 2# 我爱芒果叶


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2013-10-10 11:56 |只看该作者
该进程被再次调度时执行,schedule函数没有返回点,会进行上下文切换。。调度出去时PC指针指向schedule函数后面的指令,当进程被重新调度时,就紧接着schedule函数后面开始执行。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2013-10-10 11:57 |只看该作者
内核中的schedule函数的后面开始执行。回复 3# chengboye


   

论坛徽章:
0
6 [报告]
发表于 2013-10-10 14:49 |只看该作者
回复 3# chengboye
切换点的下一条指令,即func1


   

论坛徽章:
0
7 [报告]
发表于 2013-10-11 10:10 |只看该作者
回复 6# 我爱芒果叶


    恩。你是对的。谢谢

论坛徽章:
0
8 [报告]
发表于 2013-10-15 15:13 |只看该作者
当进程被切换时,内核将CPU上下文保存在thread_struct中, 进程切换只能发生在schdule()中.
如果你想搞清楚具体是怎么切换的, schdule()会最终调用switch_to来完成CPU的上下文切换, 一旦switch_to被调用, 我们才能说内核进程被切换了.

而func1()的函数地址将被作为“下一条执行的指令地址”保存到thread_struct中, 当进程再次被唤醒时, 当然还是在switch_to中被重新加载到CPU寄存器中,
所以醒来后, 内核进程会继续执行func1()...

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
9 [报告]
发表于 2014-06-11 18:04 |只看该作者
调度回来的时候我觉得应该首先执行switch_to
asm volatile("pushfl\n\t"                /* save    flags */        \
                     "pushl %%ebp\n\t"                /* save    EBP   */        \
                     "movl %%esp,%[prev_sp]\n\t"        /* save    ESP   */ \
                     "movl %[next_sp],%%esp\n\t"        /* restore ESP   */ \
                     "movl $1f,%[prev_ip]\n\t"        /* save    EIP   */        \
                     "pushl %[next_ip]\n\t"        /* restore EIP   */        \
                     __switch_canary                                        \
                     "jmp __switch_to\n"        /* regparm call  */        \
                     "1:\t"                                                \
                     "popl %%ebp\n\t"                /* restore EBP   */        \/*被调度回来的第一条指令,然后逐层返回,schedule函数返回之后,才会执行func函数*/
                     "popfl\n"                        /* restore flags */        \
回复 4# humjb_1983




   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
10 [报告]
发表于 2014-06-11 19:30 |只看该作者
super皮波 发表于 2014-06-11 18:04
调度回来的时候我觉得应该首先执行switch_to
asm volatile("pushfl\n\t"                /* save    flags */        \
                      ...

呵呵,你说你的更准确,这个也是schedule中调用的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP