Page (computer memory)
A page, memory page, or virtual page is a fixed-length contiguous block of virtual memory, described by a single entry in the page table. It is the smallest unit of data for memory management in a virtual memory operating system. Similarly, a page frame is the smallest fixed-length contiguous block of physical memory into which memory pages are mapped by the operating system.[1][2][3]
A transfer of pages between main memory and an auxiliary store, such as a hard disk drive, is referred to as paging or swapping.[4]
Page size trade-off
Page size is usually determined by the processor architecture. Traditionally, pages in a system had uniform size, for example 4096 bytes. However, processor designs often allow two or more, sometimes simultaneous, page sizes due to its benefits. There are several points that can factor into choosing the best page size.[5]
- Page size versus page table size
- A system with a smaller page size uses more pages, requiring a page table that occupies more space. For example, if a 232 virtual address space is mapped to 4 KiB (212 bytes) pages, the number of virtual pages is 220 = (232 / 212). However, if the page size is increased to 32 KiB (215 bytes), only 217 pages are required. A multi-level paging algorithm can decrease the memory cost of allocating a large page table for each process by further dividing the page table up into smaller tables, effectively paging the page table.
- Page size versus TLB usage
- Since every access to memory must be mapped from virtual to physical address, reading the page table every time can be quite costly. Therefore, a very fast kind of cache, the Translation Lookaside Buffer (TLB), is often used.[6] The TLB is of limited size, and when it cannot satisfy a given request (a TLB miss) the page tables must be searched manually (either in hardware or software, depending on the architecture) for the correct mapping. Larger page sizes mean that a TLB cache of the same size can keep track of larger amounts of memory, which avoids the costly TLB misses.
- Internal fragmentation of pages
- Rarely do processes require the use of an exact number of pages. As a result, the last page will likely only be partially full, wasting some amount of memory. Larger page sizes lead to large amount of wasted memory, as more potentially unused portions of memory are loaded into main memory. Smaller page sizes ensure a closer match to the actual amount of memory required in an allocation.
- As an example, assume the page size is 1024 KiB. If a process allocates 1025 KiB, two pages must be used, resulting in 1023 KiB of unused space (where one page fully consumes 1024 KiB and the other only 1 KiB).
- Page size versus disk access
- When transferring from a rotational disk, much of the delay is caused by seek time, the time it takes to correctly position the read/write heads above the disk platters. Because of this, large sequential transfers are more efficient than several smaller transfers. Transferring the same amount of data from disk to memory often requires less time with larger pages than with smaller pages.
Determining the page size in a program
Most operating systems allow programs to discover the page size at runtime. This allows programs to use memory more efficiently by aligning allocations to this size and reducing overall internal fragmentation of pages.
Unix and POSIX-based operating systems
Unix and POSIX-based systems may use the system function sysconf()
,[7][8][9][10][11] as illustrated in the following example written in the C programming language.
#include <stdio.h>
#include <unistd.h> /* sysconf(3) */
int main(void) {
printf("The page size for this system is %ld bytes.\n",
sysconf(_SC_PAGESIZE)); /* _SC_PAGE_SIZE is OK too. */
return 0;
}
In many Unix systems, the command line utility getconf
can be used.[12][13][14]
For example, getconf PAGESIZE
will return the page size in bytes.
Windows-based operating systems
Win32-based operating systems, such as those in the Windows 9x and Windows NT families, may use the system function GetSystemInfo()
[15][16] from kernel32.dll
.
#include <stdio.h>
#include <windows.h>
int main(void) {
SYSTEM_INFO si;
GetSystemInfo(&si);
printf("The page size for this system is %u bytes.\n", si.dwPageSize);
return 0;
}
Multiple page sizes
Some instruction set architectures can support multiple page sizes, including pages significantly larger than the standard page size. The available page sizes depend on the instruction set architecture, processor type, and operating (addressing) mode. The operating system selects one or more sizes from the sizes supported by the architecture. Note that not all processors implement all defined larger page sizes. This support for larger pages (known as huge pages in Linux, superpages in FreeBSD, and large pages in Microsoft Windows terminology) allows for "the best of both worlds", reducing the pressure on the TLB cache (sometimes increasing speed by as much as 15%, depending on the application and the allocation size) for large allocations while still keeping memory usage at a reasonable level for small allocations.[6]
Architecture | Smallest page size | Larger page sizes |
---|---|---|
32-bit x86[18] | 4 KiB | 4 MiB in PSE mode, 2 MiB in PAE mode[19] |
x86-64[18] | 4 KiB | 2 MiB, 1 GiB (only when the CPU has PDPE1GB flag) |
IA-64 (Itanium)[20] | 4 KiB | 8 KiB, 64 KiB, 256 KiB, 1 MiB, 4 MiB, 16 MiB, 256 MiB[19] |
Power Architecture[21] | 4 KiB | 64 KiB, 16 MiB, 16 GiB |
SPARC v8 with SPARC Reference MMU[22] | 4 KiB | 256 KiB, 16 MiB |
UltraSPARC Architecture 2007[23] | 8 KiB | 64 KiB, 512 KiB (optional), 4 MiB, 32 MiB (optional), 256 MiB (optional), 2 GiB (optional), 16 GiB (optional) |
ARMv7[24] | 4 KiB | 64 KiB, 1 MiB ("section"), 16 MiB ("supersection") (defined by a particular implementation) |
Starting with the Pentium Pro, and the AMD Athlon, x86 processors support 4 MiB pages (called Page Size Extension) (2 MiB pages if using PAE) in addition to their standard 4 KiB pages; newer x86-64 processors, such as AMD's newer AMD64 processors and Intel's Westmere[25] and later Xeon processors can use 1 GiB pages in long mode. IA-64 supports as many as eight different page sizes, from 4 KiB up to 256 MiB, and some other architectures have similar features.
Larger pages, despite being available in the processors used in most contemporary personal computers, are not in common use except in large-scale applications, the applications typically found in large servers and in computational clusters, and in the operating system itself. Commonly, their use requires elevated privileges, cooperation from the application making the large allocation (usually setting a flag to ask the operating system for huge pages), or manual administrator configuration; operating systems commonly, sometimes by design, cannot page them out to disk.
However, SGI IRIX has general-purpose support for multiple page sizes. Each individual process can provide hints and the operating system will automatically use the largest page size possible for a given region of address space.[26]
Linux has supported huge pages on several architectures since the 2.6 series via the hugetlbfs filesystem[27] and without hugetlbfs since 2.6.38.[28] Windows Server 2003 (SP1 and newer), Windows Vista and Windows Server 2008 support huge pages under the name of large pages. Windows 2000 and Windows XP support large pages internally,[29] but do not expose them to applications. Solaris beginning with version 9 supports large pages on SPARC and x86.[30][31] FreeBSD 7.2-RELEASE features superpages.[32] Note that until recently in Linux, applications needed to be modified in order to use huge pages. The 2.6.38 kernel introduced support for transparent use of huge pages.[28] On Linux kernels supporting transparent huge pages, as well as FreeBSD and Solaris, applications take advantage of huge pages automatically, without the need for modification.[32]
See also
References
- ↑ Christopher Kruegel (2012-12-03). "Operating Systems (CS170-08 course)" (PDF). cs.ucsb.edu. Retrieved 2016-06-13.
- ↑ Martin C. Rinard (1998-08-22). "Operating Systems Lecture Notes, Lecture 9. Introduction to Paging". people.csail.mit.edu. Retrieved 2016-06-13.
- ↑ "Virtual Memory: pages and page frames". cs.miami.edu. 2012-10-31. Retrieved 2016-06-13.
- ↑ Belzer, Jack; Holzman, Albert G.; Kent, Allen, eds. (1981), "Virtual memory systems", Encyclopedia of computer science and technology, 14, CRC Press, p. 32, ISBN 0-8247-2214-0
- ↑ "Using 4KB Page Size for Virtual Memory is Obsolete". IEEE. 2009-08-10. CiteSeerX 10.1.1.154.2023 .
- 1 2 "A Survey of Techniques for Architecting TLBs", Concurrency and Computation: Practice and Experience, 2016.
- ↑ – Base Definitions Reference, The Single UNIX Specification, Issue 7 from The Open Group
- ↑ – System Interfaces Reference, The Single UNIX Specification, Issue 7 from The Open Group
- ↑ – Linux Library Functions Manual
- ↑ – Darwin and macOS Library Functions Manual
- ↑ – Solaris 10 Basic Library Functions Reference Manual
- ↑ – Commands & Utilities Reference, The Single UNIX Specification, Issue 7 from The Open Group
- ↑ – Linux User Commands Manual
- ↑ – Darwin and macOS General Commands Manual
- ↑ "GetSystemInfo function". Microsoft.
- ↑ "SYSTEM_INFO structure". Microsoft.
- ↑ "Hugepages - Debian Wiki". Wiki.debian.org. 2011-06-21. Retrieved 2014-02-06.
- 1 2 "Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide" (PDF). December 2016. p. 4-2.
- 1 2 "Documentation/vm/hugetlbpage.txt". Linux kernel documentation. kernel.org. Retrieved 2014-02-06.
- ↑ "Intel Itanium Architecture Software Developer’s Manual Volume 2: System Architecture" (PDF). May 2010. p. 2:58.
- ↑ IBM Power Systems Performance Guide: Implementing and Optimizing. IBM Redbooks. February 2013. Retrieved 2014-03-17.
- ↑ "The SPARC Architecture Manual, Version 8" (PDF). 1992. p. 249.
- ↑ "UltraSPARC Architecture 2007" (PDF). September 27, 2010. p. 427.
- ↑ "ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition". May 20, 2014. p. B3-1324.
- ↑ "The Intel Xeon 5670: Six Improved Cores". AnandTech. Retrieved 2012-11-03.
- ↑ "General Purpose Operating System Support for Multiple Page Sizes" (PDF). static.usenix.org. Retrieved 2012-11-02.
- ↑ "Pages - dankwiki, the wiki of nick black". Dank.qemfd.net. Retrieved 2012-11-03.
- 1 2 Corbet, Jonathan. "Transparent huge pages in 2.6.38". LWN. Retrieved 2011-03-02.
- ↑ "AGP program may hang when using page size extension on Athlon processor". Support.microsoft.com. 2007-01-27. Retrieved 2012-11-03.
- ↑ "Supporting Multiple Page Sizes in the Solaris Operating System" (PDF). Sun BluePrints Online. Sun Microsystems. Retrieved 2008-01-19.
- ↑ "Supporting Multiple Page Sizes in the Solaris Operating System Appendix" (PDF). Sun BluePrints Online. Sun Microsystems. Retrieved 2008-01-19.
- 1 2 "FreeBSD 7.2-RELEASE Release Notes". FreeBSD Foundation. Retrieved 2009-05-03.
Further reading
- Dandamudi, Sivarama P. (2003). Fundamentals of Computer Organization and Design (1st ed.). Springer. pp. 740–741. ISBN 0-387-95211-X.