|
3. smp系统初始化
init_task在完成关键数据结构初始化之后,在进行硬件的初始化之前,会调用smp_init()对SMP系统进行初始化。smp_init()调用smp_boot_cpus(),smp_boot_cpus()对每一个CPU都调用一次do_boot_cpu(),完成SMP其他CPU的初始化工作。
/* 节选自[arch/i386/kernel/smpboot.c] do_boot_cpu() */
if (fork_by_hand() < 0) /* do_fork(CLONE_VM|CLONE_PID)创建一个新进程,与init_task一样具有0号pid */
panic("failed fork for CPU %d", cpu);
idle = init_task.prev_task; /*在进程列表中,新进程总是位于init_task的左链prev上 */
if (!idle)
panic("No idle process for CPU %d", cpu);
idle->processor = cpu;
idle->cpus_runnable = 1 << cpu; /* 在指定CPU上运行 */
map_cpu_to_boot_apicid(cpu, apicid);
idle->thread.eip = (unsigned long) start_secondary; /* 被调度到后的启动地址 */
del_from_runqueue(idle); /* idle进程不通过就绪队列调度 */
unhash_process(idle);
init_tasks[cpu] = idle; /* 所有idle进程都可通过init_tasks[]数组访问 */
该进程被调度到时即执行start_secondary(),最终将调用cpu_idle(),成为IDLE进程。
七. Linux 2.4调度系统的一些问题
1. 进程时间片
2.4内核中进程缺省时间片是根据以下公式计算的:
/* 节选自[kernel/sched.c] */
#if HZ < 200
#define TICK_SCALE(x) ((x) >> 2)
#elif HZ < 400
#define TICK_SCALE(x) ((x) >> 1)
#elif HZ < 800
#define TICK_SCALE(x) (x)
[1] [2] [3] 下一页 |