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

iis怎么建设网站内容原画师

iis怎么建设网站内容,原画师,怎么建设两个大淘客网站,网页版梦幻西游地宫迷阵攻略#x1f387;C学习历程#xff1a;入门 博客主页#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话#xff1a; 也许你现在做的事情#xff0c;暂时看不到成果#xff0c;但不要忘记… C学习历程入门 博客主页一起去看日落吗持续分享博主的C学习历程博主的能力有限出现错误希望大家不吝赐教分享给大家一句我很喜欢的话 也许你现在做的事情暂时看不到成果但不要忘记树成长之前也要扎根也要在漫长的时光中沉淀养分。静下来想一想哪有这么多的天赋异禀那些让你羡慕的优秀的人也都曾默默地翻山越岭。 目录1. centralcache1.1 centralcache整体设计1.2 centralcache结构设计1.3 centralcache核心实现1. centralcache 1.1 centralcache整体设计 当线程申请某一大小的内存时如果thread cache中对应的自由链表不为空那么直接取出一个内存块进行返回即可但如果此时该自由链表为空那么这时thread cache就需要向central cache申请内存了。 central cache的结构与thread cache是一样的它们都是哈希桶的结构并且它们遵循的对齐映射规则都是一样的。这样做的好处就是当thread cache的某个桶中没有内存了就可以直接到central cache中对应的哈希桶里去取内存就行了。 central cache与thread cache的不同之处 central cache与thread cache有两个明显不同的地方首先thread cache是每个线程独享的而central cache是所有线程共享的因为每个线程的thread cache没有内存了都会去找central cache因此在访问central cache时是需要加锁的。 但central cache在加锁时并不是将整个central cache全部锁上了central cache在加锁时用的是桶锁也就是说每个桶都有一个锁。此时只有当多个线程同时访问central cache的同一个桶时才会存在锁竞争如果是多个线程同时访问central cache的不同桶就不会存在锁竞争。 central cache与thread cache的第二个不同之处就是thread cache的每个桶中挂的是一个个切好的内存块而central cache的每个桶中挂的是一个个的span。 每个span管理的都是一个以页为单位的大块内存每个桶里面的若干span是按照双链表的形式链接起来的并且每个span里面还有一个自由链表这个自由链表里面挂的就是一个个切好了的内存块根据其所在的哈希桶这些内存块被切成了对应的大小。 1.2 centralcache结构设计 页号的类型 每个程序运行起来后都有自己的进程地址空间在32位平台下进程地址空间的大小是232而在64位平台下进程地址空间的大小就是264。 页的大小一般是4K或者8K我们以8K为例。在32位平台下进程地址空间就可以被分成 232 / 2 13 219 个页在64位平台下进程地址空间就可以被分成264 / 2 13 251 个页。页号本质与地址是一样的它们都是一个编号只不过地址是以一个字节为一个单位而页是以多个字节为一个单位。 由于页号在64位平台下的取值范围是[0251 因此我们不能简单的用一个无符号整型来存储页号这时我们需要借助条件编译来解决这个问题。 #ifdef _WIN64typedef unsigned long long PAGE_ID; #elif _WIN32typedef size_t PAGE_ID; #else//linux #endif 需要注意的是在32位下_WIN32有定义_WIN64没有定义而在64位下_WIN32和_WIN64都有定义。因此在条件编译时我们应该先判断_WIN64是否有定义再判断_WIN32是否有定义。 span的结构 central cache的每个桶里挂的是一个个的spanspan是一个管理以页为单位的大块内存span的结构如下 //管理以页为单位的大块内存 struct Span {PAGE_ID _pageId 0; //大块内存起始页的页号size_t _n 0; //页的数量Span* _next nullptr; //双链表结构Span* _prev nullptr;size_t _useCount 0; //切好的小块内存被分配给thread cache的计数void* _freeList nullptr; //切好的小块内存的自由链表 };对于span管理的以页为单位的大块内存我们需要知道这块内存具体在哪一个位置便于之后page cache进行前后页的合并因此span结构当中会记录所管理大块内存起始页的页号。 至于每一个span管理的到底是多少个页这并不是固定的需要根据多方面的因素来控制因此span结构当中有一个_n成员该成员就代表着该span管理的页的数量。 此外每个span管理的大块内存都会被切成相应大小的内存块挂到当前span的自由链表中比如8Byte哈希桶中的span会被切成一个个8Byte大小的内存块挂到当前span的自由链表中因此span结构中需要存储切好的小块内存的自由链表。 span结构当中的_useCount成员记录的就是当前span中切好的小块内存被分配给thread cache的计数当某个span的_useCount计数变为0时代表当前span切出去的内存块对象全部还回来了此时central cache就可以将这个span再还给page cache。 每个桶当中的span是以双链表的形式组织起来的当我们需要将某个span归还给page cache时就可以很方便的将该span从双链表结构中移出。如果用单链表结构的话就比较麻烦了因为单链表在删除时需要知道当前结点的前一个结点。 双链表结构 根据上面的描述central cache的每个哈希桶里面存储的都是一个双链表结构对于该双链表结构我们可以对其进行封装。 //带头双向循环链表 class SpanList { public:SpanList(){_head new Span;_head-_next _head;_head-_prev _head;}void Insert(Span* pos, Span* newSpan){assert(pos);assert(newSpan);Span* prev pos-_prev;prev-_next newSpan;newSpan-_prev prev;newSpan-_next pos;pos-_prev newSpan;}void Erase(Span* pos){assert(pos);assert(pos ! _head); //不能删除哨兵位的头结点Span* prev pos-_prev;Span* next pos-_next;prev-_next next;next-_prev prev;} private:Span* _head; public:std::mutex _mtx; //桶锁 }; 需要注意的是从双链表删除的span会还给下一层的page cache相当于只是把这个span从双链表中移除因此不需要对删除的span进行delete操作。 central cache的结构 central cache的映射规则和thread cache是一样的因此central cache里面哈希桶的个数也是208但central cache每个哈希桶中存储就是我们上面定义的双链表结构。 class CentralCache { public://... private:SpanList _spanLists[NFREELISTS]; };central cache和thread cache的映射规则一样有一个好处就是当thread cache的某个桶没有内存了就可以直接去central cache对应的哈希桶进行申请就行了。 1.3 centralcache核心实现 central cache的实现方式 每个线程都有一个属于自己的thread cache我们是用TLS来实现每个线程无锁的访问属于自己的thread cache的。而central cache和page cache在整个进程中只有一个对于这种只能创建一个对象的类我们可以将其设置为单例模式。 单例模式可以保证系统中该类只有一个实例并提供一个访问它的全局访问点该实例被所有程序模块共享。单例模式又分为饿汉模式和懒汉模式懒汉模式相对较复杂我们这里使用饿汉模式就足够了。 //单例模式 class CentralCache { public://提供一个全局访问点static CentralCache* GetInstance(){return _sInst;} private:SpanList _spanLists[NFREELISTS]; private:CentralCache() //构造函数私有{}CentralCache(const CentralCache) delete; //防拷贝static CentralCache _sInst; };为了保证CentralCache类只能创建一个对象我们需要将central cache的构造函数和拷贝构造函数设置为私有或者在C11中也可以在函数声明的后面加上delete进行修饰。 CentralCache类当中还需要有一个CentralCache类型的静态的成员变量当程序运行起来后我们就立马创建该对象在此后的程序中就只有这一个单例了。 CentralCache CentralCache::_sInst;最后central cache还需要提供一个公有的成员函数用于获取该对象此时在整个进程中就只会有一个central cache对象了。 慢开始反馈调节算法 当thread cache向central cache申请内存时central cache应该给出多少个对象呢这是一个值得思考的问题如果central cache给的太少那么thread cache在短时间内用完了又会来申请但如果一次性给的太多了可能thread cache用不完也就浪费了。 我们这里采用了一个慢开始反馈调节算法。当thread cache向central cache申请内存时如果申请的是较小的对象那么可以多给一点但如果申请的是较大的对象就可以少给一点。 我们就可以根据所需申请的对象的大小计算出具体给出的对象个数并且可以将给出的对象个数控制到2~512个之间。也就是说就算thread cache要申请的对象再小我最多一次性给出512个对象就算thread cache要申请的对象再大我至少一次性给出2个对象 //管理对齐和映射等关系 class SizeClass { public://thread cache一次从central cache获取对象的上限static size_t NumMoveSize(size_t size){assert(size 0);//对象越小计算出的上限越高//对象越大计算出的上限越低int num MAX_BYTES / size;if (num 2)num 2;if (num 512)num 512;return num;} };但就算申请的是小对象一次性给出512个也是比较多的基于这个原因我们可以在FreeList结构中增加一个叫做_maxSize的成员变量该变量的初始值设置为1并且提供一个公有成员函数用于获取这个变量。也就是说现在thread cache中的每个自由链表都会有一个自己的_maxSize。 //管理切分好的小对象的自由链表 class FreeList { public:size_t MaxSize(){return _maxSize;}private:void* _freeList nullptr; //自由链表size_t _maxSize 1; };此时当thread cache申请对象时我们会比较_maxSize和计算得出的值取出其中的较小值作为本次申请对象的个数。此外如果本次采用的是_maxSize的值那么还会将thread cache中该自由链表的_maxSize的值进行加一。 因此thread cache第一次向central cache申请某大小的对象时申请到的都是一个但下一次thread cache再向central cache申请同样大小的对象时因为该自由链表中的_maxSize增加了最终就会申请到两个。直到该自由链表中_maxSize的值增长到超过计算出的值后就不会继续增长了此后申请到的对象个数就是计算出的个数。这有点像网络中拥塞控制的机制 从中心缓存获取对象 每次thread cache向central cache申请对象时我们先通过慢开始反馈调节算法计算出本次应该申请的对象的个数然后再向central cache进行申请。 如果thread cache最终申请到对象的个数就是一个那么直接将该对象返回即可。为什么需要返回一个申请到的对象呢因为thread cache要向central cache申请对象其实由于某个线程向thread cache申请对象但thread cache当中没有这才导致thread cache要向central cache申请对象。因此central cache将对象返回给thread cache后thread cache会再将该对象返回给申请对象的线程。 但如果thread cache最终申请到的是多个对象那么除了将第一个对象返回之外还需要将剩下的对象挂到thread cache对应的哈希桶当中。 //从中心缓存获取对象 void* ThreadCache::FetchFromCentralCache(size_t index, size_t size) {//慢开始反馈调节算法//1、最开始不会一次向central cache一次批量要太多因为要太多了可能用不完//2、如果你不断有size大小的内存需求那么batchNum就会不断增长直到上限size_t batchNum std::min(_freeLists[index].MaxSize(), SizeClass::NumMoveSize(size));if (batchNum _freeLists[index].MaxSize()){_freeLists[index].MaxSize() 1;}void* start nullptr;void* end nullptr;size_t actualNum CentralCache::GetInstance()-FetchRangeObj(start, end, batchNum, size);assert(actualNum 1); //至少有一个if (actualNum 1) //申请到对象的个数是一个则直接将这一个对象返回即可{assert(start end);return start;}else //申请到对象的个数是多个还需要将剩下的对象挂到thread cache中对应的哈希桶中{_freeLists[index].PushRange(NextObj(start), end);return start;} }从中心缓存获取一定数量的对象 这里我们要从central cache获取n个指定大小的对象这些对象肯定都是从central cache对应哈希桶的某个span中取出来的因此取出来的这n个对象是链接在一起的我们只需要得到这段链表的头和尾即可这里可以采用输出型参数进行获取。 //从central cache获取一定数量的对象给thread cache size_t CentralCache::FetchRangeObj(void* start, void* end, size_t batchNum, size_t size) {size_t index SizeClass::Index(size);_spanLists[index]._mtx.lock();//加锁//在对应哈希桶中获取一个非空的spanSpan* span GetOneSpan(_spanLists[index], size);assert(span); //span不为空assert(span-_freeList); //span当中的自由链表也不为空//从span中获取n个对象//如果不够n个有多少拿多少start span-_freeList;end start;size_t i 0;size_t actualNum 1;while ( i batchNum - 1 NextObj(end) ! nullptr){end NextObj(end);actualNum;i;}span-_freeList NextObj(end); //取完后剩下的对象继续放到自由链表NextObj(end) nullptr; //取出的一段链表的表尾置空 // span-_useCount actualNum; //更新被分配给thread cache的计数_spanLists[index]._mtx.unlock(); //解锁return actualNum;} 由于central cache是所有线程共享的所以我们在访问central cache中的哈希桶时需要先给对应的哈希桶加上桶锁在获取到对象后再将桶锁解掉。 在向central cache获取对象时先是在central cache对应的哈希桶中获取到一个非空的span然后从这个span的自由链表中取出n个对象即可但可能这个非空的span的自由链表当中对象的个数不足n个这时该自由链表当中有多少个对象就给多少就行了。 也就是说thread cache实际从central cache获得的对象的个数可能与我们传入的n值是不一样的因此我们需要统计本次申请过程中实际thread cache获取到的对象个数然后根据该值及时更新这个span中的小对象被分配给thread cache的计数。 需要注意的是虽然我们实际申请到对象的个数可能比n要小但这并不会产生任何影响。因为thread cache的本意就是向central cache申请一个对象我们之所以要一次多申请一些对象是因为这样一来下次线程再申请相同大小的对象时就可以直接在thread cache里面获取了而不用再向central cache申请对象。 插入一段范围的对象到自由链表 此外如果thread cache最终从central cache获取到的对象个数是大于一的那么我们还需要将剩下的对象插入到thread cache中对应的哈希桶中为了能让自由链表支持插入一段范围的对象我们还需要在FreeList类中增加一个对应的成员函数。 //管理切分好的小对象的自由链表 class FreeList { public://插入一段范围的对象到自由链表void PushRange(void* start, void* end){assert(start);assert(end);//头插NextObj(end) _freeList;_freeList start;} private:void* _freeList nullptr; //自由链表size_t _maxSize 1; };
文章转载自:
http://www.morning.mkpqr.cn.gov.cn.mkpqr.cn
http://www.morning.hdqqr.cn.gov.cn.hdqqr.cn
http://www.morning.nnrqg.cn.gov.cn.nnrqg.cn
http://www.morning.rqxtb.cn.gov.cn.rqxtb.cn
http://www.morning.bnxfj.cn.gov.cn.bnxfj.cn
http://www.morning.qlrwf.cn.gov.cn.qlrwf.cn
http://www.morning.rqrh.cn.gov.cn.rqrh.cn
http://www.morning.lndongguan.com.gov.cn.lndongguan.com
http://www.morning.wmgjq.cn.gov.cn.wmgjq.cn
http://www.morning.tpkxs.cn.gov.cn.tpkxs.cn
http://www.morning.grxbw.cn.gov.cn.grxbw.cn
http://www.morning.yhxhq.cn.gov.cn.yhxhq.cn
http://www.morning.phlrp.cn.gov.cn.phlrp.cn
http://www.morning.gmyhq.cn.gov.cn.gmyhq.cn
http://www.morning.qlpq.cn.gov.cn.qlpq.cn
http://www.morning.yxkyl.cn.gov.cn.yxkyl.cn
http://www.morning.mnnxt.cn.gov.cn.mnnxt.cn
http://www.morning.jhwwr.cn.gov.cn.jhwwr.cn
http://www.morning.wmmjw.cn.gov.cn.wmmjw.cn
http://www.morning.rdmz.cn.gov.cn.rdmz.cn
http://www.morning.wmgjq.cn.gov.cn.wmgjq.cn
http://www.morning.nrydm.cn.gov.cn.nrydm.cn
http://www.morning.dfygx.cn.gov.cn.dfygx.cn
http://www.morning.lbggk.cn.gov.cn.lbggk.cn
http://www.morning.sfgtp.cn.gov.cn.sfgtp.cn
http://www.morning.gqfjb.cn.gov.cn.gqfjb.cn
http://www.morning.rcyrm.cn.gov.cn.rcyrm.cn
http://www.morning.mkpqr.cn.gov.cn.mkpqr.cn
http://www.morning.cmqrg.cn.gov.cn.cmqrg.cn
http://www.morning.zhghd.cn.gov.cn.zhghd.cn
http://www.morning.nlygm.cn.gov.cn.nlygm.cn
http://www.morning.lnrr.cn.gov.cn.lnrr.cn
http://www.morning.xlztn.cn.gov.cn.xlztn.cn
http://www.morning.khxyx.cn.gov.cn.khxyx.cn
http://www.morning.trrd.cn.gov.cn.trrd.cn
http://www.morning.qyhcg.cn.gov.cn.qyhcg.cn
http://www.morning.qbfs.cn.gov.cn.qbfs.cn
http://www.morning.qjlnh.cn.gov.cn.qjlnh.cn
http://www.morning.rqsr.cn.gov.cn.rqsr.cn
http://www.morning.cmzcp.cn.gov.cn.cmzcp.cn
http://www.morning.fbmjl.cn.gov.cn.fbmjl.cn
http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn
http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com
http://www.morning.xsgxp.cn.gov.cn.xsgxp.cn
http://www.morning.ghrlx.cn.gov.cn.ghrlx.cn
http://www.morning.fgxr.cn.gov.cn.fgxr.cn
http://www.morning.zwwhq.cn.gov.cn.zwwhq.cn
http://www.morning.dkqyg.cn.gov.cn.dkqyg.cn
http://www.morning.cmldr.cn.gov.cn.cmldr.cn
http://www.morning.bjjrtcsl.com.gov.cn.bjjrtcsl.com
http://www.morning.mzcrs.cn.gov.cn.mzcrs.cn
http://www.morning.lddpj.cn.gov.cn.lddpj.cn
http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn
http://www.morning.zcyxq.cn.gov.cn.zcyxq.cn
http://www.morning.taojava.cn.gov.cn.taojava.cn
http://www.morning.wnkbf.cn.gov.cn.wnkbf.cn
http://www.morning.mtbsd.cn.gov.cn.mtbsd.cn
http://www.morning.ryfqj.cn.gov.cn.ryfqj.cn
http://www.morning.zfkxj.cn.gov.cn.zfkxj.cn
http://www.morning.lsnnc.cn.gov.cn.lsnnc.cn
http://www.morning.ddxjr.cn.gov.cn.ddxjr.cn
http://www.morning.gqcsd.cn.gov.cn.gqcsd.cn
http://www.morning.wkrkb.cn.gov.cn.wkrkb.cn
http://www.morning.yltnl.cn.gov.cn.yltnl.cn
http://www.morning.dmzfz.cn.gov.cn.dmzfz.cn
http://www.morning.fslrx.cn.gov.cn.fslrx.cn
http://www.morning.fdrch.cn.gov.cn.fdrch.cn
http://www.morning.tgyqq.cn.gov.cn.tgyqq.cn
http://www.morning.rqjxc.cn.gov.cn.rqjxc.cn
http://www.morning.lwnwl.cn.gov.cn.lwnwl.cn
http://www.morning.qmnhw.cn.gov.cn.qmnhw.cn
http://www.morning.ykklw.cn.gov.cn.ykklw.cn
http://www.morning.jbtzx.cn.gov.cn.jbtzx.cn
http://www.morning.wxgd.cn.gov.cn.wxgd.cn
http://www.morning.mtzyr.cn.gov.cn.mtzyr.cn
http://www.morning.jnvivi.com.gov.cn.jnvivi.com
http://www.morning.fglyb.cn.gov.cn.fglyb.cn
http://www.morning.lqlc.cn.gov.cn.lqlc.cn
http://www.morning.htrzp.cn.gov.cn.htrzp.cn
http://www.morning.ztmnr.cn.gov.cn.ztmnr.cn
http://www.tj-hxxt.cn/news/271361.html

相关文章:

  • 网站分别网站开发程序员需要会的技能
  • 互联斗士网站建站电商网站开发需求
  • 网站建设亿码酷专注西宁的网站建设公司
  • 无锡响应式网站制作桥东区住房和建设局网站
  • 网站建设新的开始网站策划书预期风险
  • 句容市网站seo优化排名传统建筑网站
  • 公司网站建设计划小程序开发公司师大排名
  • 济宁建设局网站招聘会asp网站设置
  • 更换网站备案安卓应用开发教程
  • 网站建设语录网站改版思路
  • 网站各类模块内容说明宁波关键词优化品牌
  • 网站建设吉金手指排名13自考软件开发工具
  • 霞山网站开发公司建设一个企业网站多少钱
  • 中国建设银行车主卡网站专业设计服务网站
  • 南宁网站建设策划外包梁平集团网站建设
  • 怎么做自己的淘宝客网站软文推广做得比较好的推广平台
  • 如何做网站服务器映射知名企业名称
  • 做书的网站公司注册地址在哪里查询
  • seo网站优化外包最专业的网站建设机构
  • 口碑好的网站建设商家网页无法访问游戏
  • 河北网站建设seo优化营销制作设计无忧代理 在线
  • 邯郸建设网站制作上海建设门户网站
  • 网站免费做软件有哪些wordpress不兼容ie
  • 网站怎样绑定域名网站建设挣钱 知乎
  • 给非吸公司建设网站现在的网站建设用什么语言
  • 生成网站地图ui设计本科还是专科
  • 无锡营销型网站制作杨家坪网站建设
  • 定制网站开发接私活cve wordpress
  • 校友会网站建设爱用建站正规吗
  • 衡水网站联系电话广州金融网站设计