C语言深处

    返回首页    发表留言
本文作者:李德强
          第一节 段页式存储
 
 

        严格来讲,这部分内容应属于操作系统原理的知识,但我们在深入学习C语言的同时也要理解这部分知识。

        当我们编译并运行一个C程序时,操作系统就会为这个C程序分配相关的内存空间,并将此程序载入到内存中运行。一般来说操作系统会为程序分配两个段:代码段与数据段。

  • 代码段:用于存放程序运行代码,当同一个程序在一个时间段内被运行多次时(多个进程),操作系统通常为多个进程共享内存中同一段代码。
  • 数据段:用于存放程序运行时的数据支持。包括栈和堆。C语言函数的局部变量和参数传递使用栈,而malloc()和realloc()动态申请内存空间则使用堆。

        CPU在32位内存寻址模式下最多可以使用4G大小的内存空间,而操作系统会让多个程序在运行时分别具有独立的4G内存空间。例如:运行一个显示HelloWorld!的C程序,在这个程序运行的同时,操作系统中还运行着其它程序,如Vim文本编辑器、MPlayer多媒体播放器和Chrome网页浏览器。这4个程序在操作系统中分别为4个独立的进程,而这4个进程都有独立的4G内存空间。如下图:


 

        每个程序在运行时都拥有4GB大小的独立逻辑内存,但物理内存的总大小只有4GB,当多个程序在运行时是操作系统是如何为其分配内存的呢?答案是分页。操作系统在为进程分配内存时并不是一次性将进程所需要的所有内存完全分配的,而是先分配一部分,当进程需要使用更大的内存空间时再为其分配内存空间。通常操作系统将内存按4KB来分页,4G内存则被分为1M个页面,当程序A需要运行时,操作系统会为其先分配一部分内存页,例如200个页面。而与此同时又有一个程序B需要运行,操作系统同样也为其分配一部分内存页面,例如800个页面。随着大量的程序在操作系统中运行,可用的空内存页面也越来越少,当物理内存都被分配了之后,操作系统就会尝试将一些程序暂时不使用的页面数据复制到外存中,再将此页面分配给相关进程。也就是说操作系统会在内存页面不足时将暂时不使用的内存页中的数据暂时交换到外存,而当进程使用时再将其换回。这一个内存页面交换机制就是很多类Unix操作系统中的交换分区,在Windows操作系统中称做虚拟内存。所以对于普通进程而言,当物理内存空间不足时,操作系统会将部分内存数据交换到外存,所以普通程序可以独立拥有4GB的内存空间。

        处于32位保护模式下的CPU会根据进程所使用的内存空间做校验,当进程试图使用超过段范围的内存地址时将会触发一般保护错误,此时再由操作系统来中止此非法访问内存的进程。

        本节内容只是简单的介绍操作系统为进程分配内存的原理,有兴趣的读者可参见本站的另一个教程《跟我一起写操作系统》来学习内存分配的原理及实现过程。

        

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号