Slab在内核内存管理和用户态Memcached的双重存在

系统 Linux
很多基础的概念,将跨越软件的层次而存在。比如slab,对于内核人员,我们都知道slab是buddy之上的一层。

[[416651]]

很多基础的概念,将跨越软件的层次而存在。比如slab,对于内核人员,我们都知道slab是buddy之上的一层。

因为buddy作为Linux内核最底层的内存管理器,它分配1页,2页,4页,2^n页,但是作为内核的堆用户本身,经常只是调用kmalloc()申请一个小内存,或者调用kmem_cache_alloc()申请一个数据结构,2^n页给它,会形成大量碎片浪费。所以slab找buddy要了2^n页后,内部切割为同样size的object,再给kmalloc和kmem_cache_alloc()拿走。

它的逻辑如下:

这样一种软件本质意义上的需求,不会因为只是内核就需要。比如同样的slab算法,也被著名的用户态软件Memcached需要着。

Memcached是一种分布式内存对象缓存系统,用于动态Web等应用以减轻数据库的负载。它在内存中缓存数据和对象,使用key-value对形式存储。它的网站首页(https://memcached.org/)显示了它的基本用法逻辑:

Memcached的原理也类似内核态page cache的原理:

比如你查询一个数据库,可以先看看Memcached里面有没有命中,命中就直接从Memcached的内存里面拿到值了,没有的时候才需要去查数据库。查到后,可以把结果放入Memcached,这样下次再访问同样数据,不再需要进行数据库的查询动作。

Memcached也同样采用slab分配算法来组织数据的存放,里面可以组织不同大小的chunks:

正如Linux内核的每一种不同slab里面的object的大小不一样。

我们安装1个Memcached:

  1. $ sudo apt-get install memcached 

然后启动起来,你马上看到memcached打印说自己创建了各种不同chunk size的slab:

 

当然,还有更多的相似性,比如Memcached里面的对象,也是LRU算法替换。所以LRU这种,也是一种本质上的事情。

本文转载自微信公众号「Linux阅码场」,可以通过以下二维码关注。转载本文请联系Linux阅码场公众号。

 

责任编辑:武晓燕 来源: Linux阅码场
相关推荐

2018-12-06 10:22:54

Linux内核内存

2021-12-20 09:53:51

用户态内核态应用程序

2023-10-26 11:39:54

Linux系统CPU

2023-01-06 08:04:10

GPU容器虚拟化

2013-10-11 17:24:47

Linux运维内存管理

2024-09-29 08:57:25

2021-09-17 11:59:21

tcpdump网络包Linux

2021-09-08 10:21:33

内核网络包Tcpdump

2021-08-31 07:54:24

TCPIP协议

2016-08-10 12:52:31

2018-08-10 22:15:53

2011-06-03 09:26:11

2018-03-01 16:25:52

Linux内核内存管理

2017-08-16 16:20:01

Linux内核态抢占用户态抢占

2019-05-23 10:59:24

Java内存 C++

2009-11-25 13:08:48

PHP内存缓存技术me

2021-01-14 09:37:20

内核空间用户

2022-03-25 12:31:49

Linux根文件内核

2018-02-24 12:17:56

C程序内存方式

2009-12-08 12:22:05

内核Makefile软链接
点赞
收藏

51CTO技术栈公众号