很多基本的概念都会存在于整个软件层面。比如slab,对于kernel人员来说,我们都知道slab比buddy高一层。因为buddy是linux内核最底层的内存管理器,分配1页、2页、4页、2^n页,但作为内核的堆用户,往往只是调用kmalloc()申请一个小内存,或者调用kmem_cache_alloc()申请一个数据结构,给它2^n页,这样会造成大量的碎片浪费。因此,slab向buddy要了2^n页后,在内部将它们切割成大小相同的对象,然后交给kmalloc和kmem_cache_alloc()带走。它的逻辑是这样的:软件本质意义上的这种需求是不需要的,因为它只是内核。比如著名的用户态软件Memcached也需要同样的slab算法。Memcached是一种分布式内存对象缓存系统,用于动态Web等应用程序,以减轻数据库的负载。它将数据和对象缓存在内存中,以键值对的形式存储。它的网站首页(https://memcached.org/)展示了它的基本使用逻辑:Memcached的原理也和内核态pagecache类似:比如查询一个数据库,可以先查看是否有在Memcached中是命中,如果命中则直接从Memcached的内存中获取值,没有值时只需要去查数据库。找到之后就可以把结果放到Memcached中,这样下次访问同样的数据就不用查询数据库了。Memcached也使用slab分配算法来组织数据存储,可以组织不同大小的chunk:就像Linux内核不同slab中对象的大小是不同的一样。我们安装1个Memcached:$sudoapt-getinstallmemcached然后启动它,你会立即看到memcached打印它已经创建了各种chunk大小的slabs:当然还有更多相似之处,比如Memcached中的对象也是LRU算法替代品。所以LRU也是必不可少的东西。本文转载自微信公众号“Linux代码阅读领域”,可通过以下二维码关注。转载本文请联系Linux代码阅读领域公众号。
