Linuxjournal-The Linux Scheduler
这篇文章 The Linux Scheduler作者Moshe Bar发表在linuxjournal, 是一篇2000年的文章.从Linux版本时间线可以看到,那时Linux内核版本2.2, 过了一年后2001正式发布2.4版本 图片来源wiki/Linux内核 正文 了解内核如何为单处理器和多处理器计算机调度任务。 上个月,我们开始了一个关于Linux内核内部的新系列。 在第一部分中,我们研究了Linux如何管理流程以及为什么Linux在许多方面比许多商业UNIX系统更好地创建和维护流程。 这一次,我们详细讨论了调度问题。 令我惊讶的是,在这里,Linux走向非传统的方式,无视核心理论中的传统智慧。 结果非常好。 我们来看看如何。 调度类 在Linux 2.2.x中有三类进程,从调度程序的数据定义可以看出(来自linux/include/linux/sched.h): 调度策略 #define SCHED_OTHER 0 #define SCHED_FIFO 1 #define SCHED_RR 2 SCHED_OTHER任务是正常的用户任务(默认)。 在SCHED_FIFO中运行的任务永远不会被抢占。它们将仅在等待同步内核事件或者如果已从用户空间请求显式睡眠或重新调度,释放CPU资源。 在SCHED_RR中运行的任务是实时(RT)的 ,但如果运行队列中有另一个实时任务,它们将离开CPU。因此CPU资源将在所有SCHED_RR任务之间分配。如果至少有一个实时任务正在运行,则不允许在任何CPU中运行其他SCHED_OTHER任务。每个实时任务都有一个rt_priority,因此允许SCHED_RR类随意在所有SCHED_RR任务之间分配CPU资源。 SCHED_RR类的rt_priority与SCHED_OTHER(默认)类的普通优先级字段完全相同。 只有root用户才能通过sched_setscheduler系统调用更改当前任务的类。 内核的任务之一是确保即使在异常进程的情况下系统仍然处于其控制之下。一个这样异常的程序可能会过快地fork太多进程。因此,内核变得如此忙碌以至于无法满足其他职责。我发现Linux对用户态程序生成子进程的速度没有限制。 HP-UX,Solaris和AIX每个处理器的时间限制(tick)为一个fork(在Linux下称为jiffie)。清单1中的补丁(请参阅参考资料)将允许每个jiffie最多一个fork(一个jiffie通常是1/100秒,除了Alpha架构,它是1/1024)。 文中提到的清单1 (稍微调整了下格式) 2.3.26/kernel/fork.c Thu Oct 28 22:30:51 1999 +++ /tmp/fork.c Tue Nov 9 01:34:36 1999 @@ -591,6 +591,14 @@ int retval = -ENOMEM; struct task_struct *p; DECLARE_MUTEX_LOCKED(sem); + static long last_fork; + while (time_after(last_fork+1, jiffies)) + { + __set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(1); + } + last_fork = jiffies; if (clone_flags & CLONE_PID) { /* This is only allowed from the boot up thread */ 个人理解,如果last_fork+1>jiffies说明当前进程在1个jiffie内创建,设置进程休眠,类似delay功能(这个地方也不是很确认:(, 后续需要再验证一下) ...