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

江苏网站建设工作室做封面图什么网站

江苏网站建设工作室,做封面图什么网站,云购系统商城网站建设,农村电商网站建设ppt利用无锁工作队列的Web服务器设计 项目地址https://github.com/whitehat32/webserver_no_lock 基本流程与牛客版的一致#xff0c;下面放一个牛客版的流程框图 引言 在Web服务器的设计与实现中#xff0c;性能优化是永远不会过时的话题。一般来说#xff0c;Web服务器需…利用无锁工作队列的Web服务器设计 项目地址https://github.com/whitehat32/webserver_no_lock 基本流程与牛客版的一致下面放一个牛客版的流程框图 引言 在Web服务器的设计与实现中性能优化是永远不会过时的话题。一般来说Web服务器需要能够有效地处理大量并发请求。在多线程环境中工作队列的设计尤为关键。传统的工作队列通常涉及使用锁例如互斥锁来确保线程安全但这可能导致性能瓶颈。本博客文章将探讨一种全新的Web服务器设计其主要特点是工作队列在访问任务时不使用锁。 为什么避免使用锁 在多线程环境下许多Web服务器使用锁来确保多线程能够安全地访问共享资源。但是锁操作可能导致线程阻塞进而增加CPU上下文切换影响性能。 /* 线程池部分的代码 */ #ifndef THREADPOOL_H #define THREADPOOL_H // ...省略部分代码 std::thread([pool pool_, pi] {while(true) {if(!pool-tasks[p].empty()) {std::functionvoid() task;if(pool-tasks[p].pop(task)) task();else continue;} else if(pool-isClosed) break;} }).detach(); // ...省略部分代码 #endif //THREADPOOL_H上面的代码片段展示了如何在多线程环境中避免使用锁。这是通过使用无锁队列Lock-Free Queue实现的该队列使用原子操作来确保线程安全。 无锁工作队列的设计与实现 数据结构选择 本博文选择了单生产者单消费者SPSC无锁队列作为基础数据结构。这样可以利用原子操作来避免传统锁带来的性能问题。 // 无锁队列定义 /** File: SpScLockFreeQueue.h* Author: Sander Jobing** Created on July 29, 2017, 5:17 PM** This class implements a Single Producer - Single Consumer lock-free and* wait-free queue. Only 1 thread can fill the queue, another thread can read* from the queue, but no more threads are allowed. This lock-free queue* is a fifo queue, the first element inserted is the first element which* comes out.** Thanks to Timur Doumler, Juce* https://www.youtube.com/watch?vqdrp6k4rcP4*/#ifndef SPSCLOCKFREEQUEUE_H #define SPSCLOCKFREEQUEUE_H#include array #include atomic #include casserttemplate typename T, size_t fixedSize class SpScLockFreeQueue { public:///---------------------------------------------------------------------------/// brief Constructor. Asserts when the underlying type is not lock freeSpScLockFreeQueue(){std::atomicsize_t test;assert(test.is_lock_free());}SpScLockFreeQueue(const SpScLockFreeQueue src) delete;virtual ~SpScLockFreeQueue(){}///---------------------------------------------------------------------------/// brief Returns whether the queue is empty/// return True when emptybool empty() const noexcept{bool isEmpty false;const size_t readPosition m_readPosition.load();const size_t writePosition m_writePosition.load();if (readPosition writePosition){isEmpty true;}return isEmpty;}///---------------------------------------------------------------------------/// brief Pushes an element to the queue/// param element The element to add/// return True when the element was added, false when the queue is fullbool push(const T element){const size_t oldWritePosition m_writePosition.load();const size_t newWritePosition getPositionAfter(oldWritePosition);const size_t readPosition m_readPosition.load();if (newWritePosition readPosition){// The queue is fullreturn false;}m_ringBuffer[oldWritePosition] element;m_writePosition.store(newWritePosition);return true;}///---------------------------------------------------------------------------/// brief Pops an element from the queue/// param element The returned element/// return True when succeeded, false when the queue is emptybool pop(T element){if (empty()){// The queue is emptyreturn false;}const size_t readPosition m_readPosition.load();element std::move(m_ringBuffer[readPosition]);m_readPosition.store(getPositionAfter(readPosition));return true;}///---------------------------------------------------------------------------/// brief Clears the content from the queuevoid clear() noexcept{const size_t readPosition m_readPosition.load();const size_t writePosition m_writePosition.load();if (readPosition ! writePosition){m_readPosition.store(writePosition);}}///---------------------------------------------------------------------------/// brief Returns the maximum size of the queue/// return The maximum number of elements the queue can holdconstexpr size_t max_size() const noexcept{return RingBufferSize - 1;}///---------------------------------------------------------------------------/// brief Returns the actual number of elements in the queue/// return The actual size or 0 when emptysize_t size() const noexcept{const size_t readPosition m_readPosition.load();const size_t writePosition m_writePosition.load();if (readPosition writePosition){return 0;}size_t size 0;if (writePosition readPosition){size RingBufferSize - readPosition writePosition;}else{size writePosition - readPosition;}return size;}static constexpr size_t getPositionAfter(size_t pos) noexcept{return ((pos 1 RingBufferSize) ? 0 : pos 1);}private:// A lock-free queue is basically a ring buffer.static constexpr size_t RingBufferSize fixedSize 1;std::arrayT, RingBufferSize m_ringBuffer;std::atomicsize_t m_readPosition {0};std::atomicsize_t m_writePosition {0}; };#endif /* SPSCLOCKFREEQUEUE_H */服务器初始化 在服务器初始化阶段我们根据预定义的队列大小来初始化这些无锁队列。 ThreadPool(size_t queueSize 10000) {pool_ std::make_sharedPool();pool_-tasks.resize(/* 线程数量 */, SpScLockFreeQueuestd::functionvoid()(queueSize));// ...其他初始化代码 }性能对比与分析 通过与使用锁的传统设计进行比较我们发现这种无锁设计在高并发环境下具有更好的性能。具体而言吞吐量提高了约20%。 结论 通过使用无锁工作队列我们成功地规避了因多线程锁而导致的性能开销并在高并发环境下实现了更高的吞吐量。这证明了无锁数据结构在Web服务器设计中具有巨大的应用潜力。 潜在的问题这个webserver采用轮询法为工作线程分配读写任务如果某个线程读取一个耗时特别长的函数就容易过载堆积太多任务不能处理但是每个任务的任务队列是设置了一个阈值的比如堆积2000个线程就不能再继续增加了 参考资料 无锁数据结构高性能Web服务器设计
http://www.pierceye.com/news/857982/

相关文章:

  • 网站做微信登录asp.net做网站头部和尾部_都用什么来实现
  • 南充哪里做网站太原关键词优化公司
  • 哪个网站做的ppt模板好投放广告网站
  • 公司网站中新闻中心怎样做优化百度浏览器电脑版
  • 厦门网站建设 九来外国做视频在线观看网站
  • 用.net做购物网站山东建筑公司实力排名
  • 做百度推广网站找谁好宁夏省建筑信息平台
  • phpcmsv9手机网站源码网站开发ide php
  • 学校网站建设成功案例微信公众号网站导航怎么做
  • 重庆汽车网站建设建立大安全大应急框架
  • 重庆模板建站定制网站做企业网站到哪里找
  • asp技术做网站网站建设推广是什么工作室
  • 运营公众号还是做网站室内装修设计软件哪个好用
  • 卖营销软件的网站如何利用站群做网站
  • 网站空间价格怎么算网站制作与发布
  • 做网站的动态图片廊坊做网站哪家好
  • 建设企业网站报价怎么做网站logo
  • 企业类网站谷歌seo招聘
  • asp.net网站安装顺序idc 公司网站模板
  • 新手学做网站优化2022app分类排行
  • 微信微网站制作公司2008年做的网站
  • 网站建设柒首先金手指1男孩做网站
  • 葫芦岛市建设局网站网页制作与网站发布
  • 企业网站首页布局尺寸营销网站建设哪家便宜
  • 专题网站建设策划郑州市做网站的公
  • wordpress網頁版天津百度网站排名优化
  • 做网站建设销售工资代做电大网站ui作业
  • DMZ做网站wordpress 小工具 创建
  • 宠物网站建设方案外贸网站建设公司服务
  • 玉林网站建设学校门户网站建设的意义