* Copyright (c) 1982, 1986, 1989 Regents of the University of California.
* %sccs.include.redist.c%
* @(#)vm_meter.c 7.19 (Berkeley) %G%
struct loadavg averunnable
; /* load average, of runnable procs */
register unsigned *cp
, *rp
, *sp
;
if (time
.tv_sec
% 5 == 0)
if (proc0
.p_slptime
> maxslp
/2)
* Constants for averages over 1, 5, and 15 minutes
* when sampling at 5 second intervals.
0.9200444146293232 * FSCALE
, /* exp(-1/12) */
0.9834714538216174 * FSCALE
, /* exp(-1/60) */
0.9944598480048967 * FSCALE
, /* exp(-1/180) */
* Compute a tenex style load average of a quantity on
* 1, 5 and 15 minute intervals.
register struct loadavg
*avg
;
for (nrun
= 0, p
= (struct proc
*)allproc
; p
!= NULL
; p
= p
->p_nxt
) {
if (p
->p_pri
> PZERO
|| p
->p_slptime
!= 0)
avg
->ldavg
[i
] = (cexp
[i
] * avg
->ldavg
[i
] +
nrun
* FSCALE
* (FSCALE
- cexp
[i
])) >> FSHIFT
;
#if defined(COMPAT_43) && (defined(vax) || defined(tahoe))
avenrun
[i
] = (double) avg
->ldavg
[i
] / FSCALE
;
* Attributes associated with virtual memory.
vm_sysctl(name
, namelen
, oldp
, oldlenp
, newp
, newlen
, p
)
/* all sysctl names at this level are terminal */
return (ENOTDIR
); /* overloaded */
averunnable
.fscale
= FSCALE
;
return (sysctl_rdstruct(oldp
, oldlenp
, newp
, &averunnable
,
return (sysctl_rdstruct(oldp
, oldlenp
, newp
, &vmtotals
,
* Calculate the current state of the system.
* Done on demand from getkerninfo().
register struct vmtotal
*totalp
;
register vm_map_entry_t entry
;
register vm_object_t object
;
bzero(totalp
, sizeof *totalp
);
* Mark all objects as inactive.
simple_lock(&vm_object_list_lock
);
object
= (vm_object_t
) queue_first(&vm_object_list
);
while (!queue_end(&vm_object_list
, (queue_entry_t
) object
)) {
object
->flags
&= ~OBJ_ACTIVE
;
object
= (vm_object_t
) queue_next(&object
->object_list
);
simple_unlock(&vm_object_list_lock
);
* Calculate process statistics.
for (p
= (struct proc
*)allproc
; p
!= NULL
; p
= p
->p_nxt
) {
else if (p
->p_slptime
< maxslp
)
} else if (p
->p_slptime
< maxslp
)
if (p
->p_slptime
>= maxslp
)
for (map
= &p
->p_vmspace
->vm_map
, entry
= map
->header
.next
;
entry
!= &map
->header
; entry
= entry
->next
) {
if (entry
->is_a_map
|| entry
->is_sub_map
||
entry
->object
.vm_object
== NULL
)
entry
->object
.vm_object
->flags
|= OBJ_ACTIVE
;
paging
|= entry
->object
.vm_object
->paging_in_progress
;
* Calculate object memory usage statistics.
simple_lock(&vm_object_list_lock
);
object
= (vm_object_t
) queue_first(&vm_object_list
);
while (!queue_end(&vm_object_list
, (queue_entry_t
) object
)) {
totalp
->t_vm
+= num_pages(object
->size
);
totalp
->t_rm
+= object
->resident_page_count
;
if (object
->flags
& OBJ_ACTIVE
) {
totalp
->t_avm
+= num_pages(object
->size
);
totalp
->t_arm
+= object
->resident_page_count
;
if (object
->ref_count
> 1) {
totalp
->t_vmshr
+= num_pages(object
->size
);
totalp
->t_rmshr
+= object
->resident_page_count
;
if (object
->flags
& OBJ_ACTIVE
) {
totalp
->t_avmshr
+= num_pages(object
->size
);
totalp
->t_armshr
+= object
->resident_page_count
;
object
= (vm_object_t
) queue_next(&object
->object_list
);
totalp
->t_free
= cnt
.v_free_count
;