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垃圾回收机制

[新星计划] Python内存管理 | 引用计数垃圾回收内存池机制

[新星计划] Python内存管理 | 引用计数垃圾回收内存池机制

[新星计划] Python内存管理 | 引用计数垃圾回收内存池机制

Python 垃圾回收机制