购买服务器后如何做网站中成网站建设

pingmian/2025/10/8 5:02:37/文章来源:
购买服务器后如何做网站,中成网站建设,ppt做的模板下载网站有哪些内容,如何在电脑上建网站#x1f493;博主CSDN主页:杭电码农-NEO#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   #x1f69a;代码仓库:NEO的学习日记#x1f69a;   #x1f339;关注我#x1faf5;带你做项目   #x1f51d;#x1f51d; 开发环境: Visual Studio 2022 项目日… 博主CSDN主页:杭电码农-NEO   ⏩专栏分类:项目日记-高并发内存池⏪   代码仓库:NEO的学习日记   关注我带你做项目   开发环境: Visual Studio 2022 项目日记 1. 前言2. 页缓存的具体结构3. 页缓存分配内存的全过程4. 页缓存分配内存的代码实现5. 优化代码,并完全脱离malloc6. 总结以及代码拓展 1. 前言 在页缓存这一层中,负责给中心缓存 分配大块儿的内存,以及合并前后空 闲的内存,这一层为整体加锁! 本章重点: 本篇文章着重讲解内存池第三层: 页缓存的基本成员变量和函数,以 页缓存的具体结构是怎样的.了解 完基础结构后,会详解讲解中心缓存 层来申请内存时的具体步骤! 2. 页缓存的具体结构 页缓存也是一个哈希桶结构,但它的映射 规则和前两层不同,它的规则是: K号桶中的大块儿内存就是K页 并且它总共是有128号桶,申请小于 128页的内存都会在内存池中申请 //单例模式 class PageCache { public:static PageCache* GetInstance(){return _singleton;}//获取一个K页的spanSpanData* NewSpan(size_t k);std::mutex _mtx;//pagecache不能用桶锁,只能用全局锁,因为后面可能会有大页被切割为小页// 获取从对象到span的映射,给我一个地址,返回这个地址对应的spanSpanData* MapObjectToSpan(void* obj);// 释放空闲span回到Pagecache并合并相邻的spanvoid ReleaseSpanToPageCache(SpanData* span); private:PageCache(){}PageCache(const PageCache obj) delete; private:std::unordered_mapPAGE_ID, SpanData* _idSpanMap;//存储页号和桶中对应的span的映射,解决换回来的内存对应哪个span的问题SpanList _spanList[N_PAGES];static PageCache _singleton; };3. 页缓存分配内存的全过程 当中心缓存中没有内存时,会去页缓存 申请一个span结构,要经过下面几步: 根据中心缓存的桶号来确定申请的span是几页的   根据中心缓存想要申请的页数,找到页缓存中对应的桶(k页对应k号桶)   情况一: 页缓存的K号桶中存在span结构,直接将这块儿内存返回给中心缓存   情况二: 页缓存的K号桶没有span结构,但是K1到128号桶中存在span结构,假设n号桶有span,则将这个大页的span切分为一个k页的span和一个n-k页的span,k页的span返回给中心缓存去使用,而将n-k页的span重新挂在n-k号桶中   情况三: k到128号桶都没有span,此时页缓存会向系统申请一份128页大小的内存,并挂在128号桶中,再将这个128页的span切分为k页的span和128-k页的span,也就转换为了情况二!   并且在这个过程中,页缓存将一个span 分配给中心缓存后,会记录下来这块儿 内存的页号和span的映射关系,方便后续 回收内存的时候再使用! 4. 页缓存分配内存的代码实现 在pagecache.h文件中: SpanData* PageCache::NewSpan(size_t k)//去第K个桶中找span给central,此i号桶中挂的span都是i页内存 {//若K桶中有,直接返回,K桶没有span就往后找去分裂大spanassert(k 0);if (k N_PAGES - 1)//如果申请的页数大于了128页,pagecache只能向堆申请了{void* ptr SystemAlloc(k);SpanData* span new SpanData();span-_pageid (PAGE_ID)ptr PAGE_SHIFT;span-_n k;_idSpanMap[span-_pageid] span;return span;}//先检查K号桶有无span,有直接返回一个if (!_spanList[k].Empty()){SpanData* KSpan _spanList[k].PopFront();for (PAGE_ID i 0; i KSpan-_n; i)_idSpanMap[KSpan-_pageid i] KSpan;return KSpan;}//走到这儿代表k号桶为空,检查后面的桶有没有span,拿出来分裂成两个小spanfor (int i k 1; i N_PAGES; i){if (!_spanList[i].Empty())//k页的span返回给centralcache,i-k页的span挂到i-k号桶中{SpanData* ISpan _spanList[i].PopFront();SpanData* KSpan new SpanData;KSpan-_pageid ISpan-_pageid;KSpan-_n k;ISpan-_pageid k;//把头K页切分给KSpanISpan-_n - k; //页数从i变为i-k_spanList[ISpan-_n].PushFront(ISpan);//再将后i-k页分配给i-k号桶//存储Ispan的首尾页号跟ISpan的映射关系// 这里只需要映射首尾页而不需要像下面一样全部页都映射,因为下面切分出去的span会被切分为小块儿内存// 这些小块儿内存都有可能被使用,所以当它们还回来时这些小块儿内存可能映射的是不同的页,但这些页都属于这个KSpan// 然而ISpan中不会被切分为小块儿内存,它只需要关心是否和它的前后页合并,所以这里只需要映射首尾页号与ISpan的关系// ISpan作为要合并页的前面,如1000页要合并ISpan是1001页,那么1001到1001n都是空闲的!ISpan作为要合并页的后面,如100页要合并ISpan是999页,那么999-n都是空闲的!//_idSpanMap[ISpan-_pageid] ISpan;//_idSpanMap[ISpan-_pageid ISpan-_n - 1] ISpan;_idSpanMap.set(ISpan-_pageid, ISpan);_idSpanMap.set(ISpan-_pageid ISpan-_n - 1, ISpan);//建立id和span的映射关系,方便centralcache回收小块内存时查看哪块内存在哪块spanfor (PAGE_ID i 0; i KSpan-_n; i)//返回的KSpan中一共有n页,并且每一页的页号都对应KSpan这个地址_idSpanMap[KSpan-_pageid i] KSpan;return KSpan;}}//走到这里说明后面所有的桶都没有span了//这时需要向堆申请一个128页的span再拿来做切分SpanData* bigSpan _spanPool.New();void* ptr SystemAlloc(N_PAGES - 1);bigSpan-_pageid (PAGE_ID)ptr PAGE_SHIFT;bigSpan-_n N_PAGES - 1;_spanList[bigSpan-_n].PushFront(bigSpan);//将这个128页的span插入到桶中return NewSpan(k);//再次调用自己,这次一定会在前面的for循环处返回 }这个地方有一个设计的比较巧妙的点, 那就是出现情况三的时候,向系统申请了 128页的空间后,再次调用这个函数就一定 会出现情况二,从而在for循环中走完整个过程 5. 优化代码,并完全脱离malloc 细心的同学会发现,在这个函数中使用到了new操作符,然而了解new底层原理的同学应该知道,new的底层实际上是用的malloc来申请的空间,但是我们这个项目就是为了完全脱离malloc函数来实现一个多线程下高效的内存池,所以这里一定不能使用new! 使用之前编写的定长池来舍弃new! 如果你不知道或忘记了定长池是什么 请看这篇文章: 定长池的实现 首先, 在页缓存类中添加上一个成员变量: 定长池类, 然后在使用new的地方,把new全部替换为用定长池申请空间! 6. 总结以及代码拓展 页缓存分配内存的一环设计的是 非常的巧妙,但是页缓存真正巧妙 的地方是在合并空闲内存的一环! 对代码的拓展: 我们会发现页缓存结构中调用了 好几次向系统申请内存的函数, 这个地方只做了解,会用接口就行 inline static void* SystemAlloc(size_t kpage)//申请kpage页内存 { #ifdef _WIN32void* ptr VirtualAlloc(0, kpage PAGE_SHIFT, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); #else// linux下brk mmap等直接向系统申请内存的方式 #endifif (ptr nullptr)throw std::bad_alloc();return ptr; }下期预告:页缓存的具体实现(下)

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

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

相关文章

企业网站网络推广怎么做杭州做网站

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 100. 相同的树 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在…

成都市双流区建设局官方网站移动端网站建设公司

LeetCode209——长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数…

企业建设3D网站网站的目的及功能规划

桥接模式的定义 C的桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系,将系统划分成多个独立的、功能不同的类层次结…

做自己个人网站南宁网站推广工具

转载公众号 | AI机器学习与知识图谱本文介绍六篇有关知识图谱预训练的优秀论文,大致上可分为两类,生成学习模型和对比学习模型。其中GPT-GNN模型是生成学习模型,模型灵感来源于自然语言处理中的GPT模型;GCC,GraphCL&am…

大连网站关键词排名西安公关公司

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s "cbaebabacd", p "…

一个返利网站建设流程网站可以做参考文献吗

题目描述(1) 1662. 检查两个字符串数组是否相等 . - 力扣(LeetCode) 给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false 。 数组表示的字符串…

海外网站服务器下载西宁做网站君博解决

我们知道存储器都是有多个芯片组合而成的,必然涉及到片选,因此我们将地址分开看 前面的一部分,是片选,也就是选中某个芯片(使用译码器,2-4译码器就是2位地址可以选择4个芯片)后面的部分&#x…

网站运营与管理的对策百度seo快速排名优化服务

本文介绍如何在Qt中组件的添加、删除或更新。 概述 有时安装完qt后发现当前的组件需要进一步调整,这时就需要进一步操作安装的文件。 QT的组件管理软件并没有在开始菜单或者桌面添加快捷方式(5.9版本),也没有在代码编辑界面设置相关的选项,藏的比较深。 操作步骤 找到…

网上交易平台网站建设公司韶关专业网站建设教程

https://www.zachstronaut.com/posts/2009/02/09/careful-with-php-empty.html转载于:https://www.cnblogs.com/qinqiu/p/9606348.html

朝阳网站seo博客做网站

从上面可以看出DM9000的地址总线就一根,它不像CS8900那样地址总线和数据总线都齐全。而这里只有一根地址线(CMD),16跟数据线,所以可以确定位宽为16位,而地址线为什么只有一根,这是DM9000决定的,看手册可以知…

网站开发语言数据库有几种室内设计效果图马克笔

Java 与JNI 内存管理是怎样的想要弄清楚Java与JNI的内存管理的关系,首先要弄清楚JVM的内存模型JVM内存模型.png其中本地方法栈就是运行时调用native 方法的数据保存区。本地方法栈的大小可以设置成固定的或者是动态扩展。Java中的内存泄露JAVA 编程中的内存泄漏&…

自助健站淄博周村专业网站建设公司

前言 本文是该专栏的第39篇,后面会持续分享python的各种干货知识,值得关注。 在本专栏之前,有详细介绍使用python增加b站视频的播放量方法,感兴趣的同学可往前翻阅《Python-增加b站视频播放量》。而本文,笔者再来单独的详细介绍,通过python来获取b站视频的弹幕内容。如下…

织梦怎么做门户网站2023年专升本最新政策

原标题:空开D/C是什么意思?终于有人把它说清楚了!空气开关是每个人家里必用的东西,但是你到五金店一看,大大小小的开关插座多了去,让人眼花缭乱。怎么选呢?空开有各种字母型号,这些字…

网站建设初步认识的实训体会北京网络推广有哪些公司

其实按理说远程工具例如向日葵、Todesk如果是计算机专业、计算机从业者是必须知道的一个东西,但是在大学期间身边知道的人是少之又少的。 向日葵、Todesk工具的优势:方便、快捷、速度快等等我就不过多阐述了 PS:现在我就是在学校用远程写这篇 很多时候…

wordpress上传错误500站长工具seo综合查询

创建Service应用,是一个服务端开发的必会技能。前言说到服务端应用,最常见的就是API服务。除此之外,还有一类应用,比方一个Socket的服务器。这类型的应用,本身没有Web层,当然也不属于API服务。通常大家会怎…

产品宣传类网站设计注意网页开发软件有哪些

在经过Web3项目一实战之一到Web3项目实战之六的过程中,您已然擢升为一个拥有Web3项目开发实战的Web3开发工程师了,当然咯,您也可以很自豪地对自己发自内心的欢呼,“我特么,现在也算是一个区块链开发工程师了!” 既然有了Web3项目一实战的经验,那么,对于使用脚手架来创建…

网站游戏网站怎么建设效果图制作合同范本

现在许多项目都使用jwt来实现用户登录和数据权限,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才…

四川手机网站建设网站关键词在哪里做

量化大型语言模型(llm)是减少这些模型大小和加快推理速度的最流行的方法。在这些技术中,GPTQ在gpu上提供了惊人的性能。与非量化模型相比,该方法使用的VRAM几乎减少了3倍,同时提供了相似的精度水平和更快的生成速度。 ExLlamaV2是一个旨在从…

vs做网站网页美工图片

更多原创文章可关注微信公众号:地下城勤帝 查看大家好,我是勤帝,我只写大家能看懂的文章搬砖市场的角色更新了一些,装备都有所不同,今天我给大家一个可以通用的装备,这套装备虽然成型不快,但是…

怎么建设课程的网站两个网站php 一个空间

自我介绍 1.自我介绍2.快手实习难点:上锁函数 防抖函数结合亮点:技术选型 Uber实习auth0 原理 1.自我介绍 (乖巧,听话的声音) 好的,面试官你好。我是一名前端开发工程师,叫李小菲,…