局域网有必要做多线程传输吗?
老板要我写个局域网用的文件传输程序(传输的文件都很大(>4G),且不只一个),他要作成和网络蚂蚁相似的多线程传输,但我认为在局域网内没必要做多线程传输,因为现在的局域网至少也是100M(其实很多都采用千兆网了),实际传输速率最少也有50M吧,可硬盘的传输速率就远低于这个数值了(7200RPM的硬盘好象只有30M-40M),这样硬盘读数据的速度远小于网络的传输速度,瓶颈是在硬盘这端,所以我认为无论是多线程还是单线程,他们的传输速度都是一样的。不知我的想法对不对,所以发了这个帖子,请大家帮我参考下,谢了! 问题点数:0、回复次数:13Top
1 楼afc(afc)回复于 2003-08-03 18:26:00 得分 0
我觉得没有必要,单线程速度足够快了,太多线程可能服务器受不了,CPU时间都花在数据传输上了Top
2 楼mjk()回复于 2003-08-03 19:23:47 得分 0
将文件首先分割,然后用多线程传输Top
3 楼mme(dog)回复于 2003-08-03 20:50:03 得分 0
有没有可能同时传输30M-40M吗?Top
4 楼afc(afc)回复于 2003-08-03 20:54:57 得分 0
看网络环境了,100M的网卡理论传输速度是10M字节左右,因为100M是bps,算成BYTE要除8,还要加上数据包头和校验等冗余的数据Top
5 楼jackyuke(jack)回复于 2003-08-03 20:59:07 得分 0
建议还是用单线程吧,不过老板命令不可违
要不你就阳奉阴违Top
6 楼lsw0794(dark_walker)回复于 2003-08-03 21:00:05 得分 0
我们公司内部用的一个局域网传送软件,名字叫IPMSG,传送文件的数度很快,在win2000下有2-3M/S,不知道这个软件是多线程还是采用单线程实现的,到底什么时候适合用多线程处理数据呢? 有没有一个比较合理的标准?
Top
7 楼Congy(少侠)回复于 2003-08-04 01:10:32 得分 0
我认为有必要,如果多个人之间互发文件,这是你就需要用多线程来完成了
Top
8 楼Congy(少侠)回复于 2003-08-04 01:12:05 得分 0
还有楼上说的那个ipmsg,消息通讯格式非常简单,而且还是用udp,我前几天作了一个小东西,就是模拟ipmsg发送信息的。Top
9 楼pango99(pango)回复于 2003-08-04 17:34:42 得分 0
SORRY,我把硬盘和网络的传输单位搞错了,但是100M局域网已经很少采用了,我的软件的运行环境还是在千兆网,所以还是可以认为网络速率大于硬盘速率。还有我想知道的是采用多线程传输是否比单线程来的快,而不是多个人之间互发文件的问题。
Top
10 楼mme(dog)回复于 2003-08-04 19:18:10 得分 0
其实我想知道,体统有没有同时发送几十M的能力啊?
就算有,我想整个系统除了发送信息之外,应该都动不了啦.
因为你见过这样大发送量的软件吗?
多线程传输比单线程要快,我是这样认为的:
因为我发现,发送的每个包的大小是有限制的.你不可能说一下子把几十M的东西发送出去
缓冲区都没有那么大.而且,我试验发现,从我的局域网发送到外面的网络.每个包发送30000(3
万)字节,结果收包的那边很成问题.掉包的情况非常严重.根本实现不了满意的通讯.可是在局
域网里面,掉包却不是那么严重.TCP和UDP我都试过.结果一样.
所以,采用多线程就可以做到比单线程来的快.因为每次发送的包很小,可是每次却能发送多
个包.问题是,你怎样组包就是个问题了.处理的不好,说不定发生线程死锁.呵呵,那你就惨啰Top
11 楼alamb(把握今生)回复于 2003-08-04 19:27:02 得分 0
用多线程发送的话,可以把发送数据的时间与读硬盘的时间重叠起来,当然可以做到更快,但是也不是越多线程越好了。如果你的软件还要对数据进行预处理,那就更需要多线程了。不管网络有多快,IO上花的时间总是比CPU处理时间要长得多。Top
12 楼icelight(给我一个接口,我能驱动地球……………仪)回复于 2003-08-05 11:00:39 得分 0
同alamb(把握今生) 的"时间重叠"论。
另外,有阻塞的情况下用多线程才能显著提高效率,楼主情况显然不属这一种。Top
13 楼kinogre(小熊)回复于 2003-08-05 22:31:48 得分 0
我想多线程传输可能有这样一个好处.
首先更正一下,这里所谓"单线程"或"多线程"传输并不真是指线程数,而是指对一个文件的传输所使用的SOCKET的个数,严格说来应该是单连接或多连接传输.
WINSOCK在实现的时候为每一个SOCKET都分配了一段定长缓冲区(视不同协议家族及类型,缓冲区长度会有所不同).在使用SOCKET发送数据的时候常常会出现缓冲区满,发送阻塞的错误(用WSAGetLastError()得到的错误码为WSAEWOULDBLOCK).采用多连接分段传输,可以看作是增大了传输时所使用的缓冲区的长度,对于传输大型文件的操作,这也许会提高传输速率吧.
或者从整个系统的角度来考虑,WINDOWS在同一时刻可能(常常就是这样)会有多个网络应用需要请求网卡资源,使用多个SOCKET则我们传输文件的程序获得网络资源的可能性就提高了(如果windows是以SOCKET而不是以进程为单位分配网络资源的话,或者如果WINDOWS以线程为单位平均分配网络资源,则采用多线程便能够占到便宜了).Top




