6-3 操作系统内存管理机制与Python垃圾回收面试题
Posted WinvenChang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6-3 操作系统内存管理机制与Python垃圾回收面试题相关的知识,希望对你有一定的参考价值。
一、什么是分页机制
操作系统为了高效管理内存,减少碎片,就有了将逻辑地址和物理地址分离的内存分配管理方案
1.程序的逻辑地址划分为固定大小的页(Page
)
2.物理地址划分为同样大小的帧(Frame
)
3.通过页表对应逻辑地址和物理地址
如下图所示:
二、什么是分段机制?
分段是为了满足代码的一些逻辑需求
1.数据共享,数据保护,动态链接等
2.通过段表实现逻辑地址和物理地址的映射关系
3.每个段内部是连续内存分配,段和段之间是离散分配的。
如下图所示:
三、分页和分段的区别
1.页是出于内存利用率的角度提出的离散分配机制
2.段是出于用户角度,用于数据保护、数据隔离等用途的管理机制
3.页的大小是固定的,操作系统决定;段大小不确定,用户程序决定
四、什么是虚拟内存
通过把一部分暂时不用的内存信息放到硬盘上
1.局部性原理,程序运行时候只有部分必要的信息装入内存
2.内存中暂时不需要的内容放到硬盘上
3.系统似乎提供了比实际内存大得多的容量,称之为虚拟内存
五、什么是内存抖动(颠簸)
本质是频繁的页调度行为
1.频繁的页调度,进程不断产生缺页中断
2.置换一个页,又不断再次需要这个页
3.运行程序太多;页面替换策略不好。终止进程或者增加物理内存
六、Python
的垃圾回收机制原理?
Python
无需我们手动回收内存?它的垃圾回收是如何实现的呢?
1.引用计数为主(缺点:循环引用无法解决)
2.引入标记清除和分代回收解决引用计数的问题
3.引用计数为主+标记清除和分代回收为辅
如下图所示:
代码演示:
import sys
a = [1, 2] # 声明 a 时,它的引用计数 1
count = sys.getrefcount(a) # 调用函数时,a 的引用计数 增加了 1
print(count) # 2
# 下面是比较诡异的,暂时可以不用管,了解就行
b = 1
b_count = sys.getrefcount(b)
print(b) # 2900 这里的数会大于 2 ,这跟python底层实现有关,python底层实现的 小整数对象池,内部可能会有很多引用 1 的对象
悲剧:引用计数无法解决循环引用问题,因为两个对象互相引用之后引用计数无法归零。
标记清除:从根对象遍历找到可达的点,可达的点全部标绿,不可达的点全部标灰,标灰的点则表示已经没有对象引用它们了,可以清除它们
分代回收:
python
将对象的生命周期分为三代,分别是第 0
代,第 1
代跟第2
代。每一代都使用双向列表标记对象,每隔一段时间,python
会对每一代对象进行标记回收。第0
代没有被标记回收的会被转移到第 1
代,同理,第1
代也会被转移到第 2
代,这就称为分代回收。
代码演示:
import gc
print(gc.get_threshhold()) # (700, 10, 10) 表示第0代的阈值,第1代的阈值和第2代的阈值
以上是关于6-3 操作系统内存管理机制与Python垃圾回收面试题的主要内容,如果未能解决你的问题,请参考以下文章
[新星计划] Python内存管理 | 引用计数垃圾回收内存池机制
[新星计划] Python内存管理 | 引用计数垃圾回收内存池机制