内核缓冲区的管理

深入linux内核架构--slab分配器(建议收藏) 但是仔细想一想kmem_cache_node中的slab页帧结构你会发现,如果没有着色偏移的话,那么每次对应的缓存行一般都是从一个固定值开始的,假如我们忽略slab head的大小,每次slab对象都从页的起始位置开始分配,由于slab对象与cache line 一般来说是不等的,那么每次映射的缓存行一般是0 ~ 61或者0 ~ 62这种,所以62,63这种缓存行就会有较低访问概率,所以就需要这个着色偏移,还有一个__per_cpu array_cache用于表示该缓存在各个CPU中的slab对象; 阅读详情

内核设置全局性的缓冲池为进程分配task_struct结构,这些小块存储不局限于某个子程序,并且动态变化。Linux采用slab的缓冲区分配和管理方法。

在slab方法中,每种数据结构都有自已专用的缓冲队列,构造函数(创建并初始化),析构函数(撤销并释放);slab管理队列分为2级管理;第一级为cache_cache结构其中保存的都是kmem_cache_t结构(都是其他对象slab的队列头),第二级kmem_cache_t后跟的都是slab_t的slab队列(空闲对象队列)。

struct kmem_cache_s {


	 //每CPU指针数组,指向包含空闲对象的本地高速缓存。
	struct array_cache	*array[NR_CPUS];

	//要转移进本地高速缓存或从本地高速缓存中转移出的大批对象的数量。	
	unsigned int		batchcount;
	
	//本地高速缓存中空闲对象的最大数目。这个参数可调。	
	unsigned int		limit;
	
	//包含三个链表,为什么要单独放到一个描述符中呢?	
	struct kmem_list3	lists;

	//高速缓存中包含的对象的大小。	
	unsigned int		objsize;
	
	//描述高速缓存永久属性的一组标志。	
	unsigned int	 	flags;	/* constant flags */
	
	//在一个单独slab中的对象的个数。高速缓存中的所有slab具有相同的大小。	
	unsigned int		num;	/* # of objs per slab */
	
	//整个slab高速缓存中空闲对象的上限。
	unsigned int		free_limit; /* upper limit of objects in the lists */

	//高速缓存自旋锁。
	spinlock_t		spinlock;

	//一个单独slab中包含的连续页框数目的对数(2^n)。
	unsigned int		gfporder;
	
	//分配页框时传递给伙伴系统函数的一组标志。
	unsigned int		gfpflags;

	//slab使用的颜色个数。用于slab着色。	
	size_t			colour;		/* cache colouring range */

	//slab中的基本对齐偏移。	
	unsigned int		colour_off;	/* colour offset */
	
	//下一个被分配的slab使用的颜色。就是对齐因子。	
	unsigned int		colour_next;	/* cache colouring */
	
	//指向包含slab描述符的普通slab高速缓存。如果使用了内部slab描述符,则这个字段为NULL。	
	kmem_cache_t		*slabp_cache;
	
	//单个slab的大小。	
	unsigned int		slab_size;

	//高速缓存动态属性标志。	
	unsigned int		dflags;		/* dynamic flags */

	//高速缓存相关的构造方法的指针。	
	void (*ctor)(void *, kmem_cache_t *, unsigned long);

	//高速缓存相关的析构方法的指针。
	void (*dtor)(void *, kmem_cache_t *, unsigned long);

	//高速缓存名称。	
	const char		*name;

	//高速缓存链表。
	struct list_head	next;
}


 struct slab {
	 //slab高速缓存描述符的三个双向循环链表中的一个。
	struct list_head	list;

	 //slab中第一个对象的偏移。
	 //同一个高速缓存的不同slab有不同的coloroff值。这样可以避免硬件缓存行的不利影响。	 
	unsigned long		colouroff;
	
	 //slab中第一个对象的地址。	 
	void			*s_mem;		/* including colour offset */
	
	 //当前正在使用的slab中的对象个数。	
	unsigned int		inuse;		/* num of objs active in slab */

	 //slab中下一个空闲对象的下标。如果没有剩下空闲对象则为BUFCT_END
	kmem_bufctl_t		free;
};

slab的大小可能2^n(n=0...5)个连续的物理页面构成。具体大小因对象而异,初始化时会计算出大小。slab的双向链队列从逻辑上分为3截(1各个slab上的对象都已分配完,2各个slab上的对象已经部分的分配使用,3各个slab上的对象都处于空闲状态)


并非内核中所有使用的数据结构都有必要拥有专用的缓冲区队列,一些不常用、初始化开销也不大的数据结构可以合用一个通用的缓冲区分配机制--slab_cache采用结构数组,从32byte到128k大小;通过kmalloc()分配,kfree()释放;

struct array_cache {
	
	//指向本地高速缓存中可使用对象的指针的个数。
	//它同时也作为高速缓存中第一个空槽的下标。
	unsigned int avail;
	
	//本地高速缓存的大小,也就是本地高速缓存中指针的最大个数
	unsigned int limit;

	//本地高速缓存重新填充或者腾空时使用的块大小
	unsigned int batchcount;
	
	//如果最近被使用过,则置为1
	unsigned int touched;
};


缓冲区的分配和释放

skb_init()建立了一种缓冲区的专用队列以后,就可以通过kmem_cache_alloc( )来分配缓冲区了。
要分配sk_buff(kmem_cache_s结构),先通过skb-head_from_pool()试试缓冲池,如果缓冲池中得不到,那就进一步通过kmem_cache_alloc()分配。如果slab队列已经没有空闲的slab块了,通过alloc_new_slab()进一步扩充该slab队列。

slab队列的释放由kmem_cache_reap( )进行,依次检查若干专用缓冲区slab队列,看看是否有完全空闲的slab存在。有的话就将这些slab占用的内存页面释放。每次扫描都只扫描一部分slab队列,有全局变量clock_searchp记录下次扫描的起点。并且不会全部回收只回收80%。








深入理解UNIX内核的缓冲区管理机制 本文深入探讨了UNIX系统内核如何管理缓冲区,以及它在读取和写入磁盘块时所采用的算法。通过详细的例子和图表,我们了解了哈希队列的使用、空闲列表的管理、以及当缓冲区繁忙或不在缓存中时内核如何处理I/O请求。文章还探讨了内核如何优化数据访问,包括块读取前的预读取机制和延迟写入策略。 阅读详情

相关推荐

告别“为了写而写”:GJB438C-2021新规下,软件文档如何真正为项目服务?

本文深入解析GJB438C-2021新规如何重构软件文档的实战价值,通过文档体系瘦身、流程再造和敏捷化实践,显著提升军工软件项目的效率。新标准删除30%冗余文档,引入动态编制法和轻量化模板,使文档编制工作量降低37%,关键路径周期缩短15%。

weixin_30765577的博客 447

虎牙一面:请详细介绍一下内核缓冲区

写这篇文章的起因主要是最近复习计网滑动窗口中看到的一句话 “窗口的本质是内核缓冲区”,之前一直没有仔细去理解,以为就是缓存,很多博客写得也是缓存…,But 缓冲和缓存在概念上其实是有区别的,本文就来详细介绍一下内核缓冲区先来回顾下内核态和用户态:众所周知,CPU 上会运行两种程序,一种是操作系统的内核程序(也称为系统程序),一种是应用程序。前者完成系统任务,后者实现应用任务。两者之间有控制和被控制的关系,前者有权管理和分配资源,而后者只能向系统申请使用资源。显然,我们应该把在 CPU 上运行的这两类程序加以

m110572的博客 3408

零成本矩阵玩法:1人运营5个账号的自动化工具链配置(2025全平台实战)

通过“AI内容生产+工具链分发+自动化变现”的组合拳,即使是新手也能实现1人运营5个账号的规模化收益。关键在于选对工具与设计标准化流程。未来,矩阵运营的竞争将聚焦于工具使用效率与数据洞察深度,快人一步者方能抢占先机!

TuFuir的博客 3785

行缓冲、全缓冲、无缓冲以及用户缓冲区、内核缓冲区介绍

可以理解为:内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。后面讲到的内核缓冲区以及用户缓冲区能够更好理解缓冲区的作用。缓冲区其实可以算是保护我们的硬件的,所有的磁盘都是有寿命限制的(读写的次数不是无限的),到了一定的程度就坏了。所以就将我们要读写的内容都放在缓冲区中,统一进行读写,减少次数。缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。

m0_51429770的博客 5616

保姆级图解:HKMG工艺中的‘覆盖层’(Cap Layer)到底怎么调阈值电压?

本文深入解析了HKMG工艺中覆盖层(Cap Layer)如何精准调控阈值电压的关键技术。通过原子级精度的ALD工艺和材料选择,覆盖层在半导体制造中扮演着隐形调节器的角色,直接影响晶体管的电气特性。文章详细介绍了La2O3和Al2O3等材料的特性对比、ALD工艺的原子级控制,以及实战调试中的关键步骤和问题排查方法。

weixin_27032989的博客 496

Cesium 实战 19 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型。

非科班Java出身GISer的博客 6434

一文搞懂用户缓冲区与内核缓冲区

常常听到有程序员会跟你讨论:“我们在读写文件的时候,系统是有缓存的”。但实际上有一部分人把用户进程缓存区和系统空间缓存区的概念混淆了,包括这两种缓冲区的用法和所要解决的问题,还有其它类似的概念。本文就来区分一下不同的缓冲区概念(主要针对类unix平台)。   用户进程和操作系统的关系,首先我用一张图来解释“用户进程和操作系统的关系: 这是一个计算机系统运行时的简化模型,我们把所有运行在操作系统上的进程成为用户进程,它们都运行在用户空间(可以看到用户空间有很多进程)。把操作系统运行的空间成为系统空.

Jiangtagong的博客 1万+

芯片标称具备8kVESD能力却在8kV测试中失效?

芯片级ESD(HBM模型)与系统级ESD(IEC 61000-4-2)存在本质差异:

硬核科技 644

Linux_内核缓冲区

Linux下的内核缓冲区存在于系统中,该缓冲区和用户层面的缓冲区不过同一个概念,用户层面的缓冲区称之为用户缓冲区,而系统中也有自己的缓冲区即内核缓冲区,两者虽然同为缓冲区却差之毫厘谬以千里,了解内核缓冲区前先谈谈用户缓冲区。

安权_code的博客 2825

2026年北京君正数字IC笔试试卷带答案

本文摘要:该文档是一份数字IC设计相关的考试试题,包含单选题、多选题、波形分析题和代码设计题。内容涵盖时序约束、半导体工艺、状态机设计、逻辑综合、异步FIFO设计等知识点。试题解析详细,重点考察数字电路基础、时序分析和Verilog代码实现能力。典型题目包括多周期路径设置、Moore/Mealy状态机区别、同步复位与异步复位特性、RISC-V架构特点等,并提供了异步FIFO的Verilog实现参考代码。(149字)

Open 113

【存储管理】内核缓冲区的管理概述

内核在运行过程中,常常需要使用一些hua

博客已搬家 914

YOLOv11 改进 - 注意力机制 | Deformable-LKA 可变形大核注意力:自适应采样网格优化特征捕捉,提升不规则目标感知

本文介绍了可变形大核注意力(D-LKA Attention)及其在YOLOv11中的结合。D-LKA Attention是一种简化的注意力机制,采用大卷积核利用体积上下文信息,通过可变形卷积灵活调整采样网格,适应多样数据模式。它有2D和3D版本,3D版本在跨深度数据理解上表现出色,共同构成了D-LKA Net架构。我们将D-LKA Attention集成进YOLOv11,在模型的检测头部分引入deformable_LKA_Attention模块。实验表明,该方法在分割任务上表现优于现有方法,提升了模型的检测

魔改工程师的博客 1170

binder内核缓冲区管理

static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc, size_t data_size, size_t offsets_size, int is_async) { struct rb_node *n = proc->free_buffers.rb_node; struct binder_buffer *

hepianshi3109的博客 1763

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux内核缓冲区的管理,Linux内核Slab内存缓冲区管理器

Linux内核Slab内存缓冲区管理器维普讯资ht p:t//ww.cwqipvc.om 3第卷第2期 2403 ._2l·计机算工程020 6年 1 月De2e br 20 c me 0 6N2 o .4Co tprn i eErn m u e nge ig软件技与数据库术·~ Iq o- 4( 02—0— 3文标识 tAt o - 22 6403 o M1 o 3o )8l 献...

weixin_27038701的博客 221

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Linux文件管理】重定向&&内核级缓冲区&&用户级缓冲区

通过本文对文件管理及其内核级与用户级缓冲区的详细探讨,我们对操作系统中文件管理的机制有了更深刻的理解。首先,我们了解了 files_struct 的作用及其如何在内核中管理文件描述符的详细实现,掌握了文件的重定向以及文件描述符的相关操作。其次,通过对内核级缓冲区与用户级缓冲区的对比分析,我们认识到这两者在性能优化和内存管理中的关键作用,特别是在提升 I/O 性能和减少系统调用开销方面的重要性。

2301_79969994的博客 2218

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【存储管理】内核缓冲区的管理

专用缓冲区队列的建立

博客已搬家 807

openGauss内核求索 ---- 缓冲区管理器

观测参数:node_name, candidate_slots, get_buf_from_list, get_buf_clock_sweep, seg_candidate_slots, seg_get_buf_from_list, seg_get_buf_clock_sweep。页面简单访问流程:根据后端进程发送的请求,创建目标页面的 buffer_tag,然后将 buffer_tag 通过内置的散列函数映射到哈希桶槽,并分配 buffer_id, 即目标页面在缓冲池数组中存储的槽位的序号。

weixin_41235592的博客 2131

linux内存管理-内核缓冲区的管理

可想而知,内核在运行中常常会需要使用一些缓冲区。例如,当要建立一个新的进程时就要增加一个task_struct结构,而当进程撤销时就要释放本进程的task结构。这些小块存储空间的使用并不局限于某一个子程序,否则就可以作为整个子程序的局部变量而使用堆栈空间了。另外,这些小块存储空间又是动态变化的,不像用于内存管理的page结构那样,有多大的内存就有多少个page结构,构成一个静态的阵列。由于事先根本无法预测运行中各种不同数据结构对缓冲区的需求,不适合为每一种可能用到的数据结构建立一个缓冲池,因为那样的话很可能

guoguangwu的专栏 1347

Linux 内核中的 DMA 管理:从缓冲区到传输

Linux 内核中的 DMA 管理是一种重要的数据传输机制,它允许外设直接与内存交换数据,无需 CPU 介入。DMA 管理通过 DMA 控制器、DMA 缓冲区、DMA 映射等组件,实现了高效的数据传输。工作也要流程化,DMA 管理就像是系统中的高效数据传输通道,它确保了数据传输的高效性和可靠性。在实际应用中,我们需要选择合适的 DMA 类型,正确管理 DMA 缓冲区,处理缓存一致性,处理错误,以及进行性能优化,以实现系统的最佳性能和可靠性。

jiang_style的博客 4142

linux 内核缓冲区管理之slab机制

【原创】  未经允许,请勿转载       linux 内核采用一种称为"slab"的缓冲区分配和管理的方法。在slab方法中,每种重要的数据结构都有自己专用的缓冲区队列,每种数据结构都有相应的构造constructor和析构destrucor函数。      slab管理特点,每种对象的缓冲区队列并非由各个对象直接构成,而是由一连串的大块slab构成,而每个大块中则包含了若干同种的对象。一

qqqqqq999999的专栏 1659

linux内核缓冲区的管理,Linux内核之内核缓冲区的管理

Linux内核采用slab方法来管理内核缓冲区,slab类似于面向对象的方法进行内核区的分配和回收。1. slab可能由1个,2个,4个.......最多32个连续的物理页面构成;2. 每个slab都有slab的描述结构slab_t,用于同一种对象或多个slab通过描述结构队列头形成一个双向链队列。每个slab结构逻辑上分成3段,对一段是各个slab上所有的对象都已分配使用;第二个是各个slab已...

weixin_34997593的博客 331

内核缓冲区slab的管理

刚了下Linux内核情景分析中的内核缓冲区管理,做个小总结。 在Linux内核中,对于大块的内存的管理是用伙伴系统算法(buddy )管理。对于小块的内存则用slab管理。 在slab方法中,每种重要的数据结构都有自己专用的缓冲区队列。每个队列中的“对象”的个数是动态变化的,不够时可以增添,空闲的时候可以释放,给系统回收。 slab中,每种对象的缓冲区队列并非由各种各个对象直接构成,而是由一

jasonsungblog的专栏 1100

Linux内核之内核缓冲区的管理

Linux内核采用slab方法来管理内核缓冲区,slab类似于面向对象的方法进行内核区的分配和回收。   1. slab可能由1个,2个,4个.......最多32个连续的物理页面构成; 2. 每个slab都有slab的描述结构slab_t,用于同一种对象或多个slab通过描述结构队列头形成一个双向链队列。每个slab结构逻辑上分成3段,对一段是各个slab上所有的对象都已分配使用;第二个是...

幸福的杂货铺 556

mysql++缓冲区_innodb缓冲区管理[思考mysql内核]

我们在前面讨论了一些mysql的基础知识,现在将要开始进入innodb引擎,从这里开始我们将开始代码的结构分析,innodb的内容分析之后,将反过来分析查询优化引擎。今天,我们先来讨论innodb缓冲区管理。文件:D:/mysql-5.1.7-beta/storage/innobase/include/buf0buf.hD:/mysql-5.1.7-beta/storage/innobase/bu...

weixin_35993844的博客 155

openGauss内核求索——缓冲区管理器

1.基本原理 ...

openGauss的博客 501
上一篇: 页面的换入
下一篇: 系统调用brk()和mmap()
Rebirth__Man
博客等级 码龄9年 3粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值