赤铸的个人空间 https://passport2.21ic.com/?6200 [收藏] [复制] [RSS]

日志

软件工程基础系列(1)

已有 776 次阅读2013-11-22 02:20 |个人分类:软件工程|系统分类:芝麻流水帐| 软件工程, 南方人, 博客, 教学, 课程

声明:
1. 本系列为有关课程课堂内容补充及答疑,老手高手们望掩面而过,也欢迎膀胱……哦,旁观,南方人,分不大清……

2. 禁止回复、评论。实在憋不住的,可以到论坛的新手园地里发贴评论,或帮我更好地解答问题,我会定期去看。

3. 感谢21IC,感谢所有的……IC。




第一期:由动态分配谈起

起因——不会用malloc/free,包括:不会使用这两个函数、不知道为什么要用这两个怪物、或者写下面的代码:

struct NODE {

VALUE value;

struct NODE * next;

...

} node;

node.value = (VALUE) malloc(size);

node.next = ...malloc ...



分析:计算机内存管理方面的知识不系统。不理解堆(heap)的人,估计也没有真正理解栈(Stack)。



解释:一切在于内存的有限性!虽然不再是560K内存的饥荒年代,但 Memory 像 Money 一样永远是不够用的。如果内存无限,我们可以为程序运行过程中“曾经用过”的每一个变量赋予专用的、永恒的存储器空间。如同拥有几万套房的人不需要垃圾桶、不需要冲水马桶一样……换呗。程序里的多数变量,用完之后跟粑粑一样。而存储器就像马桶一样。

注意,我这里首先区分了两个概念:“变量”和“存储器”。这两个词的关系如同 Shit 和马桶的关系,或者 Food 和饭碗的关系,或者 内容 和 容器 的关系。

有限的容器与无限的内容,这就是根本矛盾。所以需要内存管理。



Stack 正是解决这个的。现代 CPU 一般直接提供 Stack,优点是速度快成本低,缺点在于过于简单机械,不适应更复杂的情况。它只能随着函数(子程序)的调用-退出而进行分配-释放,不灵活。当有变量的尺寸很大时,空间利用率也很差。所以 Stack 通常只存放函数内部用的,尺寸小的变量。



Heap 解决了这些问题,它很像超市门口的自动存包处:我们按按钮(malloc)申请空间,系统为我们分配一个空闲的格子(内存块),给我们一个凭条(指针),我们把物品(数据)放进格子(给内存单元赋值),锁门,用完根据凭条找到格子,刷条码(释放,告诉系统这个格子我们用完了),开锁,取出物品,完事。



这样的好处是,什么时候分配、什么时候释放基本不受函数调用的限制。函数已逝,但它从巨大的 Heap 里分配并留下的巨大或较大的内存块却可以一直存活下去。A 函数分配的,可以很久以后留给 B 函数释放。



注意,程序里一般没有锁门、开锁对应的动作。与“释放”对应的,也不是取出物品。现实中我们取走存放的物品,存储器里的变量是拿不走的。程序里只是“登记”一下:这个内存块用完了。



所以内存管理无非是:

(1)保证你用着的柜子别人不能用

(2)保证你用完的柜子别人还能用







路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)