malloc背后的系统知识

为什么需要虚拟内存

1、物理内存不安全:操作系统的地址直接暴露给用户程序,用户程序可以破坏操作系统。
2、同时运行多个程序比较困难:多个用户程序如果都直接引用物理地址,很容易互相干扰。只能通过不断交换物理内存和磁盘来保证物理内存某一时间自由一个程序在运行,但麻烦。
3、用户程序大小受限:受制于物理内存大小。

虚拟内存

虚拟内存的基本思想是:每个程序拥有独立的地址空间(也就是虚拟内存地址,或者称作虚拟地址),互不干扰。地址空间被分割成多个块,每一块称作一页(page),每一页有连续的地址范围。虚拟地址的页被映射到物理内存(通过 MMU,Memory Management Unit),但是并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将确实的部分装入物理内存。

在这里插入图片描述
虚拟内存大小:一般是和 CPU 字长相关,比如 32 位对应的虚拟地址空间大小为:0 ~ 2^31

MMU:CPU 将虚拟地址发送给 MMU,然后 MMU 将虚拟地址翻译成物理地址,再寻址物理内存。那么虚拟地址和物理地址具体是怎么映射的呢?完成映射还需要另一个重要的数据结构的参与:页表(page table)。
页表项过多时:倒排页表、多级页表

malloc 和物理内存有关系吗?

可以说没关系,malloc 申请的地址是线性地址,申请的时候并没有进行映射。访问到的时候触发缺页异常,这个时候才会进行物理地址映射。malloc申请的是虚拟内存,不是物理内存。虚拟内存是系统为每个进程分配的独立内存空间,与物理内存大小无实际关系。

引入虚拟存储技术的好处

可在较小的可用内存中执行较大的用户程序;
可在内存中容纳更多程序并发执行;
不必影响编程时的程序结构(与覆盖技术比较);
提供给用户可用的虚拟内存空间通常大于物理内存。

1.每个进程都有各自独立的4G 字节的虚拟地址空间。4G的进程空间分为两部分,0~3G-1 为用户空间,3G~ 4G-1 为内核空间。
2.用户程序中使用的都是虚拟地址空间中的地址,永远无法直接访问实际物理地址。
3.虚拟内存到物理内存的映射由操作系统动态维护。
4.虚拟内存一方面保护了操作系统的安全,另一方面允许应用程序使用比实际物理内存更大的地址空间。
5.用户空间中的代码不能直接访问内核空间中的代码和数据,但是可以通过系统调用进入内核态,间接地与内核交互。
6.对内存的越权访问,或访问未建立映射的虚拟内存(野指针、不在映射表中),将会导致段错误。

  1. 用户空间对应进程,进程一切换,用户空间随即变换。
    内核空间由操作系统内核使用,不会随进程切换而变化。
    内核空间由内核根据独立且唯一的页表init_mm.pgd 进行映射,而用户空间的页表则每个进程一份。
  2. 每个进程的内存空间完全独立,因此在不同进程之间交换虚拟地址毫无意义。
    9.虚拟内存到物理内存的映射,以页(4096字节)为单位

为什么增加物理内存,系统能够跑的更流畅呢?

一部分进程在物理内存中运行完后,将会进行下一部分的加载和运行,增加物理内存,可以使得加载速度更快,等待进程更少,使得系统运行更流畅

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值