TCP 要求数据的次序性, ACE 的多任务,多线程怎么处理?
比如我进行文件传输时,要求数据的次序性不能乱.情景:
客户端 A 通过服务器和客户端 B 进行文件传输.
次序描述:
1. 客户端 A 发送一个数据包和指令包到服务器.
2. 服务器端 socket A 收到数据包和指令包, 然后把数据分别推入"数据任务"和"指令任务"处理.
3. 结果"指令任务"首先把指令数据发出去了.然后"数据任务"再把数据发出去了.
4. 客户端 B 期望首先接到数据数据,然后再接到指令数据.???
当然我上面说的可能不太合理,大体上是那么一个意思.当然综合更多业务和模型,情况可能更复杂.
ACE 提倡的多任务,多线程,是怎么保证 TCP 要求的数据次序性呢?
还是 ACE 根本没有保证.
我一直对这个问题存有疑惑,欢迎大家多多讨论和指教. ACE保证你异步投递出去的数据,肯定是顺序的,结果和你投递的顺序一致。但是如果你把数据处理放入队列,多个线程处理队列中的数据,因为OS对线程的抢占调度,就不能保证处理顺序了。不过,仍然可以采用序号的策略来达到目标,对同一个地址的数据,用同一个处理线程处理,就OK了。
不过,我没明白你上面说的具体意思。 非常感谢楼上的, 对于您的回答.
1.不过针对您说的哪个异步投递出去的数据,保证是次序的.是怎么样一个模型,能否举一个出来.而它又是通过什么机制进行保护的呢? ( 对于 ACE 我是新手,呵呵 )
2.您说的加序号,是需要自己做次序保护处理吧.而这要求上层的操作逻辑复杂度增加.随着不同的业务,可能难度不一.况且性能上肯定会因为业务处理用时不一,可能受到很大影响.不知道我的理解对否?望指教.
3.上面我举的例子可能不太妥当.主要意思就是想问一下, ACE 在多任务,多线程的情况下,能否保证TCP 数据的次序性,还是由用户自己做保护.
上面的例子,主要是说明,那种情况下, TCP 的次序性,就会发生混乱 1、ACE的Proactor框架保证。
2、也算不上难,比如你用一个Task,根据地址的不同,对同一个地址,分配到一致的子处理队列,就保证了处理的顺序。
3、ACE对同一个TCP连接,肯定是有保证的,但是因为自己使用多线程,出于线程调度引起的,需要自己保证。我的理解。
按照ACE的规则写,肯定不会混乱。这也是ACE的巨大优势。
页:
[1]