当前位置: 首页 > news >正文

吉安市建设局图审中心网站简单网页代码html

吉安市建设局图审中心网站,简单网页代码html,国外网站做调查,网络营销和传统营销的关系#x1f493;博主CSDN主页:杭电码农-NEO#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   #x1f69a;代码仓库:NEO的学习日记#x1f69a;   #x1f339;关注我#x1faf5;带你做项目   #x1f51d;#x1f51d; 开发环境: Visual Studio 2022 项目日… 博主CSDN主页:杭电码农-NEO   ⏩专栏分类:项目日记-高并发内存池⏪   代码仓库:NEO的学习日记   关注我带你做项目   开发环境: Visual Studio 2022 项目日记 1. 前言2. ThreadCache结构设计3. 哈希桶中的内存对齐规则4. 线程缓存申请内存的全过程5. 线程缓存释放内存的全过程6. 对项目边角代码的拓展 1. 前言 由于此项目需要创建多个文件 所以我直接在.h文件中既放声明 也存放实现,减少文件的数量 本章重点: 本篇文章着重讲解ThreadCache线程 缓存结构的具体实现,包含内存对齐的 方法,申请/释放内存的函数以及向中心 缓存中索要/还回内存的函数!本篇文章 大多数都是代码实现,请大家耐心学习 2. ThreadCache结构设计 在上一章谈到,线程缓存是一个哈希桶结构 每个桶中存放的是自由链表(小块儿内存) 由于自由链表不止在ThreadCache中使用,所以定义一个shared.h存放所有文件共享的内容! shared.h文件中的自由链表结构: //管理切分好的小对象的自由链表 class FreeList { public:void Push(void* obj){assert(obj);//头插*(void**)obj _freeList;_freeList obj;_size;}void PushRange(void* start, void* end, size_t n)//范围型的插入{*(void**)end _freeList;_freeList start;_size n;}void* Pop(){assert(_freeList);//头删void* obj _freeList;_freeList *(void**)obj;--_size;return obj;}void PopRange(void* start, void* end, size_t n)//start和end是输出型参数{assert(n _size);start _freeList;end start;for (int i 0; i n - 1; i)end *(void**)end;_freeList *(void**)end;*(void**)end nullptr;_size - n;}bool Empty(){return _freeList nullptr;}size_t MaxSize(){return _maxSize;}size_t Size(){return _size;} private:void* _freeList nullptr;size_t _maxSize 1;//记录ThreadCache一次性最多向CentralCache申请多少个对象size_t _size 0;//记录自由链表中挂的内存个数 };关于什么是自由链表的问题我们在 定长池的实现中已经讲解过了,如果 你不懂,简易从头开始看博客,学项目! 前置文章: 定长池的实现 然后在ThreadCache.h中,需要实现以下函数 class ThreadCache { public://向线程缓存申请内存void* Allocate(size_t size);//向线程缓存释放内存void Deallocate(void* ptr, size_t size);// 从中心缓存获取对象void* FetchFromCentralCache(size_t index, size_t size);// 释放对象时链表过长时回收内存回到中心缓存void ListTooLong(FreeList list, size_t size); private:FreeList _freeList[208]; };3. 哈希桶中的内存对齐规则 你可能会有以下问题: 为什么上面写的哈希桶个数是208?要是遇见不规则的字节数该怎么办? 这里用到一个非常巧妙的方法,也就是内存对齐!比如想要申请1~7字节的内存,先把它对齐为8字节再进行后续的操作,这么做的原因有两个: 一是因为如果申请多少内存就给多少内存,那么我们需要的哈希桶的数量就太多了,不合理. 二是因为释放内存时比较方便 内存对齐的具体规则: 这里有一个问题: 为什么不都使用8字节对齐? 因为若使用8字节对齐,共256KB内存 一共要使用三万多个桶,也是不合理的 这样的对齐方式只用使用208个桶! 对齐规则的具体实现: static inline size_t AlignUp(size_t size)//将size向上对齐 {if (size 128)return _AlignUp(size, 8);else if (size 1024)return _AlignUp(size, 16);else if (size 8 * 1024)return _AlignUp(size, 128);else if (size 64 * 1024)return _AlignUp(size, 1024);else if (size 256 * 1024)return _AlignUp(size, 8*1024);elsereturn _AlignUp(size, 1 PAGE_SHIFT); } static inline size_t _AlignUp(size_t size, size_t align_number) {return (((size)align_number - 1) ~(align_number - 1)); }4. 线程缓存申请内存的全过程 首先,要先把申请的内存进行内存对齐 然后再用这个对齐后的内存去找对应 的哈希桶结构,若这个桶中有小块儿内 存,那么直接将小块儿内存返回,若桶中 没有内存了,就去中心缓存中拿内存! void* ThreadCache::Allocate(size_t size) {assert(size MAX_BYTES);//申请的字节数不能大于了256KBsize_t align_size AlignmentRule::AlignUp(size);//计算对齐数size_t index AlignmentRule::Index(size);//计算在哪个桶if (!_freeList[index].Empty())//若当前自由链表有资源则优先拿释放掉的资源return _freeList[index].Pop();else//自由链表没有就从中心缓存获取空间return ThreadCache::FetchFromCentralCache(index, align_size); }注:计算在哪个桶的函数会放在文章最后 当走到else语句,也就是要去中心缓存获取内存时,会有个问题:一次性拿几个小块儿内存过来?拿多了怕浪费,拿少了又怕要重新再来拿,这里采用的是慢启动的算法,第一次先拿一个,第二次再拿两个,以此类推.除此之外,小对象应该多拿,大对象应该少拿.所以拿的个数应该是这两个条件中较小的内一个 void* ThreadCache::FetchFromCentralCache(size_t index, size_t size) {//采用慢开始的反馈调节算法,小对象给多一点,大对象给少一点size_t massNum min(_freeList[index].MaxSize(),AlignmentRule::NumMoveSize(size));//向中心缓存获取多少个对象if (_freeList[index].MaxSize() massNum)//慢增长,最开始一定是给1,不会一次性给它很多内存,若不断有size大小的内存需求,再慢慢多给你_freeList[index].MaxSize() 1;void* begin nullptr;void* end nullptr;//需要massnum个对象,但是实际上不一定有这么多个,返回值为实际上获取到的个数size_t fact CentralCache::GetInstance()-CentralCache::FetchRangeObj(begin,end,massNum,size);//要massmun个对象,每个对象的大小是sizeassert(fact ! 0);if (fact 1){assert(begin end);return begin;}else{//如果从中心缓存获取了多个,则将第一个返回给threadcachee,然后再将剩余的内存挂在threadcache的自由链表中_freeList[index].PushRange((*(void**)begin), end, fact - 1);return begin;}return nullptr; }注: 根据对象大小获取个数的函数放在文章最后 FetchRangeObj函数是中心缓存要关心的东西 5. 线程缓存释放内存的全过程 由于申请内存时已经内存对齐了,所以释放的内存肯定是已经对齐过的了,找到对应的桶,直接将这个小块儿内存挂在桶后面,若当换回来的内存在自由链表中的长度大于一次性向中心缓存申请的长度,就将内存还给中心缓存 void ThreadCache::Deallocate(void* ptr, size_t size) {assert(ptr);assert(size MAX_BYTES);//找到对应的自由链表桶[[0,208]size_t index AlignmentRule::Index(size);_freeList[index].Push(ptr);//当换回来的内存在自由链表中的长度大于一次性向中心缓存申请的长度,就将内存还给中心缓存if (_freeList[index].Size() _freeList[index].MaxSize())ListTooLong(_freeList[index],size); } void ThreadCache::ListTooLong(FreeList list, size_t size)//大于等于一个批量内存就还回去一个批量,不一定全部还回去 {void* start nullptr;void* end nullptr;list.PopRange(start, end, list.MaxSize());//start和end是输出型参数CentralCache::GetInstance()-ReleaseListToSpans(start, size); }注:ReleaseListToSpans函数是中心缓存需要关心的 6. 对项目边角代码的拓展 这里存放的是shared.h文件中,存放 如何通过字节数来找到对应的桶的函数 以及慢增长函数的具体实现: 慢增长函数: static const size_t MAX_BYTES 256 * 1024; //最大内存限制,256KB static const size_t N_FREE_LIST 208; //哈希桶的数量static size_t NumMoveSize(size_t size)//此函数代表从中心缓存取多少个对象(和慢增长对比) {assert(size 0);// [2, 512]一次批量移动多少个对象的(慢启动)上限值// 小对象一次批量上限高// 大对象一次批量上限低int num MAX_BYTES / size; //256KB除单个对象大小if (num 2)//最少给2个num 2;if (num 512)//最大给512个num 512;return num; }通过字节数计算在哪个桶: // 计算映射的哪一个自由链表桶 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];elsereturn -1; } static inline size_t _Index(size_t bytes, size_t align_shift) {return ((bytes (1 align_shift) - 1) align_shift) - 1; }对于边角的函数,我们了解它的原理即可 不需要完全掌握它是如何实现的! 下期预告:中心缓存的具体实现
http://www.hkea.cn/news/14454768/

相关文章:

  • 海南专业网站建设内蒙古高等级公路建设开发有限责任公司网站
  • 佛山网站制作哪个好薇wordpress网站采集插件
  • 丰都网站wordpress表单文件上传
  • 合肥 做网站深圳龙华区教师招聘
  • 织梦网站栏目调用开公众号
  • WordPress类似论坛主题济宁网站建设 优化培训
  • 网站首页被k 不恢复制作ppt教程视频自学
  • 展览网站模板无锡哪里有建设网站
  • 做版面的网站阳江做网站
  • 建站工作室网站源码网站开发案例详解pdf
  • 做网站维护工资多少驾校网站建设方案
  • 长子网站建设做网站的主要内容
  • 网站超市系统 源码h5案例
  • 亿网中国网站管理系统岷县网站建设
  • 网站推广和网络推广网站合作建设合同
  • 做微整去那个网站找好的医院wordpress 定时计划失败
  • 建设网站和ipv4和ipv6什么关系即墨公司做网站
  • 怎么做网站的步骤游戏开发可以自学吗
  • 建个网站用多少钱工业设计公司属于什么行业
  • 网站推广推广网站的线下推广怎么做的
  • 服务器出租网站做个电商平台需要哪些步骤
  • 如何做盗版视频网站怎么自己制作网站
  • 查询公司的网站备案信息215做网站
  • 前端网站开发教程电商网站建设功能需求
  • 青鸟网站开发实例seo人才招聘
  • 为什么找不到做网站的软件内蒙古互联网公司哪里最多
  • 做网站违反广告法手机网站建设哪家有
  • 合肥地区网站制作网站开发与设计总结
  • 区块链网站开发费用wordpress采集自动伪原创
  • 赤峰市哪里做网站陕西一建2022停考