'\" te .\" Copyright (c) 2005, Sun Microsystems, Inc. All Right Reserved. .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License. .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License. .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner] .TH madvise 3C "23 Feb 2005" "SunOS 5.11" "Standard C Library Functions" .SH NAME madvise \- provide advice to VM system .SH SYNOPSIS .LP .nf #include #include \fBint\fR \fBmadvise\fR(\fBcaddr_t\fR \fIaddr\fR, \fBsize_t\fR \fIlen\fR, \fBint\fR \fIadvice\fR); .fi .SH DESCRIPTION .sp .LP The \fBmadvise()\fR function advises the kernel that a region of user mapped memory in the range [\fIaddr\fR, \fIaddr\fR + \fIlen\fR) will be accessed following a type of pattern. The kernel uses this information to optimize the procedure for manipulating and maintaining the resources associated with the specified mapping range. .sp .LP Values for \fIadvice\fR are defined in <\fBsys/mman.h\fR> as: .sp .in +2 .nf #define MADV_NORMAL 0x0 /* No further special treatment */ #define MADV_RANDOM 0x1 /* Expect random page references */ #define MADV_SEQUENTIAL 0x2 /* Expect sequential page references */ #define MADV_WILLNEED 0x3 /* Will need these pages */ #define MADV_DONTNEED 0x4 /* Don't need these pages */ #define MADV_FREE 0x5 /* Contents can be freed */ #define MADV_ACCESS_DEFAULT 0x6 /* default access */ #define MADV_ACCESS_LWP 0x7 /* next LWP to access heavily */ #define MADV_ACCESS_MANY 0x8 /* many processes to access heavily */ .fi .in -2 .sp .ne 2 .mk .na \fB\fBMADV_NORMAL\fR\fR .ad .RS 23n .rt This is the default system characteristic where accessing memory within the address range causes the system to read data from the mapped file. The kernel reads all data from files into pages which are retained for a period of time as a "cache." System pages can be a scarce resource, so the kernel steals pages from other mappings when needed. This is a likely occurrence, but adversely affects system performance only if a large amount of memory is accessed. .RE .sp .ne 2 .mk .na \fB\fBMADV_RANDOM\fR\fR .ad .RS 23n .rt Tell the kernel to read in a minimum amount of data from a mapped file on any single particular access. If \fBMADV_NORMAL\fR is in effect when an address of a mapped file is accessed, the system tries to read in as much data from the file as reasonable, in anticipation of other accesses within a certain locality. .RE .sp .ne 2 .mk .na \fB\fBMADV_SEQUENTIAL\fR\fR .ad .RS 23n .rt Tell the system that addresses in this range are likely to be accessed only once, so the system will free the resources mapping the address range as quickly as possible. .RE .sp .ne 2 .mk .na \fB\fBMADV_WILLNEED\fR\fR .ad .RS 23n .rt Tell the system that a certain address range is definitely needed so the kernel will start reading the specified range into memory. This can benefit programs wanting to minimize the time needed to access memory the first time, as the kernel would need to read in from the file. .RE .sp .ne 2 .mk .na \fB\fBMADV_DONTNEED\fR\fR .ad .RS 23n .rt Tell the kernel that the specified address range is no longer needed, so the system starts to free the resources associated with the address range. .RE .sp .ne 2 .mk .na \fB\fBMADV_FREE\fR\fR .ad .RS 23n .rt Tell the kernel that contents in the specified address range are no longer important and the range will be overwritten. When there is demand for memory, the system will free pages associated with the specified address range. In this instance, the next time a page in the address range is referenced, it will contain all zeroes. Otherwise, it will contain the data that was there prior to the \fBMADV_FREE\fR call. References made to the address range will not make the system read from backing store (swap space) until the page is modified again. .sp This value cannot be used on mappings that have underlying file objects. .RE .sp .ne 2 .mk .na \fB\fBMADV_ACCESS_LWP\fR\fR .ad .RS 23n .rt Tell the kernel that the next LWP to touch the specified address range will access it most heavily, so the kernel should try to allocate the memory and other resources for this range and the LWP accordingly. .RE .sp .ne 2 .mk .na \fB\fBMADV_ACCESS_MANY\fR\fR .ad .RS 23n .rt Tell the kernel that many processes and/or LWPs will access the specified address range randomly across the machine, so the kernel should try to allocate the memory and other resources for this range accordingly. .RE .sp .ne 2 .mk .na \fB\fBMADV_ACCESS_DEFAULT\fR\fR .ad .RS 23n .rt Reset the kernel's expectation for how the specified range will be accessed to the default. .RE .sp .LP The \fBmadvise()\fR function should be used by applications with specific knowledge of their access patterns over a memory object, such as a mapped file, to increase system performance. .SH RETURN VALUES .sp .LP Upon successful completion, \fBmadvise()\fR returns \fB0\fR; otherwise, it returns \fB\(mi1\fR and sets \fBerrno\fR to indicate the error. .SH ERRORS .sp .ne 2 .mk .na \fB\fBEAGAIN\fR\fR .ad .RS 10n .rt Some or all mappings in the address range [\fIaddr\fR, \fIaddr\fR + \fIlen\fR) are locked for I/O. .RE .sp .ne 2 .mk .na \fB\fBEBUSY\fR\fR .ad .RS 10n .rt Some or all of the addresses in the range [\fIaddr\fR, \fIaddr\fR + \fIlen\fR) are locked and \fBMS_SYNC\fR with the \fBMS_INVALIDATE\fR option is specified. .RE .sp .ne 2 .mk .na \fB\fBEFAULT\fR\fR .ad .RS 10n .rt Some or all of the addresses in the specified range could not be read into memory from the underlying object when performing \fBMADV_WILLNEED\fR. The \fBmadvise()\fR function could return prior to this condition being detected, in which case \fBerrno\fR will not be set to \fBEFAULT\fR. .RE .sp .ne 2 .mk .na \fB\fBEINVAL\fR\fR .ad .RS 10n .rt The \fIaddr\fR argument is not a multiple of the page size as returned by \fBsysconf\fR(3C), the length of the specified address range is equal to 0, or the \fIadvice\fR argument was invalid. .RE .sp .ne 2 .mk .na \fB\fBEIO\fR\fR .ad .RS 10n .rt An I/O error occurred while reading from or writing to the file system. .RE .sp .ne 2 .mk .na \fB\fBENOMEM\fR\fR .ad .RS 10n .rt Addresses in the range [\fIaddr\fR, \fIaddr\fR + \fIlen\fR) are outside the valid range for the address space of a process, or specify one or more pages that are not mapped. .RE .sp .ne 2 .mk .na \fB\fBESTALE\fR\fR .ad .RS 10n .rt Stale \fBNFS\fR file handle. .RE .SH ATTRIBUTES .sp .LP See \fBattributes\fR(5) for descriptions of the following attributes: .sp .sp .TS tab() box; cw(2.75i) |cw(2.75i) lw(2.75i) |lw(2.75i) . ATTRIBUTE TYPEATTRIBUTE VALUE _ Interface StabilityStable _ MT-LevelMT-Safe .TE .SH SEE ALSO .sp .LP \fBmeminfo\fR(2), \fBmmap\fR(2), \fBsysconf\fR(3C), \fBattributes\fR(5)