background image

    2.2  变量必须初始化吗?
    2.3  什么是页抖动(pagethrashing)?
    7.20 什么是栈(stack)?
    7.21 什么是堆(heap)?

    

2.2  变量必须初始化吗?

    不。使用变量之前应该给变量一个值,一个好的编译程序将帮助你发现那些
还没有被给定一个值就被使用的变量。不过,变量不一定需要初始化。在函数
外部定义的变量或者在函数内部用 static 关键字定义的变量(被定义在数据段
中的那些变量,见 2.1)在没有明确地被程序初始化之前都已被系统初始化为
0 了。在函数内部或程序块内部定义的不带 static 关键字的变量都是自动变量,
如果你没有明确地初始化这些变量,它们就会具有未定义值。如果你没有初始
化一个自动变量,在使用它之前你就必须保证先给它赋值。
    调用 malloc()函数从堆中分配到的空间也包含未定义的数据,因此在使用
它之前必须先进行初始化,但调用 calloc()函数分配到的空间在分配时就已经
被初始化为 0 了。

  

    

2.3  什么是页抖动(pagethrashing)?

    

有些操作系统(如 UNIX 和增强模式下的 Windows)使用虚拟内存,这是一

种使机器的作业地址空间大于实际内存的技术,它是通过用磁盘空间模拟
RAM(random—access memory)来实现的。
    在 80386 和更高级的 Intel CPU 芯片中,在现有的大多数其它微处理器(如
Motorola 68030,sparc 和 Power PC)中,都有一个被称为内存管理单元
(Memory Management Unit,缩写为 MMU)的器件。MMU 把内存看作是由

一系列 页(page)”组成的来处理。一页内存是指一个具有一定大小的连续的内
存块,通常为 4096 或 8192 字节。操作系统为每个正在运行的程序建立并维
护一张被称为进程内存映射(Process Memory Map,缩与为 PMM)的表,表
中记录了程序可以存取的所有内存页以及它们的实际位置。
    每当程序存取一块内存时,它会把相应的地址(虚拟地址,virtualaddress)
传送给 MMU,MMU 会在 PMM 中查找这块内存的实际位置(物理地址,
physical address),物理地址可以是由操作系统指定的在内存中或磁盘上的
任何位置。如果程序要存取的位置在磁盘上,就必须把包含该地址的页从磁盘
上读到内存中,并且必须更新 PMM 以反映这个变化(这被称为 pagefault,即
页错)。
    希望你继续读下去,因为下面就要介绍其中的难点了。存取磁盘比存取
RAM 要慢得多,所以操作系统会试图在 RAM 中保持尽量多的虚拟内存。如果
你在运行一个非常大的程序(或者同时运行几个小程序),那么可能没有足够的
RAM 来承担程序要使用的全部内存,因此必须把一些页从 RAM 中移到磁盘上
(这被为 pagingout,即页出)。    
    操作系统会试图去判断哪些页可能暂时不会被使用(通常基于过去使用内存
的情况),如果它判断错了,或者程序正在很多地方存取很多内存,那么为了
读入已调出的页,就会产生大量页错动作。因为 RAM 已被全部使用,所以为