打印本文 打印本文 关闭窗口 关闭窗口
Linux 2.4进程调度分析 7
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2283  更新时间:2009/4/22 20:45:51  文章录入:mintao  责任编辑:mintao

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]  下一页

打印本文 打印本文 关闭窗口 关闭窗口