操作系统内存管理机制、虚拟内存、python垃圾回收机制
什么是分页机制?
定义:逻辑地址和物理地址分离的内存分配管理方案
- 程序逻辑地址划分为固定大小的页(Page)
- 物理地址划分为同样大小的帧(Frame)
- 通过页表对应逻辑地址和物理地址
分段机制
目的: 分段是为了满足代码的逻辑需求(更具体的建议去搜索下)
- 数据共享,数据保护,动态链接等。
- 通过段表实现逻辑地址和物理地址的映射关系。
- 每个段内部是连续的内存分配,段和段之间是离散分配的。
分页和分段的区别
- 页是出于内存利用率的角度提出的离散分配机制(为了更高效的使用内存,减少内存碎片)。
- 段是出于用户角度,用于数据保护、数据隔离等用途的管理机制。
- 页的大小是固定的,由操作系统决定; 段的大小是不固定的,由用户程序来决定。
什么是虚拟内存。
定义:把一部分暂时不用的内存信息存放在硬盘上。
- 局部性原理,程序运行的时候只有部分必要的信息装入内存。
- 内存中暂时不需要的内容放在硬盘上。
- 系统似乎提供了比实际内存大的多的内存容量,称之为虚拟内存。
什么是内存抖动(颠簸)
定义: 本质是频繁的页调度行为
- 频繁的页调度,进程不断产生缺页中断。
- 置换(放到虚拟内存中)一个页后,又不断地需要这个页。
- 运行程序太多;页面替换策略不好。 终止进程或者增加物理内存。
python的垃圾回收机制原理。
- 只要使用了引用计数(缺点:循环引用无法
- 引用计数:python的C语言实现的时候,每个对象都有几个字段,其中一个字段ref代表的就是这个对象的引用个数
-
a = [1] # 这时列表对象[1]的ref值是1
b = a # [1]的ref值变为了2
a = [1,2,3] # 这个时候[1]的ref变为了1
print(b) # 结果:[1]
# 此时只有[1]只有b一个引用 del(b) # 并不是消除对象,只是减少对象的引用计数。 # print(b) 报错,b未定义 # [1]的ref变为了0, 进行回收,下面用ipython展示一下
-
1 In [1]: import sys 2 3 In [2]: a = [1,2] 4 5 In [3]: sys.getrefcount(a) # 这个函数调用也是一个引用。 6 Out[3]: 2 7 8 In [4]: b = 1 9 10 In [5]: sys.getrefcount(1) # python有一个小整数对象池,内部实现引用了很多1这个对象 11 Out[5]: 3337
循环引用,下面的代码,如果只有引用计数的话,a和b的引用一直是1,不能被消除。
-
a = [1] b = [2] a.append(b) b.append(a) del a del b
标记清除和分代回收解决引用计数(更详细的搜索一下吧)
- 标记清除简单说就是从根对象往下迭代查询,可以达到的对象,和不可达到的的对象分别标记,比如上面的代码, a和b就是两个孤立的对象。 删除孤立的对象。
- 分代回收: python对象对象有三代生命周期,0,1,2,每一代都是一个双向链表,第0代删除了一些结点(没有用到)以后,生成的新的结点,形成第1代,以此类推,通常是当第0代结点个数达到一定值的时候进行分代回收。