Linux内核之内存4: 内存与I/O的交换

1. page cache

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cp30sAtT-1598500337083)(media/001f52b3b3fc1aa42510df4b04ext_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1dGVyZXNh,size_16,color_FFFFFF,t_70#pic_center)

Linux读写文件过程;

read:用户进程调用read命令,内核查询读取的文件内容是否在内存(内核page
cache)中,若该页内容缓存在内存中,直接读取返回给用户进程;若缓存不存在,则启动BIO,从硬盘读取该页面到内存,再送给用户进程;

write过程:比如往某文件5K处写入10byte,内核先查询该页是否在内存缓存(内核page
cache),不在,同read,从硬盘读取该页4~8K到内存,再往5k处写入10byte,标明该页为脏页;

写回磁盘时机,则由内存管理的BIO机制决定。

Linux读写文件两种方式:read/write,mmap

相同点:都经过page cache中介操作磁盘文件;

区别

read/write:有一个用户空间和内核空间的拷贝过程;

mmap:指针直接操作文件映射的虚拟地址,省略了用户空间和内核空间的拷贝过程。

缺点是,很多设备不支持mmap,比如串口,键盘等都不支持。

2.free命令的详细解释

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j0UD2geb-1598500337086)(media/d7c58c6669abe9c2ae39efcd468d04b8.png)]

total: 系统总的内存

第一行used: 所有用掉的内存,包括app,kernel,page cached(可回收);

第一行free: =total-used

第一行buffers/cached:page cached内存

第二行free = 第一行free+buffers+cached

114380=31040+8988+74352

第二行used = 第一行used-buffers-cached

40072=123412-8988-74352

第一行used是从buddy的角度,统计所有用掉的内存(包括page cached);

第二行uesed,是从进程角度,包括app/kernel/ , 不含page cached(可回收)。

cached/buffer区别:

cached:通过文件系统访问;

buffer:裸地址直接访问,存放文件系统的元数据(组织数据的数据);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-75UnHokw-1598500337088)(media/00b095ccc61826215ebdd013573e4af7.jpg)]

新版free,去掉了buffer/cached的区别,加入一个available,预估可用内存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EcyyrOZ6-1598500337090)(media/c67661d0f87773fc26d75b7801818d4d.png)]

在cat /proc/meminfo也可以看到预估项MemAvailable

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GwaOeJwV-1598500337091)(media/823575961fbdd036cdc41215e2b66bd6.png)]

查看实现方法git grep MemAvailable

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vK5KKmsO-1598500337093)(media/f0b344afe4225111840d2267f7ed17f7.png)]

vim  fs/proc/meminfo.c 

搜MemAvailable,实现函数si_mem_available

git grep  si_mem_available	
vim mmpage_alloc.c-- >long si_mem_available(void)

3.read、write和mmap

mmap映射文件过程,实际上在进程创建一个vma,映射到文件,当真正读/写文件时,分配内存,同步磁盘文件内存。
在这里插入图片描述

其本质是虚拟地址映射到page cached, page cached再跟文件系统对应。
在这里插入图片描述

这里的page cached是可以回收的。

4.file-backed的页面和匿名页

在一个elf文件中,代码段的本质,就是对应page cached;

真正执行到的代码,才会从磁盘读入内存,并且还可能被踢走,下次再执行,可能需要重新从磁盘读取。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FaTQXZgl-1598500337095)(media/da5bba8fb4fd605f916d4077f34ea1fa.jpg)]

Reclaim可回收的
有文件背景的页面,叫file-back page, 可回收
**匿名页:anon, 不可回收,常驻内存;

pmap pid

Anon: stack、heap、 CoW pages
File-backed:代码段,映射文件,可回收。

5.swap以及zRAM

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GB4CP4so-1598500337096)(media/c46a8794bb6c17c59394f6961a97ef26.png)]

案例,当同时运行word和qq,word需要400M匿名页,qq需要300M匿名页,而物理内存只有512M,如何运行呢,此时伪造一个可swap的文件,供anon匿名页交换。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SQMBNkD-1598500337096)(media/4b6061318947781521a8e2f3c9c92165.jpg)]

在内核配置CONFIG_SWAP,支持匿名页swap,不配置,普通文件swap依然支持;

SWAP分区,对应windows的虚拟内存文件pagefile.system。

6.页面回收和LRU

局部性原理:最近活跃的就是将来活跃的,最近不活跃的,以后也不活跃。

包括时间局部性,空间局部性。

LRU:Least Recently Used最近最少使用,是一种常用的页面置换算法,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFE9HRXe-1598500337097)(media/60e4e7ab194854481a886ec57e98589a.png)]

真实统计过程,无关进程,只统计页面的活跃度;

案例,开启浏览器chrome;长期不使用,运行oom.c消耗掉系统所有内存,再去第一次打开网页时,速度会很慢,因为需要重新加载被踢出去的不活跃页面。

**sudo swapoff –a**

**echo 1 > /proc/sys/vm/overcommit_memory**

**cat /proc/pid/smps >1**

**./oom.out**

**cat /proc/pid/smaps >2**

**meld 1 2**

可见命中的部分page cached,被LRU踢走。

CPU>>mm>>io

嵌入式设备,一般不用swap,不使能swap,因为:

1.嵌入式磁盘速度很慢;

2.FLASH读写寿命有限;

zRAM

在物理内存划分一部分,作为“swap”分区,用来做页面回收置换,利用强大CPU算力换取更大内存空间;
在这里插入图片描述

内核使能swap

echo $((48*1024*1024)) > /sys/block/zram0/disksize

打开swap分区:

swapon –p 10 /dev/zram0

cat /proc/swaps

swapoff –a 不能关掉文件背景页面。

不带pagecached的IO, direct IO。 在用户态根据业务特点做cached.

类似于CPU跳过cache,直接访问mem;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值