Commit | Line | Data |
---|---|---|
da7c5cc6 | 1 | /* |
c4ec2128 KM |
2 | * Copyright (c) 1982, 1986, 1989 Regents of the University of California. |
3 | * All rights reserved. | |
da7c5cc6 | 4 | * |
dbf0c423 | 5 | * %sccs.include.redist.c% |
c4ec2128 | 6 | * |
f1f42678 | 7 | * @(#)vm_meter.c 7.10 (Berkeley) %G% |
da7c5cc6 | 8 | */ |
e3bf9f41 | 9 | |
94368568 JB |
10 | #include "param.h" |
11 | #include "systm.h" | |
94368568 JB |
12 | #include "user.h" |
13 | #include "proc.h" | |
94368568 | 14 | #include "kernel.h" |
f1f42678 KM |
15 | #include "machine/vmparam.h" |
16 | #include "vmmeter.h" | |
e3bf9f41 | 17 | |
80b6b780 | 18 | fixpt_t averunnable[3]; /* load average, of runnable procs */ |
e3bf9f41 | 19 | |
f1f42678 KM |
20 | int maxslp = MAXSLP; |
21 | int saferss = SAFERSS; | |
e3bf9f41 | 22 | |
e3bf9f41 BJ |
23 | |
24 | vmmeter() | |
25 | { | |
26 | register unsigned *cp, *rp, *sp; | |
27 | ||
f1f42678 | 28 | if (time.tv_sec % 5 == 0) |
e3bf9f41 | 29 | vmtotal(); |
f1f42678 | 30 | if (proc[0].p_slptime > maxslp/2) { |
e3bf9f41 | 31 | runout = 0; |
e3bf9f41 BJ |
32 | wakeup((caddr_t)&runout); |
33 | } | |
34 | } | |
35 | ||
e3bf9f41 BJ |
36 | vmtotal() |
37 | { | |
38 | register struct proc *p; | |
e3bf9f41 BJ |
39 | int nrun = 0; |
40 | ||
e3bf9f41 BJ |
41 | total.t_vm = 0; |
42 | total.t_avm = 0; | |
43 | total.t_rm = 0; | |
44 | total.t_arm = 0; | |
45 | total.t_rq = 0; | |
46 | total.t_dw = 0; | |
47 | total.t_pw = 0; | |
48 | total.t_sl = 0; | |
49 | total.t_sw = 0; | |
1d348849 | 50 | for (p = allproc; p != NULL; p = p->p_nxt) { |
e3bf9f41 BJ |
51 | if (p->p_flag & SSYS) |
52 | continue; | |
53 | if (p->p_stat) { | |
e3bf9f41 BJ |
54 | switch (p->p_stat) { |
55 | ||
56 | case SSLEEP: | |
1a41b211 | 57 | if (p->p_pri <= PZERO && p->p_slptime == 0) |
e3bf9f41 | 58 | nrun++; |
1a41b211 KM |
59 | /* fall through */ |
60 | case SSTOP: | |
e3bf9f41 BJ |
61 | if (p->p_flag & SPAGE) |
62 | total.t_pw++; | |
63 | else if (p->p_flag & SLOAD) { | |
89b899a0 | 64 | if (p->p_pri <= PZERO) |
e3bf9f41 BJ |
65 | total.t_dw++; |
66 | else if (p->p_slptime < maxslp) | |
67 | total.t_sl++; | |
68 | } else if (p->p_slptime < maxslp) | |
69 | total.t_sw++; | |
70 | if (p->p_slptime < maxslp) | |
71 | goto active; | |
72 | break; | |
73 | ||
74 | case SRUN: | |
75 | case SIDL: | |
76 | nrun++; | |
77 | if (p->p_flag & SLOAD) | |
78 | total.t_rq++; | |
79 | else | |
80 | total.t_sw++; | |
81 | active: | |
e3bf9f41 BJ |
82 | break; |
83 | } | |
84 | } | |
85 | } | |
80b6b780 | 86 | loadav(averunnable, nrun); |
e3bf9f41 BJ |
87 | } |
88 | ||
89 | /* | |
90 | * Constants for averages over 1, 5, and 15 minutes | |
91 | * when sampling at 5 second intervals. | |
92 | */ | |
80b6b780 KM |
93 | fixpt_t cexp[3] = { |
94 | 0.9200444146293232 * FSCALE, /* exp(-1/12) */ | |
95 | 0.9834714538216174 * FSCALE, /* exp(-1/60) */ | |
96 | 0.9944598480048967 * FSCALE, /* exp(-1/180) */ | |
e3bf9f41 BJ |
97 | }; |
98 | ||
99 | /* | |
100 | * Compute a tenex style load average of a quantity on | |
101 | * 1, 5 and 15 minute intervals. | |
102 | */ | |
103 | loadav(avg, n) | |
80b6b780 | 104 | register fixpt_t *avg; |
e3bf9f41 BJ |
105 | int n; |
106 | { | |
107 | register int i; | |
108 | ||
109 | for (i = 0; i < 3; i++) | |
80b6b780 KM |
110 | avg[i] = (cexp[i] * avg[i] + n * FSCALE * (FSCALE - cexp[i])) |
111 | >> FSHIFT; | |
b3b807e5 | 112 | #if defined(COMPAT_43) && (defined(vax) || defined(tahoe)) |
80b6b780 KM |
113 | for (i = 0; i < 3; i++) |
114 | avenrun[i] = (double) averunnable[i] / FSCALE; | |
115 | #endif /* COMPAT_43 */ | |
e3bf9f41 | 116 | } |