荣耀彩票代理

IT技术互动交流平台

对Linux虚拟内存和物理内存的理解以及Linux下怎样增加虚拟内存

来源:IT165收集  发布日期:2016-06-06 21:53:37

首先,让我们看下linux虚拟内存:

 

第一层理解

荣耀彩票代理1. MEIGEJINCHENGDOUYOUZIJIDULIDE4GNEICUNKONGJIAN,GEGEJINCHENGDENEICUNKONGJIANJUYOULEISIDEJIEGOU

 

荣耀彩票代理2. YIGEXINJINCHENGJIANLIDESHIHOU,JIANGHUIJIANLIQIZIJIDENEICUNKONGJIAN,CIJINCHENGDESHUJU,DAIMADENGCONGCIPANKAOBEIDAOZIJIDEJINCHENGKONGJIAN,NAXIESHUJUZAINALI,DOUYOUJINCHENGKONGZHIBIAOZHONGDEtask_structJILU,task_structZHONGJILUZHONGYITIAOLIANBIAO,JILUZHONGNEICUNKONGJIANDEFENPEIQINGKUANG,NAXIEDIZHIYOUSHUJU,NAXIEDIZHIWUSHUJU,NAXIEKEDU,NAXIEKEXIE,DOUKEYITONGGUOZHEIGELIANBIAOJILU

 

3. MEIGEJINCHENGYIJINGFENPEIDENEICUNKONGJIAN,DOUYUDUIYINGDECIPANKONGJIANYINGSHE

 

WENTI:

JISUANJIMINGMINGMEIYOUNEIMEDUONEICUN(nGEJINCHENGDEHUAJIUXUYAOn*4G)NEICUN

荣耀彩票代理JIANLIYIGEJINCHENG,JIUYAOBACIPANSHANGDECHENGXUWENJIANKAOBEIDAOJINCHENGDUIYINGDENEICUNZHONGQU,DUIYUYIGECHENGXUDUIYINGDEDUOGEJINCHENGZHEIZHONGQINGKUANG,LANGFEINEICUN!

第二层理解

1. MEIGEJINCHENGDE4GNEICUNKONGJIANZHISHIXUNINEICUNKONGJIAN,MEICIFANGWENNEICUNKONGJIANDEMOUGEDIZHI,DOUXUYAOBADIZHIFANYIWEISHIJIWULINEICUNDIZHI

2. SUOYOUJINCHENGGONGXIANGTONGYIWULINEICUN,MEIGEJINCHENGZHIBAZIJIMUQIANXUYAODEXUNINEICUNKONGJIANYINGSHEBINGCUNCHUDAOWULINEICUNSHANG。

3. JINCHENGYAOZHIDAONAXIENEICUNDIZHISHANGDESHUJUZAIWULINEICUNSHANG,NAXIEBUZAI,HAIYOUZAIWULINEICUNSHANGDENALI,XUYAOYONGYEBIAOLAIJILU

4. YEBIAODEMEIYIGEBIAOXIANGFENLIANGBUFEN,DIYIBUFENJILUCIYESHIFOUZAIWULINEICUNSHANG,DIERBUFENJILUWULINEICUNYEDEDIZHI(RUGUOZAIDEHUA)

5. DANGJINCHENGFANGWENMOUGEXUNIDIZHI,QUKANYEBIAO,RUGUOFAXIANDUIYINGDESHUJUBUZAIWULINEICUNZHONG,ZEQUEYEYICHANG

6. QUEYEYICHANGDECHULIGUOCHENG,JIUSHIBAJINCHENGXUYAODESHUJUCONGCIPANSHANGKAOBEIDAOWULINEICUNZHONG,RUGUONEICUNYIJINGMANLE,MEIYOUKONGDIFANGLE,NEIJIUZHAOYIGEYEFUGAI,DANGRANRUGUOBEIFUGAIDEYECENGJINGBEIXIUGAIGUO,XUYAOJIANGCIYEXIEHUICIPAN

总结:

优点:

1.既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处

2.当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存

3.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片。

 

LINGWAI,SHISHISHANG,ZAIMEIGEJINCHENGCHUANGJIANJIAZAISHI,NEIHEZHISHIWEIJINCHENG“CHUANGJIAN”LEXUNINEICUNDEBUJU,JUTIJIUSHICHUSHIHUAJINCHENGKONGZHIBIAOZHONGNEICUNXIANGGUANDELIANBIAO,SHIJISHANGBINGBULIJIJIUBAXUNINEICUNDUIYINGWEIZHIDECHENGXUSHUJUHEDAIMA(BIRU.text .dataDUAN)KAOBEIDAOWULINEICUNZHONG,ZHISHIJIANLIHAOXUNINEICUNHECIPANWENJIANZHIJIANDEYINGSHEJIUHAO(JIAOZUOCUNCHUQIYINGSHE),DENGDAOYUNXINGDAODUIYINGDECHENGXUSHI,CAIHUITONGGUOQUEYEYICHANG,LAIKAOBEISHUJU。HAIYOUJINCHENGYUNXINGGUOCHENGZHONG,YAODONGTAIFENPEINEICUN,BIRUmallocSHI,YEZHISHIFENPEILEXUNINEICUN,JIWEIZHEIKUAIXUNINEICUNDUIYINGDEYEBIAOXIANGZUOXIANGYINGSHEZHI,DANGJINCHENGZHENZHENGFANGWENDAOCISHUJUSHI,CAIYINFAQUEYEYICHANG。

 

补充理解:

荣耀彩票代理XUNICUNCHUQISHEJISANGEGAINIAN: XUNICUNCHUKONGJIAN,CIPANKONGJIAN,NEICUNKONGJIAN

KEYIRENWEIXUNIKONGJIANDOUBEIYINGSHEDAOLECIPANKONGJIANZHONG,(SHISHISHANGYESHIANXUYAOYINGSHEDAOCIPANKONGJIANSHANG,TONGGUOmmap),BINGQIEYOUYEBIAOJILUYINGSHEWEIZHI,DANGFANGWENDAOMOUGEDIZHIDESHIHOU,TONGGUOYEBIAOZHONGDEYOUXIAOWEI,KEYIDEZHICISHUJUSHIFOUZAINEICUNZHONG,RUGUOBUSHI,ZETONGGUOQUEYEYICHANG,JIANGCIPANDUIYINGDESHUJUKAOBEIDAONEICUNZHONG,RUGUOMEIYOUKONGXIANNEICUN,ZEXUANZEXISHENGYEMIAN,TIHUANQITAYEMIAN。

 

mmapSHIYONGLAIJIANLICONGXUNIKONGJIANDAOCIPANKONGJIANDEYINGSHEDE,KEYIJIANGYIGEXUNIKONGJIANDIZHIYINGSHEDAOYIGECIPANWENJIANSHANG,DANGBUSHEZHIZHEIGEDIZHISHI,ZEYOUXITONGZIDONGSHEZHI,HANSHUFANHUIDUIYINGDENEICUNDIZHI(XUNIDIZHI),DANGFANGWENZHEIGEDIZHIDESHIHOU,JIUXUYAOBACIPANSHANGDENEIRONGKAOBEIDAONEICUNLE,RANHOUJIUKEYIDUHUOZHEXIE,ZUIHOUTONGGUOmanmapKEYIJIANGNEICUNSHANGDESHUJUHUANHUIDAOCIPAN,YEJIUSHIJIECHUXUNIKONGJIANHENEICUNKONGJIANDEYINGSHE,ZHEIYESHIYIZHONGDUXIECIPANWENJIANDEFANGFA,YESHIYIZHONGJINCHENGGONGXIANGSHUJUDEFANGFA GONGXIANGNEICUN

微笑接下来我们来讨论下物理内存:

 

 

ZAINEIHETAISHENQINGNEICUNBIZAIYONGHUTAISHENQINGNEICUNYAOGENGWEIZHIJIE,TAMEIYOUCAIYONGYONGHUTAINEIZHONGYANCHIFENPEINEICUNJISHU。NEIHERENWEIYIDANYOUNEIHEHANSHUSHENQINGNEICUN,NEIMEJIUBIXULIKEMANZUGAISHENQINGNEICUNDEQINGQIU,BINGQIEZHEIGEQINGQIUYIDINGSHIZHENGQUEHELIDE。XIANGFAN,DUIYUYONGHUTAISHENQINGNEICUNDEQINGQIU,NEIHEZONGSHIJINLIANGYANHOUFENPEIWULINEICUN,YONGHUJINCHENGZONGSHIXIANHUODEYIGEXUNINEICUNQUDESHIYONGQUAN,ZUIZHONGTONGGUOQUEYEYICHANGHUODEYIKUAIZHENZHENGDEWULINEICUN。

1.物理内存的内核映射


荣耀彩票代理 IA32架构中内核虚拟地址空间只有1GB大小(从3GB到4GB),因此可以直接将1GB大小的物理内存(即常规内存)映射到内核地址空间,但超出1GB大小的物理内存(即高端内存)就不能映射到内核空间。为此,内核采取了下面的方法使得内核可以使用所有的物理内存。


1).高端内存不能全部映射到内核空间,也就是说这些物理内存没有对应的线性地址。不过,内核为每个物理页框都分配了对应的页框描述符,所有的页框描述符都保存在mem_map数组中,因此每个页框描述符的线性地址都是固定存在的。内核此时可以使用alloc_pages()和alloc_page()来分配高端内存,因为这些函数返回页框描述符的线性地址。


2).内核地址空间的后128MB专门用于映射高端内存,否则,没有线性地址的高端内存不能被内核所访问。这些高端内存的内核映射显然是暂时映射的,否则也只能映射128MB的高端内存。当内核需要访问高端内存时就临时在这个区域进行地址映射,使用完毕之后再用来进行其他高端内存的映射。
由于要进行高端内存的内核映射,因此直接能够映射的物理内存大小只有896MB,该值保存在high_memory中。内核地址空间的线性地址区间如下图所示:

 


从图中可以看出,内核采用了三种机制将高端内存映射到内核空间:永久内核映射,固定映射和vmalloc机制。

2.物理内存管理机制
基于物理内存在内核空间中的映射原理,物理内存的管理方式也有所不同。内核中物理内存的管理机制主要有伙伴算法,slab高速缓存和vmalloc机制。其中伙伴算法和slab高速缓存都在物理内存映射区分配物理内存,而vmalloc机制则在高端内存映射区分配物理内存。
伙伴算法
伙伴算法负责大块连续物理内存的分配和释放,以页框为基本单位。该机制可以避免外部碎片。
per-CPU页框高速缓存
内核经常请求和释放单个页框,该缓存包含预先分配的页框,用于满足本地CPU发出的单一页框请求。
slab缓存
slab缓存负责小块物理内存的分配,并且它也作为高速缓存,主要针对内核中经常分配并释放的对象。
vmalloc机制
vmalloc机制使得内核通过连续的线性地址来访问非连续的物理页框,这样可以最大限度的使用高端物理内存。

3.物理内存的分配
内核发出内存申请的请求时,根据内核函数调用接口将启用不同的内存分配器。
3.1 分区页框分配器
荣耀彩票代理 分区页框分配器 (zoned page frame allocator) ,处理对连续页框的内存分配请求。分区页框管理器分为两大部分:前端的管理区分配器和伙伴系统,如下图:


管理区分配器负责搜索一个能满足请求页框块大小的管理区。在每个管理区中,具体的页框分配工作由伙伴系统负责。为了达到更好的系统性能,单个页框的申请工作直接通过per-CPU页框高速缓存完成。
该分配器通过几个函数和宏来请求页框,它们之间的封装关系如下图所示。


这些函数和宏将核心的分配函数__alloc_pages_nodemask()封装,形成满足不同分配需求的分配函数。其中,alloc_pages()系列函数返回物理内存荣耀彩票代理框描述符,__get_free_pages()系列函数返回内存的线性地址。
3.2 slab分配器
slab 分配器最初是为了解决物理内存的内部碎片而提出的,它将内核中常用的数据结构看做对象。slab分配器为每一种对象建立高速缓存。内核对该对象的分配和释放均是在这块高速缓存中操作。一种对象的slab分配器结构图如下:


可以看到每种对象的高速缓存是由若干个slab组成,每个slab是由若干个页框组成的。虽然slab分配器可以分配比单个页框更小的内存块,但它所需的所有内存都是通过伙伴算法分配的。
slab高速缓存分专用缓存和通用缓存。专用缓存是对特定的对象,比如为内存描述符创建高速缓存。通用缓存则是针对一般情况,适合分配任意大小的物理内存,其接口即为kmalloc()。
3.3 非连续内存区内存的分配
内核通过vmalloc()来申请非连续的物理内存,若申请成功,该函数返回连续内存区的起始地址,否则,返回NULL。vmalloc()和kmalloc()申请的内存有所不同,kmalloc()所申请内存的线性地址与物理地址都是连续的,而vmalloc()所申请的内存线性地址连续而物理地址则是离散的,两个地址之间通过内核页表进行映射。
vmalloc()的工作方式理解起来很简单:
1).寻找一个新的连续线性地址空间;
2).依次分配一组非连续的页框;
3).为线性地址空间和非连续页框建立映射关系,即修改内核页表;
荣耀彩票代理 vmalloc()的内存分配原理与用户态的内存分配相似,都是通过连续的虚拟内存来访问离散的物理内存,并且虚拟地址和物理地址之间是通过页表进行连接的,通过这种方式可以有效的使用物理内存。但是应该注意的是,vmalloc()申请物理内存时是立即分配的,因为内核认为这种内存分配请求是正当而且紧急的;相反,用户态有内存请求时,内核总是尽可能的延后,毕竟用户态跟内核态不在一个特权级。

【简单命令演示】Linux下怎样增加虚拟内存?

1、打开终端,切换到root用户,输入:free -m查看内存状态
[root@lxt lxt]# free -m
total used free shared buffers cached
Mem: 498 357 141 0 27 162
-/+ buffers/cache: 167 331
Swap: 1023 0 1023


2、输入df -B M(或df -m)查看各分区当前使用情况
[root@lxt lxt]# df -B M
文件系统 1M-块 已用 可用 已用% 挂载点
/dev/mapper/vg_lxt-lv_root
12875M 4059M 8162M 34% /
/dev/sda7 194M 14M 170M 8% /boot
tmpfs 250M 1M 249M 1% /dev/shm
(fdisk -l可查看磁盘分区情况)

3、选择一个较大的分区,建立分区文件:
[root@lxt lxt]# dd if=/dev/zero of=/swapadd bs=1024 count=524288
524288+0 records in
524288+0 records out
536870912 bytes (537 MB) copied,13.0709 秒,41.1 MB/秒
以上命令在根目录新建一个名为swapadd,大小为512M的虚拟内存文件

4、移动该文件到空间较大的其他分区:
[root@lxt lxt]# mkdir /mnt/swap
[root@lxt /]# mv swapadd /mnt/swap

5、执行以下命令启用虚拟内存并重启电脑
[root@lxt /]# mkswap /mnt/swap/swapadd
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=a5c8b651-6f64-4414-bb5f-580b742acfce
[root@lxt /]# swapon /mnt/swap/swapadd
查看内存:
[root@lxt /]# free -m
total used free shared buffers cached
Mem: 498 492 6 0 15 302
-/+ buffers/cache: 174 323
Swap: 1535 0 1535

6、如果不需要使用新增的虚拟内存,则输入:
swapoff -v /mnt/swap/swapadd

 

【作者推荐】野狗 - 国内领先的实时后端云 : http://www.wilddog.com/

Tag标签:      
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规