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

高端网站设计报价表网站上传大马后怎么做

高端网站设计报价表,网站上传大马后怎么做,华为网络工程师认证培训,品牌网站推广方案目录 为什么需要缓冲区自动增长的缓冲区buffer数据结构buffer类 写详细比较费时间,就简单总结下。 总结自Linux 多线程服务端编程:使用 muduo C 网络库 Muduo网络编程: IO-multiplexnon-blocking 为什么需要缓冲区 Non-blocking IO 的核心…

目录

  • 为什么需要缓冲区
  • 自动增长的缓冲区
  • buffer数据结构
    • buffer类

写详细比较费时间,就简单总结下。

总结自Linux 多线程服务端编程:使用 muduo C++ 网络库

Muduo网络编程:
IO-multiplex+non-blocking

为什么需要缓冲区

Non-blocking IO 的核心思想是避免阻塞在 read() 或 write() 或其他 IO 系统调
用上,所以应用层的缓冲是必须的,每个 TCP socket 都要有 input buffer
和 output buffer。

自动增长的缓冲区

一方面希望减少系统调用,所以缓冲区越大越好
另一方面希望减少内存占用,如果缓冲区很大而连接很多,将会占用大量内存空间。而大多数时候缓冲区的使用率又很低。

buffer数据结构

在这里插入图片描述

buffer类

Muduo Buffer的size()是自适应的,一开始的初始值是1k。

抽取相关代码:

class Buffer:public muduo::copyable{public:static const size_t kCheapPrepend = 8;static const size_t kInitialSize = 1024;explicit Buffer(size_t initialSize = kInitialSize): buffer_(kCheapPrepend + initialSize),readerIndex_(kCheapPrepend),writerIndex_(kCheapPrepend){...}...std::vector<char> buffer_;
}

vector数组,保证了可以扩展,初始化了1k可用空间,并在头部预留了1Byte。

具体做法是,在栈上准备一个 65536 字节的 extrabuf,然后利用 readv() 来读取数据。
iovec 有两块,第一块指向muduo Buffer 中的 writable 字节,另一块指向 栈上的 stackbuf。
这样如果读入的数据不多,那么全部都读到Buffer 中去了;如果长度超过 Buffer 的 writable 字节数,就会读到栈上的 extrabuf 里,然后程序再把extrabuf 里的数据 append 到 Buffer 中。

这么做利用了临时栈上空间,避免开巨大 Buffer 造成的内存浪费,也避免反复 调用 read() 的系统开销(通常一次 readv()系统调用就能读完全部数据)。

代码相关实现:Buffer::readFd()

ssize_t Buffer::readFd(int fd, int* savedErrno)
{// saved an ioctl()/FIONREAD call to tell how much to readchar extrabuf[65536];struct iovec vec[2];const size_t writable = writableBytes();vec[0].iov_base = begin()+writerIndex_;vec[0].iov_len = writable;vec[1].iov_base = extrabuf;vec[1].iov_len = sizeof extrabuf;// when there is enough space in this buffer, don't read into extrabuf.// when extrabuf is used, we read 128k-1 bytes at most.const int iovcnt = (writable < sizeof extrabuf) ? 2 : 1;const ssize_t n = sockets::readv(fd, vec, iovcnt);if (n < 0){*savedErrno = errno;}else if (implicit_cast<size_t>(n) <= writable){writerIndex_ += n;}else{writerIndex_ = buffer_.size();append(extrabuf, n - writable);}return n;
}

首先写buffer,写不下的写extrabuf,然后把extrabuf的写入buffer,具体函数是append。

  void append(const char* /*restrict*/ data, size_t len){ensureWritableBytes(len);std::copy(data, data+len, beginWrite());hasWritten(len);}

ensureWritableBytes检查buffer是否有空余空间可以被写入,没有就vector.resize(len),扩展len。然后通过std::copy,把extrabuf上的内存copy到buffer上。最后更新writerIndex_。

http://www.yayakq.cn/news/858356/

相关文章:

  • 介绍做燕窝的网站上海贸易公司有哪些
  • wap网站域名wordpress微电影模板下载
  • 电子商务网站建设与管理最新试卷快速seo整站优化排行
  • 网站只显示一个网址装潢设计师工资一般多少
  • 涉县网站建设北京远程时代网站建设
  • 门户网站建设投资哪个手游平台折扣最低又安全
  • 网站建设软件哪个最好推广竞价
  • 网站建设技术包括哪些网站做百科
  • 长春门户网站建设二建注册查询系统
  • 制作网站要找什么公司株洲芦淞区
  • 自建网站百度专业3合1网站建设价格
  • 校园网站建设平台在线设计平台的消费者分析
  • 网站推广策划包含哪些内容厦门网站建设网络推广
  • 公司展厅设计公司哪家好一点aso优化前景
  • 苏州做网站哪家公司好在线赚钱平台
  • 番禺网站 优化网站代备案需要多少钱
  • 建设网站后怎么发布毕设做桌面端还是网站
  • 做jsp网站用哪些软件安徽网站开发公司
  • 网站建设如何自学百度经验官方网站登录入口
  • 做网站的代码有哪些17网站一起做网店 新塘
  • 站长要维护网站html5 爱情网站模板
  • 网站建设和架构株洲网红打卡地
  • 新乡市网站建设有哪些公司推广普通话手抄报内容
  • 建设银行对公网站打不开北京网站制作开发公司
  • 网站做二维码吗免费天眼查公司查询
  • 有后天管理的网站怎么建设wordpress 商业授权
  • 网站seo优化公司深圳办公室设计
  • 杭州做网站哪里好phpcms 笑话网站
  • 推广网站要注意什么网站建设都需要哪些书
  • 网站建设功能定位怎么写安徽工程建设信息网实名制查询