高并发内存池(threadcache)[1]

news2024/11/22 19:42:47

高并发内存池

分层处理

在这里插入图片描述
在这里插入图片描述

thread cache

在这里插入图片描述
定义一个公共的FreeList管理切分的小空间
在这里插入图片描述
在这里插入图片描述

static void*& NextObj(void* obj)
{
	return *(void**)obj;
}

//管理切分好的小对象的自由链表
class FreeList
{
public:
	void Push(void* obj)
	{
		assert(obj);
		//头插
		//*(void**)obj = _freeList;
		NextObj(obj) = _freeList;
		_freeList = obj;
	}

	void* Pop()
	{
		assert(_freeList);
		//头删
		void* obj = _freeList;
		_freeList = NextObj(obj);
	}
private:
	void* _freeList = nullptr;
};

用FreeList做哈希桶的映射

class ThreadCache
{
public:
	//申请和释放对象
	void* Allocate(size_t size);

	void* Deallocate(void* ptr, size_t size);
private:
	FreeList _freeLists[];
};

对齐找桶

对齐映射
对象中没有成员,使用静态的函数可以不通过对象就能调用,,用位运算的效率更高
先算在哪个对齐规则中,再计算在哪个桶中

static const size_t MAX_BYTES = 256 * 1024;
static const size_t NFREE_LIST = 208;


void*& NextObj(void* obj)
{
	return *(void**)obj;
}

//管理切分好的小对象的自由链表
class FreeList
{
public:
	void Push(void* obj)
	{
		assert(obj);
		//头插
		//*(void**)obj = _freeList;
		NextObj(obj) = _freeList;
		_freeList = obj;
	}

	void* Pop()
	{
		assert(_freeList);
		//头删
		void* obj = _freeList;
		_freeList = NextObj(obj);
	}
	bool Empty()
	{
		return _freeList == nullptr;
	}
private:
	void* _freeList;
};
//计算对象大小的对齐映射规则
class SizeClass
{
	// 整体控制在最多10%左右的内碎片浪费
	// [1,128]					8byte对齐	    freelist[0,16)
	// [128+1,1024]				16byte对齐	    freelist[16,72)
	// [1024+1,8*1024]			128byte对齐	    freelist[72,128)
	// [8*1024+1,64*1024]		1024byte对齐     freelist[128,184)
	// [64*1024+1,256*1024]		8*1024byte对齐   freelist[184,208)
public:
	//size_t _RoundUP(size_t size, size_t alignNum)
	//{
	//	size_t alignSize;
	//	if (size % 8 != 0)
	//	{
	//		alignSize = (size / alignNum + 1) * alignNum;
	//	}
	//	else
	//	{
	//		alignSize = size;
	//	}
	//	return alignSize;
	//}
	static inline size_t _RoundUp(size_t bytes, size_t alignNum)
	{
		return ((bytes + alignNum - 1) & ~(alignNum - 1));
	}

	static inline size_t RoundUp(size_t size)
	{
		if (size <= 128)
		{
			return _RoundUp(size, 8);
		}
		else if (size <= 1024)
		{
			return _RoundUp(size, 16);
		}
		else if (size <= 8 * 1024)
		{
			return _RoundUp(size, 128);
		}
		else if (size <= 64 * 1024)
		{
			return _RoundUp(size, 1024);
		}
		else if (size <= 256 * 1024)
		{
			return _RoundUp(size, 8*1024);
		}
		else
		{
			assert(false);
			return -1;
		}
	}

	/*size_t _Index(size_t bytes, size_t alignNum)
	{
	if (bytes % alignNum == 0)
	{
	return bytes / alignNum - 1;
	}
	else
	{
	return bytes / alignNum;
	}
	}*/

	// 1 + 7  8
	// 2      9
	// ...
	// 8      15

	// 9 + 7 16
	// 10
	// ...
	// 16    23
	static inline size_t _Index(size_t bytes, size_t align_shift)
	{
		return ((bytes + (1 << align_shift) - 1) >> align_shift) - 1;
	}

	// 计算映射的哪一个自由链表桶
	static inline size_t Index(size_t bytes)
	{
		assert(bytes <= MAX_BYTES);

		// 每个区间有多少个链
		static int group_array[4] = { 16, 56, 56, 56 };
		if (bytes <= 128) {
			return _Index(bytes, 3);
		}
		else if (bytes <= 1024) {
			return _Index(bytes - 128, 4) + group_array[0];
		}
		else if (bytes <= 8 * 1024) {
			return _Index(bytes - 1024, 7) + group_array[1] + group_array[0];
		}
		else if (bytes <= 64 * 1024) {
			return _Index(bytes - 8 * 1024, 10) + group_array[2] + group_array[1] + group_array[0];
		}
		else if (bytes <= 256 * 1024) {
			return _Index(bytes - 64 * 1024, 13) + group_array[3] + group_array[2] + group_array[1] + group_array[0];
		}
		else {
			assert(false);
		}

		return -1;
	}

完善ThreadCache类

class ThreadCache
{
public:
	//申请和释放对象
	void* Allocate(size_t size);

	void* Deallocate(void* ptr, size_t size);

	//从中心缓存获取对象
	void* FetchFromCentralCache(size_t index, size_t size);

private:
	FreeList _freeLists[NFREE_LIST];
};

申请对象:先判断申请大小是否在规定范围-----得出在哪个映射规则—在哪个桶—判断桶不为空时头删桶,否则从中心缓存获取对象

void* FetchFromCentralCache(size_t index, size_t size)
{}

void* ThreadCache::Allocate(size_t size)
{
	assert(size <= MAX_BYTES);
	size_t alignSize = SizeClass::RoundUp(size);
	size_t index = SizeClass::Index(size);
	
	if (!_freeLists[index].Empty())
	{
		return _freeLists[index].Pop();
	}
	else
	{
		return FetchFromCentralCache(index,alignSize);
	}
}

void* ThreadCache::Deallocate(void* ptr, size_t size)
{
	
}

线程局部存储(TLS)

在这里插入图片描述
每个线程都定义一个这样的指针

_declspec(thread) ThreadCache* pTLSThreadCache = nullptr;

每个线程无锁的获取自己的ThreadCache对象

static void* ConcurrentAlloc(size_t size)
{
	// 通过TLS 每个线程无锁的获取自己的专属的ThreadCache对象
	if (pTLSThreadCache == nullptr)
	{
		pTLSThreadCache = new ThreadCache;
	}

	cout << std::this_thread::get_id() << ":" << pTLSThreadCache << endl;

	return pTLSThreadCache->Allocate(size);
}

static void ConcurrentFree(void* ptr, size_t size)
{
	assert(pTLSThreadCache);

	pTLSThreadCache->Deallocate(ptr, size);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMq-3入门案例

rabbitmq入门 1.生产者&#xff08;服务提供方&#xff09; //依赖<dependencies> <!-- rabbitmq客户端依赖--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0<…

骨传导耳机会伤耳膜吗?骨传导耳机有什么优缺点一文教你读懂

骨传导耳机会伤耳膜吗? 答案是不会&#xff01;因为骨传导耳机传声完全不会经过耳膜&#xff0c;说到这里就不得不讲一下骨传导的发声原理了&#xff0c;正常情况下&#xff0c;声音传声主要分为空气传导、固体传导和液体传导&#xff0c;物理大家都学过这里就不多赘述了。 我…

用MASM32编程更新sysInfo的一些收获

近日正在更新用MASM32编写的sysInfo&#xff0c;通过WMI访问Win32_UserCount来获取系统用户帐号信息&#xff0c;访问Win32_Product来获取系统中安装的产品信息。 在进行更新过程中&#xff0c;有一些新的收获跟大家分享。 一、HTMLJavaScript构建C类代码一键转换MASM32代码平…

中科方德4.0服务器 默认自动分区,扩容根分区方法

先看分区情况是否为非LVM的ext4&#xff0c;方德默认自动分配即是此种分区&#xff1b;外部添加磁盘空间&#xff0c;虚拟机或者物理机一样&#xff1b;图形化扩展到逻辑分区&#xff0c;如图中所示的扩展分区&#xff1b;home分区扩展&#xff1b;home分区尾部留出新home分区&…

iOS 17 正式版预计 9 月中下旬发布,部分新功能延后推出

苹果公司预计将在 9 月中下旬推出 iOS 17 正式版&#xff0c;iPhone XS 及更新的机型可免费更新。这次更新包含了许多新功能&#xff0c;但是根据苹果公司的网站显示&#xff0c;并不是所有的功能都会立即可用。苹果表示有一些功能“将在今年晚些时候推出”&#xff0c;比如&am…

springboot里 运用 easyexcel 导出

引入pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency>运用 import com.alibaba.excel.EasyExcel; import org.springframework.stereotype.Contr…

基线与基线检查

目录 一、什么是基线 二、安全基线与配置核查 三、常见安全配置问题 四、配置检查目的 五、配置检查标准 六、基线检查标准 七、安全基线与漏扫的异同 相同点 不同点 八、安全基线体系 九、安全配置核查关注什么 口令策略 文件权限 用户账户 系统服务 认证授权 网络通…

【Docker】Docker安装 MySQL 8.0,简洁版-快速安装使用

今天&#xff0c;使用docker安装mysql数据库进行一个测试&#xff0c;结果网上找了一篇文章&#xff0c;然后。。。。坑死我… 特总结本篇安装教程&#xff0c;主打一个废话不多说&#xff01; 坑&#xff1a;安装成功&#xff0c;客户端工具连接不上数据库》。。。 正文&…

复习3-5天【80天学习完《深入理解计算机系统》】第七天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Python入门--关键字

关键字是Python编程语言中具有特殊含义的保留单词&#xff0c;不能用作变量名、函数名、类名或其他标识符。以下是Python 3.9.0版本中的关键字列表&#xff1a; False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, f…

图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

然后我们再来看一下这个明星关系图谱 可以看到这里 这个是原来的startRelation 我们可以写CQL去查询对应的关系 可以看到,首先查询出来以后,然后就可以去创建 我们可以把写的创建明星关系的CQL,拿到 springboot中去执行 可以看到,这里我们先写一个StarRelationRepository,然…

香蕉派 BPI-P2 Pro采用RK3308芯片,512M内存,8G存储,支持PoE供电

Banana Pi BPI-P2 pro(Armsom pro)是一款基于瑞芯瑞(Rockchip) RK3308B-S芯片的开发板。采用高性能4核ARM Cortex-A35处理器&#xff0c;512M RAM内存。和8G eMMC板载存储&#xff0c;支持PoE网线供电功能。芯片具有丰富的接口&#xff0c;如I2S、PCM、TDM、I2C、UART、SPDIF、…

Linux学习之iptables的nat表

iptables -t nat 命令 规则链 规则是格式命令。 PREROUTING一般用于内网&#xff0c;用于目的地址转换。 POSTROUTING一般用于外网&#xff0c;用于源地址转换。 iptables -t nat -A PREROUTING -i eth0 -d 114.115.116.117 -p tcp --dport 80 -j DNAT --to-destination 10.0.0…

Pandas+Pyecharts | 电子产品销售数据分析可视化+用户RFM画像

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 数据信息2.3 去掉部分用不到的列2.4 去除重复数据2.5 增加部分时间列2.6 过滤数据&#xff0c;也可以选择均值填充2.7 对年龄分组2.8 增加商品一、二级分…

系统公告 | 用Navicat就可以访问应用数据库啦~

“超能力”数据库&#xff5e;拿来即用&#xff0c;应用开发人员再也不用为撰写API而发愁。MemFire Cloud 为开发者提供了简单易用的云数据库&#xff08;表编辑器、自动生成API、SQL编辑器、备份恢复、托管运维&#xff09;&#xff0c;很大地降低开发者的使用门槛。 MemFire …

喜报!YCloud荣升WhatsApp Select等级商业解决方案提供商

即日起&#xff0c;云片国际站YCloud正式成为WhatsApp Select等级BSP&#xff08;商业解决方案提供商&#xff09;。2022年10月&#xff0c;YCloud获得Meta大中华地区首批BSP资格。通过YCloud团队不断追求卓越&#xff0c;专注为客户构建创新的通信解决方案的专业服务&#xff…

暴力破解

1、暴力破解 基于表单的暴力破解 使用bp抓包 我们要破解username和password&#xff0c;就应当选取Cluster bomb的攻击方式&#xff0c;在payloads中上传我们的字典&#xff0c;首先在payload set 1中上传username的字典&#xff0c;再选取payload set 2上传password的字典。 …

多线程-死锁

/*** 死锁demo*/ public class DeadlockDemo {public static void main(String[] args) {// 创建两个对象final Object resource1 "resource1";final Object resource2 "resource2";// 创建第一个线程Thread t1 new Thread(() -> {// 尝试锁定resour…

pe文件之手工构建节表(段表)和节的具体内容

一、实验目的 通过使用winHex手动 在原来的文件中 追加节&#xff08;.text代码节、.rdata引入函数节、.data数据节&#xff09;&#xff0c;然后利用stud_pe添加节表的name,大小等信息&#xff0c;对一个pe文件进行修复&#xff0c;从而了解一个pe文件的具体构成 二、实验步骤…

免费AI学习网站(二)

国内绘画midjourney网站 http://aijiaolian.chat优质提示词分解教学 https://q3iylvv7qj.feishu.cn/docx/UGMzdPVGjo1fHcxu1kjcuXFcnff?fromfrom_copylink设计图AI实战&#xff0c;如何用AI提高83%的出图效率&#xff1f;https://q3iylvv7qj.feishu.cn/docx/Fsxxd3MncowFUix5…