|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986, 1989 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: * ! 33: * @(#)vm_meter.c 7.11 (Berkeley) 4/20/91 ! 34: */ ! 35: ! 36: #include "param.h" ! 37: #include "proc.h" ! 38: #include "systm.h" ! 39: #include "kernel.h" ! 40: ! 41: #include "vm_param.h" ! 42: #include "vmmeter.h" ! 43: ! 44: fixpt_t averunnable[3]; /* load average, of runnable procs */ ! 45: ! 46: int maxslp = MAXSLP; ! 47: int saferss = SAFERSS; ! 48: ! 49: ! 50: vmmeter() ! 51: { ! 52: register unsigned *cp, *rp, *sp; ! 53: ! 54: if (time.tv_sec % 5 == 0) ! 55: vmtotal(); ! 56: if (proc0.p_slptime > maxslp/2) ! 57: wakeup((caddr_t)&proc0); ! 58: } ! 59: ! 60: vmtotal() ! 61: { ! 62: register struct proc *p; ! 63: int nrun = 0; ! 64: ! 65: total.t_vm = 0; ! 66: total.t_avm = 0; ! 67: total.t_rm = 0; ! 68: total.t_arm = 0; ! 69: total.t_rq = 0; ! 70: total.t_dw = 0; ! 71: total.t_pw = 0; ! 72: total.t_sl = 0; ! 73: total.t_sw = 0; ! 74: for (p = allproc; p != NULL; p = p->p_nxt) { ! 75: if (p->p_flag & SSYS) ! 76: continue; ! 77: if (p->p_stat) { ! 78: switch (p->p_stat) { ! 79: ! 80: case SSLEEP: ! 81: if (p->p_pri <= PZERO && p->p_slptime == 0) ! 82: nrun++; ! 83: /* fall through */ ! 84: case SSTOP: ! 85: #ifdef notdef ! 86: if (p->p_flag & SPAGE) ! 87: total.t_pw++; ! 88: else ! 89: #endif ! 90: if (p->p_flag & SLOAD) { ! 91: if (p->p_pri <= PZERO) ! 92: total.t_dw++; ! 93: else if (p->p_slptime < maxslp) ! 94: total.t_sl++; ! 95: } else if (p->p_slptime < maxslp) ! 96: total.t_sw++; ! 97: if (p->p_slptime < maxslp) ! 98: goto active; ! 99: break; ! 100: ! 101: case SRUN: ! 102: case SIDL: ! 103: nrun++; ! 104: if (p->p_flag & SLOAD) ! 105: total.t_rq++; ! 106: else ! 107: total.t_sw++; ! 108: active: ! 109: break; ! 110: } ! 111: } ! 112: } ! 113: loadav(averunnable, nrun); ! 114: } ! 115: ! 116: /* ! 117: * Constants for averages over 1, 5, and 15 minutes ! 118: * when sampling at 5 second intervals. ! 119: */ ! 120: fixpt_t cexp[3] = { ! 121: 0.9200444146293232 * FSCALE, /* exp(-1/12) */ ! 122: 0.9834714538216174 * FSCALE, /* exp(-1/60) */ ! 123: 0.9944598480048967 * FSCALE, /* exp(-1/180) */ ! 124: }; ! 125: ! 126: /* ! 127: * Compute a tenex style load average of a quantity on ! 128: * 1, 5 and 15 minute intervals. ! 129: */ ! 130: loadav(avg, n) ! 131: register fixpt_t *avg; ! 132: int n; ! 133: { ! 134: register int i; ! 135: ! 136: for (i = 0; i < 3; i++) ! 137: avg[i] = (cexp[i] * avg[i] + n * FSCALE * (FSCALE - cexp[i])) ! 138: >> FSHIFT; ! 139: #if defined(COMPAT_43) && (defined(vax) || defined(tahoe)) ! 140: for (i = 0; i < 3; i++) ! 141: avenrun[i] = (double) averunnable[i] / FSCALE; ! 142: #endif /* COMPAT_43 */ ! 143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.