Linux 内存机制以及CPU、内存、硬盘的关系、物理内存以及虚拟内存的关系
本文有些篇幅较长,但如果认真读下来,相信你会收获颇丰!!
document
- linux内存机制
- CPU
- 内存
- 虚拟内存
- 硬盘
- 物理内存
- 内存和虚拟内存
- 跟 Windows 完全不同的 Linux 内存机制
- Swap配置对性能的影响
linux内存机制
Linux支持虚拟内存(Virtual Mmemory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这块内存就可用于其它目的。当需要用到原始的内容时,它们被重新读入内存。这些操作对用户来说是完全透明的;Linux下运行的程序只是看到有大量的内存可供使用而并没有注意到时不时它们的一部分是驻留在硬盘上的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程序就不会象一直在内存中运行的那样快。用作虚拟内存的硬盘部分被称为交换空间(Swap Space)。
一般,在交换空间中的页面首先被换入内存;如果此时没有足够的物理内存来容纳它们又将被交换出来(到其他的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。
有时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种情况是有可能发生的,例如如果在某一时刻有进行交换的必要,但后来一个占用很多物理内存的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个需要时。此时物理内存会在一段时间内保持空闲状态。对此并没有什么可担心的,但是知道了是怎么一回事,也就无所谓了。许多操作系统使用了虚拟内存的方法。因为它们仅在运行时才需要交换空间,以解决不会在同一时间使用交换空间,因此,除了当前正在运行的操作系统的交换空间,其它的就是一种浪费。所以让它们共享一个交换空间将会更有效率。
注意:如果会有几个人同时使用这个系统,他们都将消耗内存。然而,如果两个人同时运行一个程序,内存消耗的总量并不是翻倍,因为代码页以及共享的库只存在一份。Linux系统常常动不动就使用交换空间,以保持尽可能多的空闲物理内存。即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间:当磁盘闲着,就可以提前做好交换。可以将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样做可以提高性能。与访问物理内存相比,磁盘的读写是很慢的。另外,在相应较短的时间内多次读磁盘同样的部分也是常有的事。例如,某人也许首先阅读了一段E-mail消息,然后为了答复又将这段消息读入编辑器中,然后又在将这个消息拷贝到文件夹中时,使得邮件程序又一次读入它。或者考虑一下在一个有着许多用户的系统中 ls命令会被使用多少次。通过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读以外,可以加快所有其它读的速度。这叫作磁盘缓冲(Disk Buffering),被用作此目的的内存称为高速缓冲(Buffer Cache)。但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。
大多数操作系统都有高速缓冲(尽管可能称呼不同),但是并不是都遵守上面的原理。有些是直接写(Write-Through):数据将被立刻写入磁盘(当然,数据也被放入缓存中)。如果写操作是在以后做的,那么该缓存被称为后台写(Write-Back)。后台写比直接写更有效,但也容易出错:如果机器崩溃,或者突然掉电,缓冲中改变过的数据就被丢失了。如果仍未被写入的数据含有重要的薄记信息,这甚至可能意味着文件系统(如果有的话)已不完整。
针对以上的原因,出现了很多的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即使此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。当然这些问题不再本文的叙述范围。由于上述原因,在使用适当的关闭过程之前,绝对不要关掉电源,Sync命令倾空(Flushes)缓冲,也即,强迫所有未被写的数据写入磁盘,可用以确定所有的写操作都已完成。在传统的UNIX系统中,有一个叫做update的程序运行于后台,每隔30秒做一次sync操作,因此通常无需手工使用sync命令了。Linux另外有一个后台程序,Bdflush,这个程序执行更频繁的但不是全面的同步操作,以避免有时sync的大量磁盘I/O操作所带来的磁盘的突然冻结。在Linux中,Bdflush是由update启动的。通常没有理由来担心此事,但如果由于某些原因bdflush进程死掉了,内核会对此作出警告,此时你就要手工地启动它了(/sbin/update)。
**缓存(Cache)**实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。缓冲的效力主要是由它的大小决定的。缓冲太小的话等于没用。它只能容纳一点数据,因此在被重用时,所有缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。如果缓存有固定的大小,那么缓存太大了也不好,因为这会使得空闲的内存太小而导致进行交换操作(这同样是慢的)。为了最有效地使用实际内存,Linux自动地使用所有空闲的内存作为高速缓冲,当程序需要更多的内存时,它也会自动地减小缓冲的大小。这就是一般情况下Linux内存的一般机制,真正的Linux内存的运行机制远远比这个复杂。
CPU
内存
虚拟内存
硬盘
物理内存
内存和虚拟内存
内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗更大。为了解决这个问题,可以使用虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。比如说当电脑要读取一个比物理内存还要大的文件时,就要用到虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,就把虚拟内里储存的文件释放到原来的目录里了。
跟 Windows 完全不同的 Linux 内存机制
在 Linux 中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是 Linux 内存管理的一个优秀特性,在这方面,区别于 Windows 的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高 Linux 系统的数据访问性能。而 Windows 是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux 都将能充分利用起来,发挥了硬件投资带来的好处,而 Windows 只将其做为摆设,即使增加 8GB 甚至更大。
Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为 cache 和 buffers
,以此提高数据访问性能。
页高速缓存(cache)是 Linux内核实现的一种主要磁盘缓存。它主要用来减少对磁盘的I/O操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理 内存的访问。
磁盘高速缓存的价值在于两个方面:
- 访问磁盘的速度要远远低于访问内存的速度,因此,从内存访问数据比从磁盘访问速度更快;
- 数据一旦被访 问,就很有可能在短期内再次被访问到。
综上所述,一般不需要太关注Linux的内存占用情况,如果SWAP占用率很高的话一般可能就是内存不够用了。
Swap配置对性能的影响
Linux 内存机制以及CPU、内存、硬盘的关系、物理内存以及虚拟内存的关系相关推荐
- Linux下CGroup进行CPU内存等资源控制
留存 from: http://www.cnblogs.com/kevingrace/p/5685433.html and http://www.cnblogs.com/wang_yb/p/394 ...
- Linux内存机制浅见——从内存布局到线程局部存储TLS
先记 最近在重新分析SGX的源码<再回顾sgx_create_enclave>,一路发现,我还需要重新思考ELF文件格式(我在<SGX初始化中ElfParser::run_parse ...
- linux 下取进程占用 cpu/内存 最高的前10个进程
1. linux 下 取进程占用 cpu 最高的前10个进程 ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head ps auxw|head -1 ...
- 内存屏障(cpu内存屏障 与java内存屏障)
文章目录 CPU 内存屏障 定义 读写屏障指令 为什么会出现内存屏障 java内存屏障 java内存屏障存在意义 java中内存屏障的主要类型 LoadLoad 屏障 StoreStore 屏障 Lo ...
- MetricBeat(win/linux)部署 系统CPU内存等资源情况监控
目录 1.下载 2.linux系统监控 3.启用模块 4.windows系统监控 1.下载 下载MetricBeat的linux和windows版本 https://artifacts.elasti ...
- linux 进程内存排行,linux下获取占用CPU/内存资源最多的10个进程[转自亿唐网]
inux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用内 ...
- Linux查看硬件配置-cpu内存磁盘网卡
Linux查看硬件配置 资产管理命令dmidecode 查看服务器型号 查看主板的序列号 查看系统序列号 查看cpu 查看占用cpu最多的几个进程 查看内存 查看内存信息 查看内存数量和内存大小 查询 ...
- c++ 无法读取内存_Linux内存机制以及手动释放swap和buffer和cache
点击上方 "Linux中文社区" 关注,星标或者置顶11点30分准时推送,第一时间送达 作者:Darren_Wen | 责编:中文妹 来源:blog.51cto.com/wenda ...
- hm55主板支持最大内存_内存频率取决于CPU还是主板?内存频率看主板支持还是看CPU支持?...
内存频率取决于CPU还是主板还是内存自身?高频内存在日常使用确实感受不到性能差异,不过在部分游戏中,确实对游戏帧数有一定的提升.对于准备新装机用户,不少用户发现CPU和主板都有内存支持频率参数,可能有 ...
最新文章
- 机器学习(10)随机森林(预测泰坦尼克号旅客存活率)
- ERICA:提升预训练语言模型实体与关系理解的统一框架
- css transform旋转属性
- C#二进制文件编程实践
- C++设计模式--适配器模式
- c++调用Java以及string互转
- UOJ #592. 投放点的选择
- 将G1内的SIM卡联系人导入到GMAIL的联系人中
- 源码 状态机_LLVM学习笔记(1)--初探源码
- Flutter获取packageName和versionCode
- 360二代抢票神器 v7.1.1.502 官方版
- Android 使用OPENCV实现图像实时对比
- cnpm : 无法加载文件 C:\Users\zsl\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本
- WARNING: AllowZoneDrifting is enabled.
- Win7与VirtualBox ubuntu共享文件夹
- python常用的颜色英文表达_python 中颜色的表示
- 佳能R5专业微单相机介绍
- origin3D作图surface和等高线图contor
- 【语音去噪】基于matlab软阈值+硬阈值+折中阈值语音去噪【含Matlab源码 530期】
- 已知两点坐标如何快速增加其他坐标_天文坐标系分类