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] 下一页 [C语言系列]C# 和 Linux 时间戳转换 [Web开发]PHP flock文件锁介绍 [Web开发]flock() Linux下的文件锁 [电脑应用]Linux下的六个免费的虚拟主机管理系统介绍 [电脑应用]Linux数据库大比拚 [操作系统]在Windows中玩转Linux操作系统 [办公软件]在RedHat Linux 9里安装gaim0.80 [办公软件]掌握 Linux 调试技术 [办公软件]理解 Linux 配置文件 [聊天工具]Real10 & Xpdf installation on Linux Box
|