
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存管理是每一位软件编程开发程序员都需要熟练掌握的一个编程技术,而本文我们就通过案例分析来简单了解一下,软件编程开发虚拟内存技术分享。
一、虚拟内存技术
在早期内存管理中,如果程序太大,超过了空闲内存容量,就没有办法把全部程序装入到内存,这时怎么办?在许多年前,人们采用了一种叫做覆盖技术,这样一种解决方案。
这是一种什么样的解决方案?
就是把程序分为若干个部分,称为覆盖块(overlay),核心思想就是分解(跟现代架构技术中分解、分模块思想很相近)。然后只把那些需要用到的指令和数据保存在内存中,而把其余的指令和数据保存在内存外。关键是需要程序员手动来分块。
这种技术有什么问题呢?
这种技术必须由程序员手工把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的调用关系。手工做这种事情很费时费力,使得编程复杂度增加。但是,程序员总是爱“偷懒”的,于是,人们去寻找更好的方案。
这个方案就是虚拟内存技术,它的基本思路:
程序运行进程的总大小可以超过实际可用的物理内存的大小。每个进程都可以有自己独立的虚拟地址空间。然后通过CPU和MMU把虚拟内存地址转换为实际物理地址。
这个就相当于在物理内存和程序之间增加了一个中间层,虚拟内存。
虚拟存储也可以看作是对内存的一种抽象。而且这种抽象带来诸多好处:
它将内存看成是一个存储在磁盘上的地址空间的高速缓存,在内存中只保留了活动区域,可以根据需要在磁盘和内存间来回传送数据,高效使用内存。
它为每个进程提供了一致的地址空间,简化了存储的管理。
对进程起到保护作用,不被其他进程地址空间破坏,因为每个进程的地址空间都是相互独立。
(程序:静态的程序;进程:动态的,可以看作是程序的一个实例)
坏处:就是复杂度进一步增加,这也是必然的。不过相比带来的好处,复杂度的增加还是可以接受,并克服。
1.2进程的内存
Kernelspace:linux内核空间内存
Stack:进程栈空间,程序运行时使用。它向下增长,系统自动管理
MemoryMappingSegment:内存映射区,通过mmap系统调用,将文件映射到进程的地址空间,或者匿名映射。
Heap:堆空间。这个就是程序里动态分配的空间。linux下使用malloc调用扩展(用brk/sbrk扩展内存空间),free函数释放(也就是缩减内存空间)
BSS段:包含未初始化的静态变量和全局变量
Data段:代码里已初始化的静态变量、全局变量
Text段:代码段,进程的可执行文件
二、内存管理中的一些常见问题
1、未能释放已经不再使用的内存-内存泄漏
2、指向不可用的内存指针-野指针
3、指针所指向的对象已经被回收了,但是指向该对象的指针仍旧指向已经回收的内存地址-悬挂指针
4、分配或释放内存太快或者太慢
5、分配内存大小不合理,造成内存碎片问题
6、内存碎片问题
三、TCMalloc
TCMalloc内存分配器的原理和golang内存分配器原理相近,所以理解了TCMalloc,golang内存分配原理也就理解大半,不过golang对它也有一些改动。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。