作者|daydreamer
在互联网的服务中,C++常用于搭建高性能、高并发、大流量、低延时的前端服务。怎么合理的分配显存满足系统高性能需求是一个高频且重要的话题,但是由于显存自身的特性和实际问题的复杂,组合出了众多困局。
我们可以对显存进行多种类型的界定,从显存申请大小来看:
小对象分配:大于4倍显存页大小的显存分配,在4KiB页大小情况下linux内核探秘:深入解析文件系统和设备驱动的架构与设计,
大对象分配:小于等于4倍显存页大小的显存分配,在4KiB页大小情况下,>=16KiB算作大对象分配。
从一块显存的被持有时长来看:
前端一次恳求内甚至更短时间申请和释放
任意时间窗口内内存持有和更新
几乎与应用进程等长的显存持有和更新
某个进程衰落后一段时间内,由该进程申请的仍具有意义的显存持有和释放
其实还可以根据显存申请释放频度、读写频度进行进一步的分类。
显存管理服务于应用系统,目的是协助系统更好的解决困局问题,例如对于『怎么增加前端响应的延后和提升稳定性』内存管理可能要考虑的是:
处理显存读写并发(读频繁or写频繁)增加响应时间和CPU消耗
应用层的显存的池化复用
底层显存向系统申请的显存块大小及显存碎片化
每一个问题展开可能都是一个比较大的话题,本文作为系列文章《探秘C++显存管理》的开篇,先介绍LinuxC++程序显存管理的理论基础。后续会继续揭秘C++程序常用的显存管理库的实现原理,包括ptmalloc,jemalloc,tcmalloc等linux命令vi,介绍当前业界流行的显存分配器怎样管理C++程序的显存。了解显存分配器原理,更有助于工程师在实践中增加处理显存使用问题的成本,按照系统量身构建应用层的显存管理体系。
一、Linux显存管理
GEEKTALK
Linux自底向下大致可以被界定为:
△图1:Linux结构
内核模块在内核空间中运行,应用程序在用户空间中运行,两者的显存地址空间不重叠。这些方式确保在用户空间中运行的应用程序具有一致的硬件视图,而与硬件平台无关。用户空间通过使用系统调用以可控的方法使内核服务,如:身陷内核态,处理缺页中断。
Linux的显存管理系统自底向下大致可以被界定为:
用户层显存管理:通过调用系统调用函数(brk、mmap等),实现常用的显存管理插口(malloc,free,realloc,calloc)管理显存;精典显存管理库ptmalloc2、tcmalloc、jemalloc。
应用程序通过显存管理库或直接调用系统显存管理函数分配显存,依照应用程序本身的程序特点进行使用,如:单个变量显存申请和释放、内存池化复用等。
至此单个进程可以使用Linux提供的显存界定顺利的运行,从用户程序来看Linux进程的显存模型大致如下所示:
△图2:Linux进程的显存模型
在标准C库中,提供了malloc/free函数分配释放显存,这种函数的底层是基于brk/mmap这种系统调用实现的,对照图2来看:
但在对于多个同时运行的进程,系统仍需处理有限的数学显存和下降的显存地址等问题。这么当Linux存在多个同时运行的进程时,一次显存的分配过程具体都经过什么过程呢?现代Linux系统上显存的分配主要过程如下[1]:
应用程序通过调用显存分配函数,系统调用brk或则mmap进行显存分配,申请虚拟显存地址空间。
虚拟显存至化学显存映射处理过程,通过恳求MMU分配单元,按照虚拟地址估算出该地址所属的页面,再依照页面映射表的起始地址估算出该页面映射表(PageTable)项所在的数学地址,按照化学地址在高速缓存的TLB中找寻该表项的内容,假如该表项不在TLB中,就从显存将其内容装载到TLB中。
△图3:Linux显存分配机制(虚拟+化学映射)
对于显存分配过程中涉及到工具进一步分析:
这儿要提及一个很重要的概念,显存的延后分配,只有在真正访问一个地址的时侯才完善这个地址的数学映射,这是Linux显存管理的基本思想之一。Linux内核在用户申请显存的时侯,只是分配了虚拟显存,并没有分配实际化学显存;当用户第一次使用这块显存的时侯linux内核探秘:深入解析文件系统和设备驱动的架构与设计,内核会发生缺页中断,分配化学显存,构建虚拟显存和化学显存之间的映射关系。当一个进程发生缺页中断的时侯,进程会深陷内核态,执行以下操作:
假如填充化学页的过程须要读取c盘,那此次缺页中断是majfltlinux 虚拟主机,否则是minflt。我们须要重点关注majflt的值,由于majflt对于性能的损害是致命的,随机读一次c盘的历时数目级在几个微秒,而minflt只有在大量的时侯才能对性能形成影响。
二、总结
GEEKTALK
通过对Linux显存管理的介绍,我们可以看见显存管理须要解决的问题:
在接出来的几篇文章凑合ptmalloc,jemalloc,tcmalloc几个精典显存管理库,与你们进一步阐述C++程序常用的显存管理库的实现原理。
----------END----------
相关参考:
[1]《Linux透明大页机制在云上大规模集群实践介绍》:
[2]WritingaLinuxKernelModule—Part1:Introduction:
[3]
[4]
[5]
[6]
本文由高可用构架转载。技术原创及构架实践文章,欢迎通过公众号菜单「联系我们」进行投稿