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

自由链表类的设计

由于申请的空间块经过对齐之后大小至少为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://xiahunao.cn/news/3268718.html

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

相关文章

硅纪元AI应用推荐 | 豆包整容成了浏览器,让你的电脑秒变AI PC

“硅纪元AI应用推荐”栏目,为您精选最新、最实用的人工智能应用,无论您是AI发烧友还是新手,都能在这里找到提升生活和工作的利器。与我们一起探索AI的无限可能,开启智慧新时代! 亲爱的技术宅们、办公高手们&#xff0c…

Spring源码-从源码层面讲FactoryBean接口的使用

一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在标签中提供大量的配置信息,配置方式的灵活性是受限的。为此&#xff0c…

Vulnhub靶场DC-8练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 发现sql注入点2. sqlmap跑数据3. John解密4. 反弹shell5. exim4提权 0x04 总结 0x00 准备 下载链接:https://download.vulnhub.com/dc/DC-8.zip 介绍: This challenge is a bi…

助人利人,是自己的需要

96天 【明明德即是亲民】 帮助他人、利益他人,不是他人的需要,而是我们自己的需要,我们需要开发自己内心的宝藏 ~ 心学很简单、很平实,但是在精微之处又是深奥且广大,没有下功夫的人难于描述其中的精妙;…

计算机毕业设计:基于SSM的宠物领养系统

私信获取完整代码 一、选题背景介绍 📖☕️🌊📝📚🎩🚀📣 🎩 宠物领养系统:帮助爱宠人士更好的去查看可以领养的宠物,帮助宣传相关保护宠物相关知识 &…

【二叉树 C++DFS】2458. 移除子树后的二叉树高度

本文涉及知识点 二叉树 CDFS LeetCode 2458. 移除子树后的二叉树高度 给你一棵 二叉树 的根节点 root ,树中有 n 个节点。每个节点都可以被分配一个从 1 到 n 且互不相同的值。另给你一个长度为 m 的数组 queries 。 你必须在树上执行 m 个 独立 的查询&#xff…

深入理解计算机系统 CSAPP 家庭作业11.8

回收子进程是书本537页的内容 在tiny.c文件加以下代码,记得重新编译哦 书中提到CGI是在动态内容中的,所以题目的意思应该是在动态内容里面回收 void handler1(int sig) {int olderrno errno;while (waitpid(-1,NULL,0)>0){Sio_puts("Handler reaped child\n");…

Scrapy 爬取旅游景点相关数据(四)

本节内容主要为: (1)创建数据库 (2)创建数据库表 (3)爬取数据进MYSQL库 1 新建数据库 使用MYSQL数据库存储数据,创建一个新的数据库 create database scrapy_demo;2 新建数据表 CR…

开发者的AI革命:我们仍在敲代码,AI为何没有取代我们的工作?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【区块链+绿色低碳】雄韬智慧锂电储能管理系统 | FISCO BCOS应用案例

雄韬智慧锂电储能管理系统(Energy Management System,以下简称 EMS)是雄韬集团响应国家实现新型电力 系统建设,助力“碳达峰、碳中和”目标而自主开发的创新智慧锂电储能系统。 系统采用了 FISCO BCOS 联盟链,融合了物…

放大电路总结

补充: 只有直流移动时才有Rbe动态等效电阻 从RsUs看进去,实际上不管接了什么东西都能够看成是一个Ri(输入电阻) Ri Ui/Ii Rb//Rbe Ui/Us Ri/(RiRs) Aus (Uo/Ui)*(Ui/Us) Au *Ri/(RiRs) 当前面是一个电压源的信号 我们就需要输入电阻更大 Ro--->输出电阻--->将…

Mybatis(四)特殊SQL的查询:模糊查询、批量删除、动态设置表明、添加功能获取自增的主键

实体类: 数据库: 1、模糊查询 方案一: 不适用#{ },’%?%‘ 问号是属于字符串的一部分 不会被解析成占位符,会被当作是我们字符串的一部分来解析,所以我们执行的语句中找不到占位符,但是我们却…

帕金森病(PD)诊断:三种基于语音的深度学习方法

帕金森病(Parkinson’s disease, PD)是世界上第二大流行的神经退行性疾病,全球影响着超过1000万人,仅次于阿尔茨海默症。人们通常在65岁左右被诊断出患有此病。PD的一些症状包括震颤、肌肉僵硬和运动迟缓。这些症状往往出现在较晚…

跟《经济学人》学英文:2024年07月20日这期 Japan’s strength produces a weak yen

Japan’s strength produces a weak yen Currency meddling will prove futile 货币干预将被证明是徒劳的 meddling:干涉;摸弄;(meddle的现在分词形式) futile: 美 [ˈfjuːtl] 无效的;徒劳…

RKNN3588——YOLOv10的PT模型转RKNN模型

一:PT转ONNX 修改yolov10的源码 1. 修改head.py文件,在lass v10Detect(Detect)中的forward添加 # 导出onnx增加y []for i in range(self.nl):t1 self.one2one_cv2[i](x[i])t2 self.one2one_cv3[i](x[i])y.append(t1)y.append(t2)return y# 导出onnx…

(精校版)高校大数据实验室建设解决方案

在当今数据驱动的时代,大数据已成为推动社会发展的核心动力。高校作为培养未来社会精英和科技创新人才的摇篮,迫切需要建设大数据实验室,以应对日益增长的大数据人才需求和科学研究挑战。大数据实验室不仅能够提供先进的教学资源和实践平台&a…

mysql面试(七)

前言 本章节列出了mysql在增删改查的时候,分别会涉及到哪些锁类型,又是如何交互的。 这个章节也是mysql面试基础系列的最后一章,后面准备更新redis数据类型和分布式锁相关问题。如果各位看官有什么问题的话,可以留言。 锁 之前…

leetocde662. 二叉树最大宽度,面试必刷题,思路清晰,分点解析,附代码详解带你完全弄懂

leetocde662. 二叉树最大宽度 做此题之前可以先做一下二叉树的层序遍历。具体题目如下: leetcode102二叉树的层序遍历 我也写过题解,可以先看看学习一下,如果会做层序遍历了,那么这题相对来说会简单很多。 具体题目 给你一棵…

Vue3+Element Plus 实现table表格中input的验证

实现效果 html部分 <template><div class"table"><el-form ref"tableFormRef" :model"form"><el-table :data"form.detailList"><el-table-column type"selection" width"55" align&…

Wonder3D 论文学习

论文链接&#xff1a;https://arxiv.org/abs/2310.15008 代码链接&#xff1a;https://github.com/xxlong0/Wonder3D 解决了什么问题&#xff1f; 随着扩散模型的提出&#xff0c;3D 生成领域取得了长足进步。从单张图片重建出 3D 几何是计算机图形学和 3D 视觉的基础任务&am…