
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Linux编程开发随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,Linux编程内存管理方法分享。
硬件架构
现代计算机体系结构被称为Non-UniformMemoryAccess(NUMA),NUMA下物理内存是分布式的,由多个计算节点组成,每个CPU核都会有自己的本地内存。CPU在访问它的本地内存的时候就比较快,访问其他CPU核内存的时候就会比较慢。
可看到每个节点都是由CPU、总线、内存组成。节点之间的内存大小可能不同,但这些地址会统一编址到同一个物理地址空间的,即无论是节点0的内存还是节点1的内存都有的物理地址,在一个节点内部的物理内存之间可能会存在空洞,节点与节点之间的物理内存页也可能有空洞。
空洞就是一段地址是不对应到内存单元的。
Linux物理内存管理
NUMA体系结构上,节点内部的内存和节点之间的内存,访问速度是不一样的,这就提升了Linux的内存管理的复杂度,因此,Linux用了大量的数据结构来表示计算节点、内存、内存页面,以及它们之间的关系
在计算机系统中,至少会有一个默认的pglist_data结构,如果计算节点增加,pglist_data结构也会随之增加。
pglist_data结构中包含自身节点CPU的id,有指向本节点和其他节点的内存区zone结构的指针。而在zone结构中包含一个free_area结构的数组,用于挂载本内存区中的所有物理内存页,也就是page结构。
Linux的物理内存分配过程如下:通过pglist_data结构,先找到自己节点的zone结构的指针,如果不能满足要求,则查找其他节点的zone结构;然后,找到zone结构中的free_area结构数组;后,也要找到其中的page结构,并返回。释放过程则是分配过程的反过程。
Golang内存管理
以Golang语言为例,看下它是如何管理内存的。
(Go版本为1.5)
Go语言在业界是非常流行的编程语言,它的语法接近C语言,支持垃圾回收功能。
Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了切片(Slice)型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。
回到主题--Go的内存管理
像Go这种支持内存管理和并行功能的语言,一般都是有一个运行时(runtime),它就像针对这个语言开发的一个小型OS,为该语言开发的程序提供了一个标准可靠的执行环境。这个环境提供了内存管理和并行模型等一些其他功能,每个Go程序加载之时,就会先执行Go运行时环境。
看起来,似乎和普通应用的内存空间结构并无二样,但是普通应用程序是调用malloc或者mmap,向OS申请内存;而Go程序是通过Go运行时申请内存,Go运行时会向OS申请一大块内存,然后自己管理。Go应用程序分配内存时是直接找Go运行时,这样Go运行时才能对内存空间进行跟踪,后做好内存垃圾回收的工作。
这些函数形成了一个Go运行时访问内存时的抽象层,在不同的操作系统上,这些个函数调用操作系统API也是不同的。比方说,在Linux上调用的是mmap、munmap和madvise等系统调用。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音达内三江区域学习了解。