Σελιδοποίηση
Κάθε σελίδα συνδέεται με την παρακάτω δομή δεδομένων που περιγράφει
τα χαρακτηριστικά της:
struct vm_page {
TAILQ_ENTRY(vm_page) pageq; /* queue info for FIFO queue or free list (P) */
TAILQ_ENTRY(vm_page) hashq; /* hash table links (O) */
TAILQ_ENTRY(vm_page) listq; /* pages in same object (O) */
vm_object_t object; /* which object am I in (O,P) */
vm_pindex_t pindex; /* offset into object (O,P) */
vm_offset_t phys_addr; /* physical address of page */
u_short queue; /* page queue index */
u_short flags, /* see below */
pc; /* page color */
u_short wire_count; /* wired down maps refs (P) */
short hold_count; /* page hold count */
u_char act_count; /* page usage count */
u_char busy; /* page busy count */
/* NOTE that these must support one bit per DEV_BSIZE in a page!!! */
/* so, on normal X86 kernels, they must be at least 8 bits wide */
u_char valid; /* map of valid DEV_BSIZE chunks */
u_char dirty; /* map of dirty DEV_BSIZE chunks */
};
Αντίστοιχα η σελίδα μπορεί να βρίσκεται σε μια από τις παρακάτω καταστάσεις:
#define PG_BUSY 0x01 /* page is in transit (O) */
#define PG_WANTED 0x02 /* someone is waiting for page (O) */
#define PG_TABLED 0x04 /* page is in VP table (O) */
#define PG_FICTITIOUS 0x08 /* physical page doesn't exist (O) */
#define PG_WRITEABLE 0x10 /* page is mapped writeable */
#define PG_MAPPED 0x20 /* page is mapped */
#define PG_ZERO 0x40 /* page is zeroed */
#define PG_REFERENCED 0x80 /* page has been referenced */
#define PG_CLEANCHK 0x100 /* page has been checked for cleaning */
Όλες οι σελίδες ανοίκουν σε μια από 5 διαφορετικές λίστες ταξινομημένες
σύμφωνα με το κριτήριο LRU (Least Recently Used - Λιγότερο πρόσφατη
χρησιμοποιημένη).
- free
-
Σελίδες έτοιμες για χρήση.
- cache
-
Σελίδες σχεδόν έτοιμες για χρήση αφού ελευθερωθούν από τη
χρήση βοηθητικής μνήμης.
- inactive
-
Σελίδες που δεν έχουν χρησιμοποιηθεί πρόσφατα και είναι υποψήφιες
για νέα χρήση.
- active
-
Σελίδες που έχουν πρόσφατα χρησιμοποιηθεί.
- zero
-
Ελεύθερες σελίδες που έχουν μηδενιστεί.