haiku/docs/develop/kernel/vm/vm_daemon
Augustin Cavalier 18a8edbf0e docs/develop: More reorganization.
* There is now a 'busses' folder, and the extant USB/SDHCI/Bluetooth/etc.
   docs now live in it, instead of various other places.
 * kernel/ports is now kernel/arch, like it is in src/system.
   SPARC documentation is now in there, too.
 * VM files (these are rather outdated) are now in kernel/vm.
 * SCSI ASC info removed, this is easily available online and
   it doesn't seem to be very relevant.
2019-03-30 18:00:46 -04:00

33 lines
1.3 KiB
Plaintext

Variables
bool trimming_cycle;
Do we need free space?
static addr free_memory_low_water;
static addr free_memory_high_water;
static void scan_pages(vm_address_space *aspace, addr free_target)
Finds a region in this address space to scan.
Locks the region's cache_ref.
For each page,
if the page is present, do nothing with this page
Lookup the page structure. If this page doesn't exist, do nothing with this page.
If the page is written to or is hard wired (unswapable), do nothing with it.
If the page is not accessed and is active and we need space (free_target), unmap it. If this is the last reference to that mapped page, put it on the inactive list.
If the page has been modified, but wasn't on the active list, put it there.
Move to the next region in this address space, wrap around until we hit the first one.
static int page_daemon()
Walk through every address space:
Adjust the size of the processes' working set (i.e. memory allocation) to be larger or smaller, to tailor to faults.
Set trimming cycle if free pages is below the high water mark.
Clear trimming cycle if free pages is above high water mark.
Set free memory target to be the processes' mapped size minus the working set
Call scan_pages
int vm_daemon_init()
Sets high water to pages/4 and low water to pages/8.
Creates the page daemon as a kernel thread.