免费注册 查看新帖 |

Chinaunix

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

[内核模块] 关于kernel内核启动后0进程和1进程调度的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-12 16:39 |只看该作者 |倒序浏览
内核在启动的时候,最先由0进程对硬件等相关内容进行初始化。
直到执行rest_init函数的时候,它才开始创建出1进程。

下面是这个函数的原型,我想问题的是:

当调用kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
的时候,0和1这个进程是怎么共存的?按我的理解,在多CPU平台上,前面的初始化都是不可抢占的,我理解的不可抢占的意思就是由一个CPU
来完成相应的初始化过程?那么其他的CPU状态是怎么样的?工作嘛?
这个时候,0和1这两个进程是放在同一个CPU里面的进程队列嘛?不可抢占是不是意味着不可调度?

如果0和1位于同一个CPU上的进程队列里面,那么这两个线程要相互执行,那么当0线程执行到


schedule_preempt_disabled();的时候是不是说明现在1进程不被调度了?
如果1不被调度了,紧接着0进入cpu_idle的状态,那么谁去设置need_resched 标志让0进程调度出去,让别的进程执行?也就是现在的1进程
执行?
当然我是在不太懂的前提下提的这些问题,可能问题本身就带着问题。希望大牛帮忙回答我的这些问题。

static noinline void __init_refok rest_init(void)
{
int pid;

rcu_scheduler_starting();
/*
* We need to spawn init first so that it obtains pid 1, however
* the init task will end up wanting to create kthreads, which, if
* we schedule it before we create kthreadd, will OOPS.
*/
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
numa_default_policy();
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
rcu_read_lock();
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
rcu_read_unlock();
complete(&kthreadd_done);

/*
* The boot idle thread must execute schedule()
* at least once to get things moving:
*/
init_idle_bootup_task(current);
schedule_preempt_disabled();
/* Call into cpu_idle with preempt disabled */
cpu_startup_entry(CPUHP_ONLINE);
}




论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2015-08-12 20:52 |只看该作者
本帖最后由 nswcfd 于 2015-08-13 20:50 编辑

看老版本的是不是好理解一点? v2.6.18的。
  1. static void noinline rest_init(void)
  2.         __releases(kernel_lock)
  3. {
  4.         kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);
  5.         numa_default_policy();
  6.         unlock_kernel();

  7.         /*
  8.          * The boot idle thread must execute schedule()
  9.          * at least one to get things moving:
  10.          */
  11.         preempt_enable_no_resched();
  12.         schedule();
  13.         preempt_disable();

  14.         /* Call into cpu_idle with preempt disabled */
  15.         cpu_idle();
  16. }
复制代码
进入cpu_idle之前,会调用一次schedule(),这样init就有机会得到执行。
此外,尽管cpu_idle的执行过程中,抢占被禁止了,但是中断还是允许的,基于时间片的调度还是会发生的。 <====== 【更正】这个说法是错误的。

论坛徽章:
0
3 [报告]
发表于 2015-08-13 09:11 |只看该作者
nswcfd 发表于 2015-08-12 20:52
看老版本的是不是好理解一点? v2.6.18的。进入cpu_idle之前,会调用一次schedule(),这样init就有机会得到 ...


按你这么一说,那抢占和所谓的时间片调度不是一回事?

就是虽然我关了抢占,但是它还 是会被调试到其他的进程去执行?

那这样一来?关闭不关闭抢占有什么意义?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2015-08-13 21:05 |只看该作者
本帖最后由 nswcfd 于 2015-08-13 21:06 编辑

多谢指出严重错误!已更正2楼内容。

回到你的问题,在单CPU上,进程0执行到cpu_idle,说明进程1处于block状态,例如在等待某个事件。
事件满足时(通常是中断上下文),会设置need_sched标记,导致cpu_idle调用schedule,恢复1的执行。

论坛徽章:
0
5 [报告]
发表于 2015-08-14 09:00 |只看该作者
nswcfd 发表于 2015-08-13 21:05
多谢指出严重错误!已更正2楼内容。

回到你的问题,在单CPU上,进程0执行到cpu_idle,说明进程1处于bloc ...


这个问题我提出来是一起共同探讨的。

现在的场景是多CPU上。 当0和1进程被创建后,他们分别属于同一个CPU上嘛?

如果属于同一个CPU上,当0进程禁止抢占后,这个need_resched 是谁去设置?

因为1没有跑了,如果是0自己去设置的话,是在哪里设置的?

然后调度到1后,是不是说明后面0进程在1的存在下,不再返回到idle状态?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
6 [报告]
发表于 2015-08-14 18:44 |只看该作者
然后调度到1后,是不是说明后面0进程在1的存在下,不再返回到idle状态?


如果系统里只有0/1两个进程,并且1从来不进入block状态,看起来idle永远没有执行的机会?

ps, 应该是每个cpu有一个idle(#0),
init(#1)一开始肯定是在boot cpu上运行的,通过smp_init把其它cpu启动起来,包括创建per cpu的idle task。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP