-
- /*
- * Run paging daemon every 1/4 sec.
- */
- if (lbolt % (hz/4) == 0) {
- vmpago();
- }
-
- /*
- * Reschedule every 1/10 sec.
- */
- if (lbolt % (hz/10) == 0) {
- runrun++;
- aston();
- }
-
- /*
- * Run network slow and fast timeouts.
- */
- if (protofast <= 0) {
- protofast = hz / PR_FASTHZ;
- pffasttimo();
- }
- if (protoslow <= 0) {
- protoslow = hz / PR_SLOWHZ;
- pfslowtimo();
- }
- if (ifnetslow <= 0) {
- ifnetslow = hz / IFNET_SLOWHZ;
- if_slowtimo();
- }
-
- /*
- * Lightning bolt every second:
- * sleep timeouts
- * process priority recomputation
- * process %cpu averaging
- * virtual memory metering
- * kick swapper if processes want in
- */
- if (lbolt >= hz) {
- /*
- * This doesn't mean much on VAX since we run at
- * software interrupt time... if hardclock()
- * calls softclock() directly, it prevents
- * this code from running when the priority
- * was raised when the clock interrupt occurred.
- */
- if (BASEPRI(ps))
- return;
-
- /*
- * If we didn't run a few times because of
- * long blockage at high ipl, we don't
- * really want to run this code several times,
- * so squish out all multiples of hz here.
- */
- s = spl6();
- time.tv_sec += lbolt / hz; lbolt %= hz;
- splx(s);
-
- /*
- * Wakeup lightning bolt sleepers.
- * Processes sleep on lbolt to wait
- * for short amounts of time (e.g. 1 second).
- */
- wakeup((caddr_t)&lbolt);
-
- /*
- * Recompute process priority and process
- * sleep() system calls as well as internal
- * sleeps with timeouts (tsleep() kernel routine).
- */
- for (pp = proc; pp < procNPROC; pp++)
- if (pp->p_stat && pp->p_stat!=SZOMB) {
-#ifdef MUSH
- /*
- * Charge process for memory in use
- */
- if (pp->p_quota->q_uid)
- pp->p_quota->q_cost +=
- shconsts.sc_click * pp->p_rssize;
-#endif
- /*
- * Increase resident time, to max of 127 seconds
- * (it is kept in a character.) For
- * loaded processes this is time in core; for
- * swapped processes, this is time on drum.
- */
- if (pp->p_time != 127)
- pp->p_time++;
- /*
- * Time processes out of select.
- */
- if (timerisset(&pp->p_seltimer) &&
- --pp->p_seltimer.tv_sec <= 0) {
- timerclear(&pp->p_seltimer);
- s = spl6();
- switch (pp->p_stat) {
-
- case SSLEEP:
- setrun(pp);
- break;
-
- case SSTOP:
- unsleep(pp);
- break;
- }
- splx(s);
- }
- if (timerisset(&pp->p_realtimer.itimer_value) &&
- itimerdecr(&pp->p_realtimer, 1000000) == 0)
- psignal(pp, SIGALRM);
-
- /*
- * If process is blocked, increment computed
- * time blocked. This is used in swap scheduling.
- */
- if (pp->p_stat==SSLEEP || pp->p_stat==SSTOP)
- if (pp->p_slptime != 127)
- pp->p_slptime++;
- /*
- * Update digital filter estimation of process
- * cpu utilization for loaded processes.
- */
- if (pp->p_flag&SLOAD)
- pp->p_pctcpu = ccpu * pp->p_pctcpu +
- (1.0 - ccpu) * (pp->p_cpticks/(float)hz);
- /*
- * Recompute process priority. The number p_cpu
- * is a weighted estimate of cpu time consumed.
- * A process which consumes cpu time has this
- * increase regularly. We here decrease it by
- * a fraction based on load average giving a digital
- * decay filter which damps out in about 5 seconds
- * when seconds are measured in time expanded by the
- * load average.
- *
- * If a process is niced, then the nice directly
- * affects the new priority. The final priority
- * is in the range 0 to 255, to fit in a character.
- */
- pp->p_cpticks = 0;
-#ifdef MUSH
- a = ave((pp->p_cpu & 0377), avenrun[0]*nrscale) +
- pp->p_nice - NZERO + pp->p_quota->q_nice;
-#else
- a = ave((pp->p_cpu & 0377), avenrun[0]*nrscale) +
- pp->p_nice - NZERO;
-#endif
- if (a < 0)
- a = 0;
- if (a > 255)
- a = 255;
- pp->p_cpu = a;
- (void) setpri(pp);
- /*
- * Now have computed new process priority
- * in p->p_usrpri. Carefully change p->p_pri.
- * A process is on a run queue associated with
- * this priority, so we must block out process
- * state changes during the transition.
- */
- s = spl6();
- if (pp->p_pri >= PUSER) {
- if ((pp != u.u_procp || noproc) &&
- pp->p_stat == SRUN &&
- (pp->p_flag & SLOAD) &&
- pp->p_pri != pp->p_usrpri) {
- remrq(pp);
- pp->p_pri = pp->p_usrpri;
- setrq(pp);
- } else
- pp->p_pri = pp->p_usrpri;
- }
- splx(s);
- }
-
- /*
- * Perform virtual memory metering.
- */
- vmmeter();
-
- /*
- * If the swap process is trying to bring
- * a process in, have it look again to see
- * if it is possible now.
- */
- if (runin!=0) {
- runin = 0;
- wakeup((caddr_t)&runin);
- }
-
- /*
- * If there are pages that have been cleaned,
- * jolt the pageout daemon to process them.
- * We do this here so that these pages will be
- * freed if there is an abundance of memory and the
- * daemon would not be awakened otherwise.
- */
- if (bclnlist != NULL)
- wakeup((caddr_t)&proc[2]);
-
-#ifdef MELB
- /*
- * If a process was running, see if time to make it nicer
- */
- if (!noproc) {
- pp = u.u_procp;
- if (pp->p_uid
-#ifdef MUSH
- && !(pp->p_flag & SLOGIN)
-#else
- /* this is definitely not good enough */
- && (pp->p_pid != pp->p_pgrp || pp->p_ppid != 1)
-#endif
- && (u.u_ru.ru_utime + u.u_ru.ru_stime) >
- (pp->p_nice-NZERO+1)*NFACT
- && pp->p_nice >= NZERO
- && pp->p_nice < MAXNICE
- ) {
- pp->p_nice++;
- (void) setpri(pp);
- pp->p_pri = pp->p_usrpri;
- }
- }
-#else
- /*
- * If the trap occurred from usermode,
- * then check to see if it has now been
- * running more than 10 minutes of user time
- * and should thus run with reduced priority
- * to give other processes a chance.
- */
- if (USERMODE(ps)) {
- pp = u.u_procp;
- if (pp->p_uid && pp->p_nice == NZERO &&
- u.u_ru.ru_utime.tv_sec > 600)
- pp->p_nice = NZERO+4;
- (void) setpri(pp);
- pp->p_pri = pp->p_usrpri;
- }
-#endif
- }
- /*
- * If trapped user-mode, give it a profiling tick.
- */
- if (USERMODE(ps) &&
- timerisset(&u.u_timer[ITIMER_VIRTUAL].itimer_value) &&
- itimerdecr(&u.u_timer[ITIMER_VIRTUAL].itimer_value, 1000000/hz) == 0)
- psignal(u.u_procp, SIGPROF);