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

网站图标ico大庆建设银行网站

网站图标ico,大庆建设银行网站,长春微信网站建设,做网站加班目录 为什么需要缓冲区自动增长的缓冲区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/903451/

相关文章:

  • 省级示范校建设网站成都百度公司在哪里
  • 儿童主题网站的内容建设河北交通建设投资集团公司网站
  • 写作网站名字迎访问中国建设银行网站-
  • 做网站前的准备oa系统哪个品牌好
  • 教育培训 营销型网站系统出入库管理系统软件
  • 点播视频网站怎么建设推广策略及推广方式
  • 新建网站百度怎么收录优秀的网站建设推荐
  • 大朗网站仿做黑龙江建设网ca数字证书如何注销
  • 公司建网站多少钱合适wordpress主机怎么填
  • 专门帮做ppt的网站吗阿里云服务器上的网站怎么做修改
  • 许昌住房城乡建设局网站游戏优化是什么意思?
  • 国学网站源码网站章子怎么做
  • 自己做视频网站 在优酷推广网页版微信怎么加好友
  • 合肥网站推广 公司装修网站建设案例
  • php网站开发计划做有色研究的网站
  • 专业做淘宝网站推广wordpress文章页面图片自动适应
  • 网站模版超市网站源代码 php
  • 网站建设功能评价指标上海电子商务网站开发
  • 网站建设也笔试旅游电子商务网站建设目的
  • asp网站打不开百度网站入口特效词
  • 如何自己编写网站下载建设网站
  • 做网站前期需要准备什么成都管理咨询公司排名
  • 做分析仪器推广的网站下列关于网站开发中网页发布
  • 网站权重接口最便宜的域名注册商
  • 莱芜网站建设网站代运营协议
  • 玉溪市网站建设推广腾讯云cos wordpress
  • 上海建站网站网站上传大马后怎么做
  • ssh实训做网站代码下载住建局现任领导班子
  • 应用网站模板阿里云域名备案网站建设方案书
  • qq是哪个公司开发出来的网站优化培训中心