以前的操作系统是实模式,例如dos。每个时候只有一个进程在跑,这个进程使用全部的物理内存。
后来发展到保护模式,分时多进程。一个CPU上跑多个进程, 但进程不知道到底有多少内存可以用,它能访问内存最大地址。例如16位系统就能访问2^16byte,32位就是2^32位。但是实际上没有那么多内存阿?怎么办?保护模式就应运而生了。
假设进程是一个刘祥,裁判(系统)一发令他就开始跑步。但是裁判说给你1秒,可以跑100米。于是刘祥开始跑步(内存地址),一秒后刘祥只跑了10米,裁判吹哨说:刘祥你先歇会,我要去给王军霞吹哨呢,现记住你跑到哪里了(保护),等会从这里开始。裁判给王军霞吹哨,也只跑一秒,回来再给刘祥吹哨再跑1秒,如此往复。开始跑步的人少,刘祥还可以站在跑道上休息。后来跑步的人越来越多,跑道都挤满了人,那么只能把一些人移动到跑道旁的草地上休息(交换)。后来发现有些人横七竖八的躺着,占了不少空间,于是规定每个人只能站着(page),这样可以容纳很多的人。
swap -- 草地,就是存放page的硬盘空间。
virtual memory -- 假设刘祥跑n圈就已经是到北京的距离了,可是他们还在原地。虚拟就是不存在的。
page -- 草地上的格,每次只容纳一个人
为了提高磁盘存取效率,Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache有效缩短了I/O系统调用(比如read,write,getdents)的时间.
内存活动基本上可以用3个数字来量化:活动虚拟内存总量,交换(swapping)率和调页(paging)率.其中第一个数字表明内存的总需求量,后两个数字表示那些内存中有多少比例正处在使用之中.目标是减少内存活动或增加内存量,直到调页率保持在一个可以接受的水平上为止.
活动虚拟内存的总量(VM)=实际内存大小(size of real memory)(物理内存)+使用的交换空间大小(amount of swap space used)
当程序运行需要的内存大于物理内存时,UNIX系统采用了调页机制,即系统copy一些内存中的页面到磁盘上,腾出来空间供进程使用。
大多数系统可以忍受偶尔的调页,但是频繁的调页会使系统性能急剧下降。
UNIX内存管理:UNIX系统通过2种方法进行内存管理,“调页算法”,“交换技术”。
调页算法是将内存中最近不常使用的页面换到磁盘上,把常使用的页面(活动页面)保留在内存中供进程使用。
交换技术是系统将整个进程,而不是部分页面,全部换到磁盘上。正常情况下,系统会发生一些交换过程。
当内存严重不足时,系统会频繁使用调页和交换,这增加了磁盘I/O的负载。进一步降低了系统对作业的执行速度,即系统I/O资源问题又会影响到内存资源的分配。
Unix的虚拟内存
Unix的虚拟内存是一个十分复杂的子系统,它实现了进程间代码与数据共享机制的透明性,并能够分配比系统现有物理内存更多的内存,某些操作系统的虚存甚至能通过提供缓存功能影响到文件系统的性能,各种风格的UNIX的虚存的实现方式区别很大,但都离不开下面的4个概念。
1:实际内存
实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序,现在的RAM的形式有多种:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用纠错机制(ECC)。
2:交换空间
交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时使用,通常推荐交换空间的大小应该是物理内存的二到四倍。
3:页面调度
页面调度是指从磁盘向内存传输数据,以及相反的过程,这个过程之所以被称为页面调度,是因为Unix内存被平均划分成大小相等的页面;通常页面大小为4KB和8KB(在Solaris中可以用pagesize命令查看)。当可执行程序开始运行时,它的映象会一页一页地从磁盘中换入,与此类似,当某些内存在一段时间内空闲,就可以把它们换出到交换空间中,这样就可以把空闲的RAM交给其他需要它的程序使用。
4:交换
页面调度通常容易和交换的概念混淆,页面调度是指把一个进程所占内存的空闲部分传输到磁盘上,而交换是指当系统中实际的内存已不够满足新的分配需求时,把整个进程传输到磁盘上,交换活动通常意味着内存不足。
vmstat监视内存性能:该命令用来检查虚拟内存的统计信息,并可显示有关进程状态、空闲和交换空间、调页、磁盘空间、CPU负载和交换,cache刷新以及中断等方面的信息。
Procs
r: The number of processes waiting for run time.
运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于1)
b: The number of processes in uninterruptable sleep.
处于不可中断状态的进程数,常见的情况是由IO引起的
w: The number of processes swapped out but otherwise runnable.
Memory
swpd: the amount of virtual memory used (kB).
free: the amount of idle memory (kB).
空闲的物理内存
buff: the amount of memory used as buffers (kB).
作为buffer cache的内存,对块设备的读写进行缓冲
cache: the amount of memory used as cache.
Swap
si: Amount of memory swapped in from disk (kB/s). 虚拟内存的页导入(从SWAP DISK导入RAM)
so: Amount of memory swapped to disk (kB/s). 虚拟内存的页导出.
分享到:
相关推荐
1. **交换分区管理**:`swap_state.c`可能包含了对交换分区的定义、分配、激活和去激活的函数。交换分区是在硬盘上预分配的一块空间,用于模拟额外的内存。 2. **交换空间分配**:内核如何找到合适的交换空间进行...
标题中的"page_io.rar_swap"暗示了我们正在讨论与页面I/O操作和交换空间(swap)有关的议题。在这个场景下,“swap set page dirty”指的是Linux内核如何处理内存页的状态,特别是当一个页面的数据被修改后,标记为...
Swap空间是Linux系统为了提高整体性能和稳定性而采用的一种内存管理机制,它将不常用的应用程序内存页面从物理内存(RAM)转移到次级存储(通常是磁盘)上的一个专用区域。通过这种方式,可以释放物理内存供其他目的...
1. 开启和关闭Swap:可以通过`swapon`和`swapoff`命令来启用和禁用Swap分区。 2. 调整Swap空间大小:可以通过调整交换分区的大小或者添加新的交换文件来增加Swap空间。 3. 调整swappiness:通过修改`/sys/sysctl/vm....
因此,了解 Linux 交换空间(SWAP)配置的原理、配置方法和优化技巧是每个 Linux 系统管理员和开发者所必备的知识。 在 Linux 系统中,SWAP 空间可以分为两种:系统SWAP和文件SWAP。系统SWAP是指操作系统分配的一...
- **`get_swap_page()`**:当需要从交换空间中读取页面时调用此函数。它会根据给定的索引返回相应的页面。 - **`swap_free()`**:释放交换空间中的页面,确保它们不会被重复使用。 #### 12.5 创建交换文件 创建...
可以看出,Swappartition 机制和 File-backed Memory 机制的主要区别在于它们的目的地不同。前者用于保存未使用的匿名内存(如进程的栈和堆),而后者则用于保存与文件相关的内存内容。 #### 三、Demand Paging ...
这个过程涉及到两个关键操作:`free()`和`swap_out()`. `free()`用于释放没有被引用的匿名页面,而`swap_out()`则负责将活动但不频繁使用的页面写入交换空间,以腾出物理内存给更重要的任务使用。页面回收策略包括...
内存释放_free_memory_ 基于 移动开发,Android 系统 使用.
在Linux系统中,类似的机制被称为“交换空间”(Swap Space)。 当计算机运行的程序和数据超过了实际的物理RAM(随机存取存储器)容量时,操作系统会将部分暂时不活跃的数据存储到硬盘上的页面文件,以便腾出物理...
如果swappiness参数设置为0,意味着系统不会swap anon page,即使系统内存不足也不会进行swap操作。这意味着系统将会尽量使用物理内存,尽量避免swap操作。但是,这也会导致系统在内存不足时可能会出现OOM问题。 ...
【Oracle数据库服务器关闭Linux透明大页和开启大页的方法】 Oracle数据库在运行时对内存管理有严格的要求,尤其是在高可用性环境中,如Oracle Real Application Clusters (RAC)。透明大页(Transparent Huge Pages, ...
它是在`do_page_fault()`之后被调用的,负责最终的映射建立工作,包括调用`do_swap_page()`、`do_anonymous_page()`、`do_wp_page()`等函数来完成具体的映射操作。 ##### do_no_page()源码解析 `do_no_page()`函数...
分页率分为Page-in Rate和Page-out Rate。Page-in Rate指的是每秒从磁盘读入内存的页面数量,高Page-in Rate通常表示内存不足,系统频繁地从磁盘读取数据到内存。 #### Page-out Rate 而Page-out Rate则是指每秒从...
page 链表是指系统中所有使用过的 page 的链表,包括 inacTIve anon、active anon、inacTIve file、active file 等四个链表。 五、结论 swappiness 参数是 Linux 内核页回收机制的一个关键参数,它决定了内核在页...
3. 补充基于FIFO的页面替换算法,包括在do_pgfault函数中的实现以及在swap_fifo.c中的map_swappable和swap_out_victim函数。 对于页目录项(Page Directory Entry,PDE)和页表项(Page Table Entry,PTE),它们的...
实验4是关于虚拟内存管理的实践,目标是理解和实现虚拟内存中的Page Fault异常处理和FIFO页面替换算法。实验要求学生在已有的UCore操作系统实验基础上进行工作,这涉及到页表机制和中断异常处理。实验主要分为两个...
实验环境 CentOS Linux release 7.3.1611 ... total:系统总内存大小(分物理内存mem、交换分区swap) used:已使用的内存(total – free – buffers – cache) free:未使用的内存 shared:通常情况下是t
1. **避免SGA被交换到swap**:通过使用大页,可以确保系统内存中的共享全局区(SGA)不会被交换到磁盘上的swap空间中,从而避免因磁盘I/O带来的性能损失。 2. **减轻TLB(Translation Lookaside Buffer)的压力**:...