内存管理面试问题

1. 栈和堆的区别

  • 栈的空间由操作系统自动分配和释放,堆上的空间由程序分配和释放。
  • 栈空间一般比较有限,用于存放函数调用过程的参数,局部变量。
  • 堆空间一般比栈空间大很多,分配内存速度会比栈空间慢,而且容易产生内存碎片。
  • 一般在多线程中,栈空间是线程私有,堆空间可以是线程私有,也可以是线程共享。

2. 什么是虚拟内存

  • 虚拟内存是操作系统内核为了对进程地址空间进行管理而精心设计的一个逻辑意义上的内存空间概念。
  • 我们程序编译后形成的地址其实都是这个虚拟内存空间中的地址。因为这时候程序还没有运行,无法映射到实际物理地址。
  • 为了能够让程序在物理机器上运行,操作系统通过页表将虚拟内存空间和物理内存空间关联起来。并通过MMU来实现逻辑地址到物理地址的转换。
  • 虚拟内存空间大只能表示程序运行过程中可访问的空间比较大,不代表物理内存空间占用也大

3. 什么是常驻内存

  • 常驻内存是指那些被映射到进程虚拟内存空间的物理内存。
  • 进程的常驻就是进程实实在在占用的物理内存。
  • 一般我们所讲的进程占用了多少内存,其实就是说的占用了多少常驻内存而不是多少虚拟内存。因为虚拟内存大并不意味着占用的物理内存大。

4. 什么是共享内存

  • 它表示的是进程占用的共享内存大小
  • 其实我们写的程序会依赖于很多外部的动态库。这些动态库在内存中仅仅会保存/映射一份,如果某个进程运行时需要这个动态库,那么动态加载器会将这块内存映射到对应进程的虚拟内存空间中。多个进程之间通过共享内存的方式相互通信也会出现这样的情况,这么一来,就会出现不同进程的虚拟内存空间会映射到相同的物理内存空间。
  • 这部分物理内存空间其实是被多个进程所共享的,所以我们将他们称为共享内存

5. 什么是mmap

  • mmap是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现了文件磁盘地址进程虚拟地址的映射关系。
  • 实现映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。
  • mmap内存映射原理:
    1. 进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域
    2. 调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系
    3. 进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝
  • mmap优点总结
    • 对文件的读取操作跨过了页缓存,减少了数据的拷贝次数,用内存读写取代I/O读写,提高了文件读取效率。
    • 实现了用户空间和内核空间的高效交互方式。两空间的各自修改操作可以直接反映在映射的区域内,从而被对方空间及时捕捉。
    • 提供进程间共享内存及相互通信的方式。不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。

6. 内存映射有哪几种?

  • 私有匿名映射:常用于内存分配。
  • 共享匿名映射:常用于父子进程共享内存
  • 私有文件映射:常用于加载动态库
  • 共享文件映射:常用于内存映射IO,进程间通信

7. free和available的区别

  • free 是真正尚未被使用的物理内存数量。
  • available 是应用程序认为可用内存数量,available 约等于 free + buffer + cache
  • Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。

8. buffer和cache的区别

  • buffer(缓冲)是为了提高内存和硬盘(或其他I/0设备)之间的数据交换的速度而设计的。
  • cache(缓存)是为了提高cpu和内存之间的数据交换速度而设计,也就是平常见到的一级缓存、二级缓存、三级缓存。

9. 什么是MMU

  • mmu是个物理组件,位于CPU内部
  • 功能一:管理虚拟存储器、物理存储器的控制线路,实现虚拟地址到物理地址的映射。
  • 功能二:修改内存的访问级别。
  • MMU会查找页表来确定VA(虚拟地址)应该映射到什么PA(物理地址)。
  • CPU每次执行访问内存的指令都会自动引发MMU做查表和地址转换操作。地址转换操作由硬件自动完成,不需要用指令控制MMU去做。

10. 操作系统如何与MMU配合实现内存保护机制

  • 处理器一般会有用户模式和特权模式之分。
  • 操作系统可以在页表中设置每个页表项访问权限,有些页表项不可以访问,有些页表项只能在特权模式下访问。有些页表项在用户模式和特权模式都可以访问
  • 同时,访问权限又分为可读、可写和可执行三种。
  • 这样设定之后,当CPU要访问一个VA(virtual address)时,MMU会先检查CPU当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据还是取指令执行。
    • 如果与操作系统设定的权限相符,则运行访问,把VA转换为PA
    • 否则不允许执行,产生异常

11. 什么是TLB

  • 慢表(Page):页表、段表存放在主存中,收到虚拟地址后要先访问主存,査询页表、段表,进行虚实地址转换。
  • 快表(TLB):提高变换速度→用高速缓冲存储器存放常用的页表项
  • 如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。

12. 进程和线程的内存地址空间的区别

  • 每个进程都会有自己的独立的地址空间,一个进程下的所有线程共享进程的地址空间。
  • 每个线程都有自己的堆栈空间,但是线程堆栈的地址是按照进程地址空间统一编址的,所以每个线程堆栈地址空间是不会重复的,即:每个线程堆栈的地址空间不是从0开始编址,而是按整个进程地址空间统一编址的。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值