抽象的操作系统(五) --- 内存

来源:互联网 发布:金融大数据分析 编辑:程序博客网 时间:2024/06/05 13:29
        内存管理,尤其是对于C/C++语言来说, 非常重要。说到内存,大家想到的往往是内存泄露,越界操作等,这些也是常见的导致程序出现问题的原因。但是,内存的事儿,远远不止这些,如何更好的管理内存,使用内存,多进程的时候内存怎么用,都需要好好的探讨。
      1). 内存的分类。从硬件的角度来讲,有寄存器,一级(二级)缓存,主存,辅存,是一个层次的结构,越靠前的内存速度越快,价格却越昂贵。从软件的角度来讲,内存是可以访问的一个存储空间。只是有的速度快点但小一点,有的慢点但是大一些,至多也就知道一个寄存器变量(C有register关键字)罢了。更多的时候,编译程序的时候除了堆上的内存分配是程序自身操作的, 编辑器帮做了大部分情况下的内存管理。
      2). 内存管理算法。比较熟知的有两个算法,最佳适应算法与最先适应,它们各自有各自的特点。比较复杂的应用一般都有自己的内存管理,比较突出的好处是可以更快的定位内存问题,以及能够提高内存分配释放的性能。有些平台本身提供内存回收功能,在这种平台上做开发,在遇到一些特别的内存问题的时候,需要基于它的机制原理来排查问题。

      3). 内存泄露与越界操作。内存泄露是指Malloc的内存使用完毕后没有Free导致的一种现象,最终会导致内存不足。防止内存泄露的关键原则是谁申请谁释放。越界操作是指修改了不该被修改的内存数据,它会产生莫名其妙的错误,很容易引起程序崩溃,野指针与边界操作是最经常引起越界操作的情况,要时刻注意。

      4). 内存访问。不知道大家是否遇到过这样的问题,INT32的整数被安排在了奇数地址,读取的时候出现了问题。这是为什么,这个跟CPU的位数与读取数据的方式有关。一般要字节对齐,也许大家听说过结构体的字节对齐,其实对于多字节的基本数据类型来说,也要注意地址的安排。   

     在抽象操作系统这个话题下,讲解的内存相关的知识比较有限。以后的话题中,会详细讲解编译器相关,复合数据类型相关的知识。