高并发内存池——链表设计

自由链表类的设计

由于申请的空间块经过对齐之后大小至少为8,因此可以考虑在未被使用的内存块中取前8字节存储下一个空间的地址
在这里插入图片描述

FreeList类初步声明

class FreeList
{
private:void* _freelist=nullptr; //自由链表头指针size_t _size=0; //自由链表的长度size_t _maxsize=1; //长度上限
public:void Push(void* obj); //头插,从自由链表中插入一块空间void* Pop();  //头删,从自由链表中取出一块空间void PushRange(void* start,void* end,size_t n); //头插一段空间void PopRange(void* end,size_t n);//头删一段空间//start为一段空间的首地址,end为末地址,n为空间块个数bool IsEmpty(); //判空size_t& Maxsize(); //返回上限size_t Size(); //返回当前长度void* PeekHead(); //取表头,不删除
};

实现Push方法

void FreeList::Push(void* obj)
{*(void**)obj=_freelist;_freelist=obj;++_size;

实现Pop方法

void* FreeList::Pop()
{void* obj=_freelist;_freelist=*(void**)obj;--_size;return obj;
}

当threadcache中空间不足(过剩)时需要向centralcache申请(归还)一批指定大小的空间,所得到(归还)的空间往往不会只有一个,而是一段已经链接好的空间块,因此还需要在FreeList中实现头插一段空间头删一段空间
实现PopRange方法

void FreeList::PopRange(void* end,size_t n)
{*(void**)end=_freelist;_size-=n;
}

实现PushRange()方法

void FreeList::PushRange(void* start,void* end,size_t n)
{*(void**)end=_freelist;_freelist=start;_size+=n;
}

SpanList的设计

在这里插入图片描述
声明Span结构

struct Span //管理
{Span* _next = nullptr;Span* _prev = nullptr;void* _freelist = nullptr; //自由链表size_t _useCount = 0; //分配的threadcache的个数bool _isuse = false; //是否在被使用size_t _objsize = 0; //切好的块大小PAGE_ID _pageid = 0; //大块内存页码size_t _n = 0; //页的数量
};

SpanList初步声明

class SpanList
{
private:Span* _head=nullptr; //哨兵位
public:std::mutex _mtx;//桶锁
public:SpanList();void Insert(Span* cur,Span* span); //在cur位置插入spanvoid Erase(Span* span); //删除spanSpan* Begin(); //返回头节点Span* End(); //返回尾节点Span* Front();  //头删并返回
};

实现构造函数

SpanList::SpanList()
{_head= new Span;_head->_next=head;_head->_prev=head
}

实现Insert方法

void SpanList::Insert(Span* cur, Span* newSpan)
{assert(cur && newSpan);newSpan->_next = cur;newSpan->_prev = cur->_prev;cur->_prev->_next = newSpan;cur->_prev = newSpan;
}

实现Erase,Front方法

void SpanList::Erase(Span* cur)
{assert(cur && cur != _head);cur->_prev->_next = cur->_next;cur->_next->_prev = cur->_prev;//不需要delete cur,将cur交给下一层,不是系统
}Span* SpanList::Front()
{Span* span= _head->_next;Erase(span);return span;
}

实现Begin,End方法

Span* SpanList::Begin()
{return _head->_next;
}Span* SpanList::End()
{return _head;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Django】anaconda环境变量配置及配置python虚拟环境

文章目录 配置环境变量配置python虚拟环境查看conda源并配置国内源在虚拟环境中安装django 配置环境变量 control sysdm.cpl,,3笔者anaconda安装目录为C:\ProgramData\anaconda3 那么需要加入path中的有如下三个 C:\ProgramData\anaconda3 C:\ProgramData\anaconda3\Scripts C:…

最新风车IM即时聊天源码及完整视频教程2024年7月版

堡塔面板 试验性Centos/Ubuntu/Debian安装命令 独立运行环境(py3.7) 可能存在少量兼容性问题 不断优化中 curl -sSO http://io.bt.sy/install/install_panel.sh && bash install_panel.sh 1.宝塔环境如下: Nginx 1.20 Tomcat 8 MySQL 8.0 R…

Java 开发环境配置

1. 下载 JDK 直接在oracle 官网下载 https://www.oracle.com/java/technologies/downloads或者使用博主已经从oracle下载的 jdk21:https://download.csdn.net/download/u011171506/89585231jdk8:https://download.csdn.net/download/u011171506/8958523…

快醒醒,别睡了!...讲《数据分析pandas库》了—/—<4>

一、废话不多说,直接开讲 1、DataFrame的索引和切片 1.1 选择列 当想要获取 df 中某列数据时,只需要在 df 后面的方括号中指明要选择的列即可。如果是 一列,则只需要传入一个列名;如果是同时选择多列,则传入多个列名即可&#xf…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中,Fragments 是一种轻量级的 UI 组件,类似于视图(Views),但它们没有自己的控制器(Controller)。Fragments 通常用于定义可以在多个视图中重用的 UI 片段,从而提…

集成千兆网口(Gigabit Ethernet Port)的作用主要是提供高速的有线网络连接,其工作原理涉及以下几个关键点:

传输速率: 千兆网口支持的最高传输速率达到1 Gbps(即每秒10亿位),是传统百兆网口(100 Mbps)的十倍速度。这使得它能够处理更大量、更高质量的数据传输。 数据传输效率: 千兆网口能显著提高局域…

C#如何引用dll动态链接库文件的注释

1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意:XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下,之后又将XML文件复制到相同的目录下,需要删除引用&am…

【机器学习】Python、NumPy和向量化的基础知识以及三者结合的用法和示例

引言 在机器学习中,NumPy是一个非常重要的库,特别是在进行向量化操作时。向量化是一种优化技术,可以显著提高数组计算的效率,特别是在处理大型数据集时。NumPy提供了丰富的数组运算功能,使得向量化操作变得简单高效 文…

驾驭代码的无形疆界:动态内存管理揭秘

目录 1.:为什么要有动态内存分配 2.malloc和free 2.1:malloc 2.2:free 3.calloc和realloc 3.1:calloc 3.1.1:代码1(malloc) 3.1.2:代码2(calloc) 3.2:realloc 3.2.1:原地扩容 3.2.2:异地扩容 3.2.3:代码1(原地扩容) 3.2.3:代码2(异地扩容) 4:常见的动态内存的错误…

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了 艾斯视觉观点认为:在软件开发的世界里,有时候创意和设计的火花会擦得特别亮,以至于让技术实现的伙伴们感到既兴奋又紧张。这不,我们的设计团队刚刚…

Vue的安装配置

1.安装node js Node.js — 在任何地方运行 JavaScript (nodejs.org) 2.测试nodejs是否安装成功 node -v npm -v3.通过npm 安装 vue npm install -g vue/cli4.测试vue是否安装成功 vue --version5.打开PyCharm,创建项目:flask-web vue create flask…

【H.264】H.264详解(二)—— H264视频码流解析示例源码

文章目录 一、前言二、示例源码【1】目录结构【2】Makefile源码【3】h264parser.c源码【4】编译运行【5】源码下载地址 声明:此篇示例源码非原创,原作者雷霄骅。雷霄骅,中国传媒大学通信与信息系统专业博士生,在此向雷霄骅雷神致敬…

MySQL客户端命令一节将.sql文件导入MySQL

MySql客户端命令 直接输入SQL语句 使用MySQL客户端连接到服务器之后,可以发送SQL语句到服务器执行,并且以;和\g, \G作为结束不同的结束方式显示内容有所不同** TIPS: ;和\g结尾以表格的形式显示结果\G以行的形式显示结果 在连接到服务器之后…

FineBI连接MySQL5.7

一、在FineBI系统管理中,点击【新建数据库连接】 选择MySQL数据库 配置数据库连接,如下,其中数据库名称就是需要连接的目标数据库

5.CSS学习(浮动)

浮动(float) 是一种传统的网页布局方式,通过浮动,可以使元素脱离文档流的控制,使其横向排列。 其编写在CSS样式中。 float:none(默认值) 元素不浮动。 float:left 设置的元素在其包含…

Web3 职场新手指南:从技能到素养,求职者如何脱颖而出?

随着 2024 年步入下半年,Web3 行业正在经历一系列技术革新。通过改进的跨链交互机制和兼容性,逐步消除市场碎片化的问题。技术的进步为开发者和用户都打开了新的前景。然而,复杂的技术和快速变化的市场环境也让许多新人望而却步。求职者如何找…

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 目录 Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 一、简单介绍 二、共享纹理 1、共享纹理的原理 2、共享纹理涉及到的关键知识点 3、什么可以实现共享 不能实现共享…

LeetCode 2844.生成特殊数字的最少操作(哈希表 + 贪心)

给你一个下标从 0 开始的字符串 num ,表示一个非负整数。 在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0。 返回最少需要多少次操作可以使 num 变成特殊数字。 如…

Web漏洞扫描工具(AWVS、Goby)

一、背景 想针对自己项目或者小公司的Web安全做相关扫描,自己做漏洞进行自查工作,能够减少自身系统的安全风险,提高系统的安全性。但是没有找到一些开源性质的、扫描质量比较高的相关工具,使用安全公司的专业产品价格又承受不起。…

MySQL_JDBC

目录 一、JDBC常用的接口和类 1.1 数据库连接 Connection 1.2 Statement 对象 二、JDBC的使用 总结 【Java 的数据库编程】 JDBC 即 Java Database Connectivity (Java数据库连接),是一种用于执行 SQL 语句的 Java API。这个 API 由 java.sql.*,javax.sql.* …