实验4-进程轨迹跟踪

一、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函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值