Linux【1】-----虚拟内存

参考:小林coding

虚拟内存存在的目的?

为了能够同时运行多个进程同时进程之间互不干扰

虚拟地址通过MMU找到物理地址

物理内存怎么映射的?

物理内存的映射方法主要有两种,内存分段和内存分页

内存分段

把程序的不同区,分段映射

会存在问题:内存碎片、内存交换效率低

内存碎片很好理解,解决办法是:

先写入硬盘,再读回内存,位置都是紧贴在一起

内存交换效率低

每次内存交换都要交换一个程序的段,会导致交换效率低

内存分页

Linux下一个页大小是4KB

页表存储在内存中,MMU将虚拟内存转成物理内存地址

流程:

  • 进程访问的虚拟地址在页表内查不到,此时会出现缺页异常
  • 进入系统内核空间分配物理内存,更新进程页表

内存不够的情况:

  • 会把最近没有使用的页内存释放,写入硬盘(换出)
  • 需要时再加载回来(换入)

内存分页映射

如果只用一个页表,那么在进程增多时,页表的大小会特别大

多级页表

多级页表的一级页表可以覆盖整个内存空间

如果某个一级页表项没有被用到,二级页表就不会被创建

需要时才会创建。

64位操作系统的页表分级:

全局页目录项PGD

上层页目录项PUD

中间页目录项PMD

页表项PTE

TLB

页表cache

把最常访问的页表存储到访问速度更快的cache

称为页表缓存,快表

CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的⻚表。

段页式内存管理

先划成段,再从段里划成页

Linux内存管理

linux使用页式内存管理

虚拟内存地址分为内核空间用户空间

所有进程的虚拟地址中的内核空间地址指向同一物理内存空间

用户空间

分为:

  • 程序文件段,.text
  • 已初始化数据段,.data
  • 未初始化数据段,.bss
  • 堆段
  • 文件映射段
  • 栈段
相关推荐
日取其半万世不竭7 小时前
用 Portainer 可视化管理 Docker:容器再多也不用背命令了
运维·docker·容器
2023自学中7 小时前
Linux 图形系统
linux
kirs_ur8 小时前
ECC & LDPC — SSD 的数据卫士
服务器·数据库·性能优化
mounter62510 小时前
高性能网络技术演进与创新探索:RDMA、eBPF/XDP 深度解析及 LSF/MM/BPF 2023 专题演讲
linux·ebpf·linux kernel·kernel·rdma·xdp
动恰客流统计10 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
名字还没想好☜10 小时前
Python itertools 实战:用 groupby、chain、islice 优雅处理大数据流
linux·windows·python·迭代器·itertools
ziguo112213 小时前
深入浅出 C/C++ 数据类型:从入门到踩坑
linux·c语言·c++·windows·visual studio
无垠的广袤13 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
会编程的土豆13 小时前
MySQL 入门:库、表、行、主键是什么
linux·数据库·网络协议·http
砍材农夫14 小时前
运维|devops|jenkins构建应用发布
运维·jenkins·devops