目录
一、linux下的调度算法
下面是 0.11 的调度函数 schedule
,在文件 kernel/sched.c
中定义为:
while (1) {
c = -1; next = 0; i = NR_TASKS; p = &task[NR_TASKS];
// 找到 counter 值最大的就绪态进程
while (--i) {
if (!*--p) continue;
if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
c = (*p)->counter, next = i;
}
// 如果有 counter 值大于 0 的就绪态进程,则退出
if (c) break;
// 如果没有:注意是所有进程(不是单单就绪态进程)
// 所有进程的 counter 值除以 2 衰减后再和 priority 值相加,
// 产生新的时间片
for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
if (*p) (*p)->counter = ((*p)->counter >> 1) + (*p)->priority;
}
// 切换到 next 进程
switch_to(next);
由上面的程序可以看出,0.11 的调度算法是选取 counter 值最大的就绪进程进行调度。
当没有 counter 值大于 0 的就绪进程时,要对所有的进程做 (*p)->counter = ((*p)->counter >> 1) + (*p)->priority
。
其效果是对所有的进程(包括阻塞态进程)都进行 counter 的衰减,并再累加 priority 值。这样,对正被阻塞的进程来说,其此时的counter不为0,那么计算后得到的counter大于就绪态进程。
于是可知,一个进程在阻塞队列中停留的时间越长,其优先级越大,被分配的时间片也就会越大。
二、基于模板 process.c 编写多进程的样本程序
fork
函数创建一个子进程。子进程的进程内存空间和父进程中的完全一样,并且从fork
之后的地方开始执行。fork
函数在父进程中返回子进程的pid
,在子进程中返回0,出错时返回-1,并设置errno
。
wait
函数等待当前进程的子进程终止(只要有一个终止,wait
系统调用就会返回),如果没有子进程终止,则会阻塞。如果成功,返回终止的子进程的pid
,失败返回-1。
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/times.h> //使用了times函数