`
kofsky
  • 浏览: 196703 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

问题记录:可变缓冲区问题

 
阅读更多
网络传输存在的一个问题是,当消息发送速度非常快(比如1s发送200个数据包)时,缓冲区可能会填满而导致发送队列后面的数据发送失败
因此试图通过建立可变缓冲区
当数据发送速度非常快时,马上扩充缓冲区容量,使其适应数据的发送数率

通过动态数组来实现一个动态循环队列的数据缓冲区
std::vector<DataItem> *_dataQueue;

调试中发现一个问题,就是从缓冲区取出的数据次序与送入次数不一致性

原因:
首先往缓冲区依次填入数据
数据包所在位置依次为:
前面的表示缓冲区的位置(为方便,从1开始计数),括号里表示发送包的编号

1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7) 8(8)
此时另外一个线程取出数据包1(1) 2(2) 3(3)发送;
发送完毕后会停止一段时间
此时循环队列位置Position = 4

此时发送线程继续塞入数据,会先填充位置123,此时缓冲区已满
缓冲区数据依次为:
1(9) 2(10) 3(11) 4(4) 5(5) 6(6) 7(7) 8(8)

于是将缓冲区容量由8扩充至12
继续发送数据
依次填充位置9(12) 10(13) 11(14) 12(15)
填充完毕后,开始取数据
由于循环队列位置Position = 4
那么,此时取数据的顺序变为:
4(4) 5(5) 6(6) 7(7) 8(8) 9(12) 10(13) 11(14) 12(15) 1(9) 2(10) 3(11)


而送入缓冲区的数据包次数为:
4(4) 5(5) 6(6) 7(7) 8(8) 1(9) 2(10) 3(11) 9(12) 10(13) 11(14) 12(15)

两者不一致。

根本原因是:填充数据时是以长度为8的队列在循环,但是取数据的时候则是以一个长度为12的循环队列取数据,次序自然不能保证了。


考虑方法:
1.在扩充容量过程中,将position标号前面的数据包依次拷入扩容的空间,使其与填入缓冲区次序一次。
 也就是在扩容的时候
 将缓冲区中的数据做一次部分移动:
移动前: 1(9) 2(10) 3(11) 4(4) 5(5) 6(6) 7(7) 8(8)
 
移动后: 1(-1) 2(-1) 3(-1) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9) 10(10) 11(11) 12(-1)
   (括号里-1表示数据包无效,可以继续放入数据)
 尝试了:速度太慢

2。记录前一次一个缓冲区的大小,先做小队列循环,再做大队列循环。比如说由8扩充至12时,先做一个队列为8的循环,再做一个队列长为12的循环。
  问题是,如果数据速率超快,那么队列长度的变化由8,12,16,32,那么后面的就会覆盖前面的长度。
  又回到根本性的问题:填充数据与取数据的队列长度 不一致。

。。。下班,明天再来想。

还是用方法1解决:
测试代码:
XmlRpcDataBuffer buf;
	for ( int i = 0; i < 7; i++ )
	{
		char s[20];
		sprintf(s,"%d",i);
		std::string pd = s;
		buf.push(pd);
		buf.print();
	}

	std::string data;
	buf.get(data);
	buf.print();
	buf.get(data);
	buf.print();
	buf.get(data);
	buf.print();
	for ( int i = 7; i < 13; i++ )
	{
		char s[20];
		sprintf(s,"%d",i);
		std::string pd = s;
		buf.push(pd);
		buf.print();
	}

	buf.get(data);
	buf.print();
	buf.get(data);
	buf.print();
	buf.get(data);
	buf.print();
	for ( int i = 13; i < 23; i++ )
	{
		char s[20];
		sprintf(s,"%d",i);
		std::string pd = s;
		buf.push(pd);
		buf.print();
	}



结果如下:
命名:缓冲区序号[循环队列队首]发包序号

0[0](0)
1[0](-1)
2[0](-1)
3[0](-1)
4[0](-1)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](-1)
3[0](-1)
4[0](-1)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](-1)
4[0](-1)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](3)
4[0](-1)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](3)
4[0](4)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](3)
4[0](4)
5[0](5)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](3)
4[0](4)
5[0](5)
6[0](6)
7[0](-1)
*************************************
0[1](-1)
1[1](1)
2[1](2)
3[1](3)
4[1](4)
5[1](5)
6[1](6)
7[1](-1)
*************************************
0[2](-1)
1[2](-1)
2[2](2)
3[2](3)
4[2](4)
5[2](5)
6[2](6)
7[2](-1)
*************************************
0[3](-1)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](-1)
*************************************
0[3](-1)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
*************************************
0[3](8)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
*************************************
0[3](8)
1[3](9)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
*************************************
0[3](-1)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
8[3](8)
9[3](9)
10[3](10)
11[3](-1)
*************************************
0[3](-1)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
8[3](8)
9[3](9)
10[3](10)
11[3](11)
*************************************
0[3](12)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
8[3](8)
9[3](9)
10[3](10)
11[3](11)
*************************************
0[4](12)
1[4](-1)
2[4](-1)
3[4](-1)
4[4](4)
5[4](5)
6[4](6)
7[4](7)
8[4](8)
9[4](9)
10[4](10)
11[4](11)
*************************************
0[5](12)
1[5](-1)
2[5](-1)
3[5](-1)
4[5](-1)
5[5](5)
6[5](6)
7[5](7)
8[5](8)
9[5](9)
10[5](10)
11[5](11)
*************************************
0[6](12)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
*************************************
0[6](12)
1[6](13)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
*************************************
0[6](12)
1[6](13)
2[6](14)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
*************************************
0[6](12)
1[6](13)
2[6](14)
3[6](15)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
*************************************
0[6](-1)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](-1)
*************************************
0[6](-1)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
*************************************
0[6](18)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
*************************************
0[6](18)
1[6](19)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
*************************************
0[6](18)
1[6](19)
2[6](20)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
*************************************
0[6](-1)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
18[6](18)
19[6](19)
20[6](20)
21[6](21)
22[6](-1)
23[6](-1)
24[6](-1)
25[6](-1)
26[6](-1)
*************************************
0[6](-1)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
18[6](18)
19[6](19)
20[6](20)
21[6](21)
22[6](22)
23[6](-1)
24[6](-1)
25[6](-1)
26[6](-1)
*************************************

分享到:
评论

相关推荐

    buffer-layout:Node.js 支持在 JavaScript 值和缓冲区之间进行转换

    缓冲区布局 buffer-layout 是一个用纯 JavaScript 实现的实用模块,支持 JavaScript 值和缓冲区之间的转换。 它可以通过并在 MIT 许可下发布。 为这些类型的数据提供了布局支持: 长度为 1 到 6 个字节的有符号和无...

    你必须知道的495个C语言问题

    1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 1.29 为什么我的编译器不允许我定义大数组,如...

    《你必须知道的495个C语言问题》

    1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 15 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 15 1.29 为什么我的编译器不允许我定义大数...

    undotree:VIM的撤消历史记录可视化工具

    截屏描述该插件可视化撤消历史记录,使浏览和在不同的撤消分支之间切换变得更加容易。 您可能想知道什么是撤消“分支”? 它的vim功能可让您返回到最新编辑覆盖的状态。 对于大多数编辑者,如果先进行A更改,然后...

    C语言FAQ 常见问题列表

    C 语言常见问题集 原著:Steve Summit 翻译:朱群英, 孙 云 修订版 0.9.4, 2005年6月23日 版权所有 © 2005 * 目录 * 1. 前言 * 2. 声明和初始化 o 2.1 我如何决定使用那种整数类型? o 2.2 64 位机上的 ...

    佳能eos 550D.60D.600D.50D.500D.5D2 固件破解软件

    * 短片助手:比特率控制(QScale或CBR),短片日志记录(EXIF元数据),缓冲区溢出或4GB限制后自动重新启动,剩余时间显示,LiveView显示时隐去所有覆盖,改变模式拨盘上的短片模式键的位置。 * 幅面裁切标记:用户...

    你必须知道的495个C语言问题(PDF)

    3.4 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换a 和b 的值。. . . . . . . . . . . . . . . . . . . . . . . . . 14 3.5 我可否用括号来强制执行我所需要的计算顺序? . . . . . . . . ....

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    说明:编辑指定或缓冲区的sql脚本 用法:edit [文件名] 列子: 7. 运行脚本 (start/@) 说明:运行指定的sql脚本 用法:start/@ 文件名 列子: 8. 印刷屏幕 (spool) 说明:将sql*plus屏幕中的内容输出到指定的...

    mysql数据库my.cnf配置文件

    #指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大, # 系统将开始换页并且真的变慢了。对于内存在4GB左右的服务器该参数可设置为384M或512M。通过...

    数据库系统实现

    1.2.3 主存缓冲区和缓冲区管理器 1.2.4 事务处理 1.2.5 查询处理器 1.3 本书梗概 1.3.1 预备知识 1.3.2 存储管理概述 1.3.3 查询处理概述 1.3.4 事务处理概述 1.3.5 信息集成概述 1.4 数据库模型...

    《垃圾收集》(Garbage Collection)扫描版[PDF]——part2

    3.3.5 “Ought to be two”缓冲区 3.4 硬件引用计数 3.5 环形引用计数 3.5.1 函数式程序设计语言 3.5.2 Bobrow的技术 3.5.3 弱指针算法 3.5.4 部分标记——清扫算法 3.6 需要考虑的问题 3.7 引文注记 第4章 标记——...

    (Garbage Collection)扫描版——part1

    3.3.5 “Ought to be two”缓冲区 3.4 硬件引用计数 3.5 环形引用计数 3.5.1 函数式程序设计语言 3.5.2 Bobrow的技术 3.5.3 弱指针算法 3.5.4 部分标记——清扫算法 3.6 需要考虑的问题 3.7 引文注记 第4章 标记——...

    数据库概念的复习总结

    33、游标怎么使用:游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。 必须使用游标的SQL语句...

    orcale常用命令

    使用INPUT命令可以在SQL缓冲区中增加一行或多行 SQL&gt;i SQL&gt;输入内容 e、调用外部系统编辑器 SQL&gt;edit 文件名 可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件中定义如下一行 DEFINE_...

    单片机程序设计 电子钟程序

    显示缓冲区(6字节) DISPBIT EQU 3DH ;位选偏移量 FLAG EQU 3EH ;标记(0表示在主界面,1-6分别代表显示时、分、秒、年、月、日,0为一般显示(当前位置为主界面),7为显示日期,8为显示闹铃开关,9、10显示闹铃时...

    无头:使用Ruby创建虚拟X屏幕,录制视频并拍摄屏幕截图

    它还可以从虚拟帧缓冲区捕获图像和视频。 例如,您可以记录失败的集成规格的屏幕截图和截屏视频。 我创建它是为了可以在Cucumber中运行Selenium测试,而无需任何shell脚本。 更重要的是,只有对Selenium运行测试时...

    川农《计算机操作系统(本科)》17秋在线作业.docx

    具有并发性 C具有并发性,及同时执行的特性 D进程之间可能是无关的,但页可能是有交往的 正确答案是:B 105分消息缓冲队列通信中的临界资源是() A队列中的某个消息缓冲区 B整个消息缓冲区队列 C信箱 D管道 正确...

    pomorecordo:制作无聊视频的Shell脚本

    PomoRecordo.sh ...这将从帧缓冲区记录屏幕,并使用ffmpeg以及其他一些命令。 基本上需要两个参数:第一个是todo.txt中todo项的行号,另一个是存储视频的可选目录。 如果存在,它将添加到现有视频中。

Global site tag (gtag.js) - Google Analytics