写完 这个例子,花费了 我不少时间,大部分时间 花费在 调试 内存问题上。
例如在销毁十字链表时,多次释放节点空间,造成 _CrtIsValidHeapPointer(pUserData) 异常。当使用malloc 分配 一个 空间时,会将这个空间的起始地址和长度 加到一个链表中去。free(p)的时候
,会从 链表里 查找 是否 有 这个地址空间,找到了就将这个节点从链表中删除。_CrtI...
分类:
其他好文 时间:
2015-03-18 18:16:17
阅读次数:
167
数组是一种常用的数据结构,高级语言头提供了支持数组的基本操作,而且数组也是构成其他数据结构的重要组成。数组是N个相同元素的构成的占用一块地址连续的内存单元的有限序列。 数组的任一个元素都可以用在数组的位置来表示。数组与线性表区别:数组符合线性结构的定义。 但是区别是: 数组要求占用连续的地址空间,线...
分类:
编程语言 时间:
2015-03-17 17:17:42
阅读次数:
186
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。 堆,就是那些由new分配的内存块,他们的释放编译器不....
分类:
编程语言 时间:
2015-03-16 19:16:28
阅读次数:
162
我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。那虚拟内存空间是什么呢,它与实际物理内存空间又是怎样对应的呢,为什么有了虚拟内存技术,我们就能运行比实际物理内存大的...
分类:
系统相关 时间:
2015-03-15 15:09:35
阅读次数:
262
在这篇计算机底层知识拾遗(五)理解块IO层 中讲了块缓存buffer cache块缓存,这篇说说页缓存page cache以及相关的地址空间address_space的要点。
在Linux 2.4内核中块缓存buffer cache和页缓存page cache是并存的,表现的现象是同一份文件的数据,可能即出现在buffer cache中,又出现在页缓存中,这样就造成了物理内存的浪费。Linux ...
分类:
系统相关 时间:
2015-03-11 14:58:59
阅读次数:
263
1.
2.内存管理需要达到的目的?
1)地址保护:多道程序之间互不干扰,一个进程不能随便访问另外一个进程的地址空间。
2)地址独立:程序发出的地址与具体机器的物理主存地址是独立的。
3.为什么提出了虚拟内存?
在计算机中,一个程序要运行,必须加载到物理主存中,但是物理主存的容量是非常有限的,因此我们要把一个程序全部加载到主存,我们的每一个程序大小就要限制。另外,即使我们编写...
分类:
其他好文 时间:
2015-03-09 12:56:33
阅读次数:
197
首先看下进程地址空间示意图: 我们简单的说,从低地址到高地址,代码区和数据区,空洞,堆栈区。 在Linux内核源代码情景分析-内存管理之用户堆栈的扩展,我们申请了从堆栈区往下,数据区上面的页面。 在Linux内核源代码情景分析-内存管理之用户页面的换入,我们申请了用于换入/换出的页面。 在本文中,我们申请的是从数据区往上,堆栈区下面的页面。 我们通过一个实例来分析,b...
分类:
系统相关 时间:
2015-03-09 09:24:25
阅读次数:
246
关于Linux 32位内存下的内存空间布局,可以参考这篇博文Linux下C程序进程地址空间局关于源代码中各种数据类型/代码在elf格式文件以及进程空间中所处的段,在x86_64下和i386下是类似的,本文主要关注vm.legacy_va_layout以及kernel.randomize_va_space参数影响下的进程空间内存宏观布局。情形一:
vm_legacy_va_layout=1
ke...
分类:
系统相关 时间:
2015-03-09 00:34:17
阅读次数:
568
进程的地址空间中有很大的一块区域是被称作“堆”的区域
其地址空间是在进程的.data和.bss的地址增长方向到动态库区域的低地址部分的范围
堆可以理解成是进程的一大块内存区域(已经分配实际物理内存,但并不是所有的地址空间都分配了物理内存,其大小根据系统类型和版本来定)
用来供进程中的程序动态分配内存空间
通常,进程通过向操作系统批发一大块实际的内存空间交给glibc管理以提高动态内存请求和释放的效率
在程序要请求动态分配比较小的内存空间的时候,glibc从这一大块内存空间中分配之
当程序要请求动态分配较大的...
分类:
系统相关 时间:
2015-03-07 20:03:14
阅读次数:
194
进程、线程和协程要理解什么是goroutine,我们先来看看进程、线程以及协程它们之间的区别,这能帮助我们更好的理解goroutine。进程:分配完整独立的地址空间,拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程的切换只发生在内核态,由操作系统调度。
线程:和其它本进程的线程共享地址空间,拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程的切换一般也由操作系统调度(标准线程是的)。
协程...
分类:
其他好文 时间:
2015-03-05 22:26:19
阅读次数:
386