操作系统内存管理机制、虚拟内存、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代结点个数达到一定值的时候进行分代回收。