免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6082 | 回复: 10

[进程管理] 关于linux内核抢占的问题 [复制链接]

论坛徽章:
0
发表于 2012-06-05 12:42 |显示全部楼层
关于linux内核抢占的问题:
在不支持内核抢占中:
如果中断发生在内核中,本次中断返回是不会引起调度的,而要到最初使CPU从用户空间进入内核空间的那次系统调用或中断(异常)返回时才会发生调度。
这句话正确吗?
或者 什么时候 引起调度!
附:编译内核的时候可选择 配制成 可抢占 或 不可抢占!

论坛徽章:
0
发表于 2012-06-05 13:21 |显示全部楼层
错~
如果是从异常返回的话。Cli禁止中断。(中断返回时,本地中断是禁止的)
1.        确定要返回到内核态还是用户态。
2.        如果是返回到内核态的话:
resume_kernel:
cli
cmpl $0, 0x14(%ebp)  //检查是否可以抢占thread_info->preempt_count
jz need_resched

restore_all:
popl %ebx
popl %ecx
popl %edx
popl %esi
popl %edi
popl %ebp
popl %eax
popl %ds
popl %es
addl $4, %esp
iret          //中断和异常退出的硬件处理过程

need_resched:
movl 0x8(%ebp), %ecx
testb $(1<<TIF_NEED_RESCHED), %cl
jz restore_all  //如果falgs没有设置TIF_NEED_RESCHED,不需要抢占
testl $0x00000200,0x30(%esp)
jz restore_all //如果正在禁用本地CPU,不需要抢占
call preempt_schedule_irq //打开本地中断,调用preempt_schedule,进行抢占
jmp need_resched
3.        如果是返回到用户态的话:
resume_userspace:
cli
movl 0x8(%ebp), %ecx
andl $0x0000ff6e, %ecx //检查flags是否只设置了某些标志
je restore_all
jmp work_pending

work_pending:
testb $(1<<TIF_NEED_RESCHED), %cl
jz work_notifysig //如果falgs没有设置TIF_NEED_RESCHED,不需要调度

work_resched:
call schedule      //进程调度
cli
jmp resume_userspace

work_notifysig:   //处理挂起的信号,虚拟8086和单步执行
movl %esp, %eax
testl $0x00020000, 0x30(%esp)
je 1f
work_notifysig_v86:
pushl %ecx
call save_v86_state
popl %ecx
movl %eax, %esp
1:
xorl %edx, %edx
call do_notify_resume
jmp restore_all

restore_all:
popl %ebx
popl %ecx
popl %edx
popl %esi
popl %edi
popl %ebp
popl %eax
popl %ds
popl %es
addl $4, %esp
iret          //中断和异常退出的硬件处理过程

注意:不管返回到内核态还是返回到用户态,都会试图进行进程调度。在返回内核态进行进程调度就叫做内核抢占。在返回用户态进行进程调度属于普通进程调度。它们都会检查current->thread_info->flags 的TIF_NEED_RESCHED标志是否需要进行进程调度。但是返回内核态的时候,额外的需要检查current->thread_info->preempt_count的内核抢占位确定是否可以进行内核抢占。

论坛徽章:
0
发表于 2012-06-05 13:40 |显示全部楼层

多谢,没有研究这么深,看来还要学习一下关于进程调度方面的知识。。。thks

论坛徽章:
0
发表于 2012-06-05 15:53 |显示全部楼层
回复 3# zhuqing_739
在不支持内核抢占中,进程时间片用完,由于资源原因放弃cpu,进程结束等情况会发生切换。

   

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
发表于 2012-06-10 21:13 |显示全部楼层
回复 2# blake326
current->thread_info->flags 的TIF_NEED_RESCHED标志是如何被设置的?
以前这一标志是全局变量,如果代码认为某个事件可能导致reschedule,就在全局变量里设置这一标志;
现在这一标志被挪到了task_struct, 那就是说在系统的任何地方,如果某个事件可能导致reschedule, 就要设置current task_struct的这一标志。问题是current task_struct是否随时可以access?

   

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-06-10 21:17 |显示全部楼层
current宏很有名的啊。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
发表于 2012-06-11 00:15 |显示全部楼层
回复 6# tempname2
是有名,但是是不是任何情况下都可以操作?
如果cpu b引起cpu a context switch(如果不是通过中断方式), 那么如何设置cpu a的CURRENT这一标志?

   

论坛徽章:
0
发表于 2012-06-11 10:32 |显示全部楼层
本帖最后由 blake326 于 2012-06-11 10:32 编辑

回复 5# linuxfellow


一般是在cfs调度时候设置的。
具体来说,调度具体分:

1. cfs正常调度,hrtick() hrtimer定时器,  cfs在enqueue_task,dequeue_task一些工作之后,可能需要设置下次中断时间。在hrtick中直接resched_task进行调度。

2. fork新创建一个进程。一般来说会交换父子进程的虚拟时间,那么就会直接调用resched_task进行调度。

3. wakeup一个进程,一般会补偿虚拟时间。通过check_preempt_wakeup,如果需要重新调度则调用resched_task进行调度。


resched_task设置了TIF_NEED_RESCHED,在中断或者异常返回时适当的进行抢占或者调度。

暂时就想到这么多,欢迎补充纠正。


------------------------------------------------------------------------------------------------------------
如果cpu b引起cpu a context switch(如果不是通过中断方式), 那么如何设置cpu a的CURRENT这一标志?
不可能把,cpu b wakeup一个进程都是到cpu b上的吧, 应该没有你说的这种状况把》

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2012-06-12 05:22 |显示全部楼层
回复 7# linuxfellow


    嗯, 看了一下. 你的问题是resched_task标志如何被设置, 这个和何时会进行调度是两回事. flag被设置成TIF_NEED_RESCHED是在发生调度之前, 只要是在调度之前, 任何时候设置(当然如LS所言, 设置flag也是有时机的)都是可以的. current宏只要是在进程上下文中都可以访问, 中断上下文中不可以. 对于smp的情况, 以前貌似是一个全局的运行队列, 现在每个cpu都有自己的运行队列, 所以每个cpu都有自己独立的进程上下文, 假设两个CPU同时访问current宏, 那是不一样的进程上下文.
    个人愚见, 砖头轻拍.

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
发表于 2012-06-12 09:42 |显示全部楼层
回复 9# captivated
就是
PREEMPT可以有下面4种情况触发:
1 中断(硬中断或软中断)
2 一些函数触发, 如spin_unlock
3 进程主动调用schedule
4. 进程阻塞,被迫调用schedule

2,3,4都是运行在process stack上时发生,用CURRENT可以方便找到当前task_struct,然后设置flag
1运行在irq stack,如果isr调用try_to_wakeup_process去唤醒一个优先级高的进程,这时候如何找到被中断的current task_struct来设置这一标志?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP