Apparently, On Sat, Dec 22, 2001 at 06:48:26PM +1100,
        Bruce Evans said words to the effect of;

> On Fri, 21 Dec 2001, Luigi Rizzo wrote:
> 
> > Don't know how interesting this can be, but i am writing
> > (no plans to commit it, unless people find it interesting)
> > some code to implement a weight-based instead of priority-based
> > scheduler. The code is basically the WF2Q+ scheme which is
> > already part of dummynet, adapted to processes.
> > It is quite compact, and i think i can make it reasonably
> > compatible with the old scheme, i.e. a sysctl var can be
> > used to switch between one and the other with reasonably
> > little overhead.
> >
> > This would help removing the ugly property that priority-based
> > have, which is that one process can starve the rest of the system.
> 
> Only broken priority-based schedulers have that property.  One of
> my incomplete fixes uses weights:
> 
> Index: kern_synch.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/kern/kern_synch.c,v
> retrieving revision 1.167
> diff -u -2 -r1.167 kern_synch.c
> --- kern_synch.c      18 Dec 2001 00:27:17 -0000      1.167
> +++ kern_synch.c      19 Dec 2001 16:01:26 -0000
> @@ -936,18 +1058,18 @@
>       struct thread *td;
>  {
> -     struct kse *ke = td->td_kse;
> -     struct ksegrp *kg = td->td_ksegrp;
> +     struct ksegrp *kg;
> 
> -     if (td) {
> -             ke->ke_cpticks++;
> -             kg->kg_estcpu = ESTCPULIM(kg->kg_estcpu + 1);
> -             if ((kg->kg_estcpu % INVERSE_ESTCPU_WEIGHT) == 0) {
> -                     resetpriority(td->td_ksegrp);
> -                     if (kg->kg_pri.pri_level >= PUSER)
> -                             kg->kg_pri.pri_level = kg->kg_pri.pri_user;
> -             }
> -     } else {
> +     if (td == NULL)
>               panic("schedclock");
> -     }
> +     td->td_kse->ke_cpticks++;
> +     kg = td->td_ksegrp;
> +#ifdef NEW_SCHED
> +     kg->kg_estcpu += niceweights[kg->kg_nice - PRIO_MIN];
> +#else
> +     kg->kg_estcpu++;
> +#endif
> +     resetpriority(kg);
> +     if (kg->kg_pri.pri_level >= PUSER)
> +             kg->kg_pri.pri_level = kg->kg_pri.pri_user;
>  }

I'm curious why you removed the ESTCPULIM and INVERSE_ESTCPU_WEIGHT
calculations even in the OLD_SCHED case.  Do these turn out to have
no effect in general?

> 
> Most of the changes here are to fix style bugs.  In the NEW_SCHED case,
> the relative weights for each priority are determined by the niceweights[]
> table.  kg->kg_estcpu is limited only by INT_MAX and priorities are
> assigned according to relative values of kg->kg_estcpu (code for this is
> not shown).  The NEW_SCHED case has not been tried since before SMPng
> broke scheduling some more by compressing the priority ranges.

It is relatively easy to uncompress the priority ranges if that is
desirable.  What range is best?

Jake

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to