BBS水木清华站∶精华区

发信人: nudtbegger (军人), 信区: Linux 
标  题: 再论"对linux的质量质疑" 
发信站: BBS 水木清华站 (Fri Jul 30 17:48:07 1999) WWW-POST 
 
   昨天中午我回了suxm和mephisto的两篇文章,也是花了不少工夫 
的,但是,昨天晚上再看,结果两篇文章都不见了,我实在是 
莫名其妙,因为我的文章里说实话没有任何违反规定的地方,我 
个人向来都是从技术到技术,不喜欢感情介入其中的。后来我给 
mephisto去了一封信,他说不是他删的,让我再回一次,但是我 
实在是没有再回的激情了,但是说实话,我还是很希望继续这个 
linux的讨论,因为我个人觉得任何人要忽略linux都是不现实的。 
和几位高手讨论很有收获.    
   言归正传吧,我先说一下RT-NT的事情,suxm的意思好象不相信 
我说的有RTNT,昨天我特地把网址抄了一个,但是现在有点忘了, 
但是我想说的是,如果看过WDJ,(windows developer j)从97年 
到99年5期(再后的我也没看过),几乎每一期都有RTNT的广告,而且 
版面不小,很容易找到。用大的搜索引擎也能找到。好象是 
www.imagination.com,因为我现在上网出不了国,没法验证。 
   关于suxm说的95和NT的线程时间片,我记得很多书上都说95是20ms, 
不知道suxm为什么说是30ms,所以我怀疑是不是我理解错了他的意思, 
说的不是同一个东西。关于NT的最小时间片,我承认是记错了,应该是 
10ms。 
   然后我再说和mephisto讨论的LINUX的异步IO问题,这两天来一直在 
翻代码,但是关于LINUX,说实在的是涉及不多,下面我谈谈我个人的 
一些理解。 
   mephisto告诉我说LINUX的实现异步的方法是SELECT,我就回去仔细 
的看了看SELECT,觉得SELECT并不是一种令人满意的实现异步的方法, 
尤其无法让程序员满意。 
   由于有了多线程,原有的很多用到异步IO的地方,都可以用多线程的 
方法解决。比如DISK IO,完全可以开一个线程来完成,因为这种情况下, 
IO要求可以预测,时间也可预测,而且次数不多,所以这种解决方法是 
可以接受的。 
   异步IO最大的实现背景应该是网络应用吧,特别是SERVER(WEB,FTP, 
TELNET,etc),因为LINUX本身也是定位到SERVER的吧,我们从来没有把 
LINUX跟95比,总是跟NT比,我的印象中,LINUX是一个NET SERVER。 
但是我觉得就SELECT的实现方法来说,并没有考虑到SERVER的特点。 
   对于SERVER应用来说,其特点是数据流量不定,触发流量大,可能 
同一时刻有几千个连接。最简单的实现方法是老方法,对应每个连接请求 
建立一个线程,当然也可以建立一个进程。但是这种方法耗费资源巨大, 
很难想象1000个连接会发生什么,线程太多本身要耗费资源,CPU在这么多 
线程之间进行切换本身就是不小的开销,而且如此多的线程要用到的同步 
核心对象也是一个不小的开销。该方法本质上效率不高。如果是实验室里 
10台PC的SERVER,当然无所谓,但是,我想...... 
   很自然的,我们想到了一个线程处理多个连接,这样SERVER里就可以 
由不多的线程来应付很多个连接。这就要求OS的两个支持,1线程有效的 
等待多个事件(EVENT)的能力,2真正的异步IO。幸运的是,作为WIN32 
程序员,NT完全支持这两点,下面我就说一点我个人对LINUX的 
看法。 
   1等待多个事件的能力,SELECT是LINUX实现单线程对多请求的唯一方法, 
(若不对,请指出)。系统用SELECT在事件到来(eg.当一个REQUEST到来时) 
通知所有的等待同一事件的线程,但是却只有一个线程能处理。这样有几个 
开销,1,唤醒的几个线程要同步,最后只能由一个线程来完成服务。2,有 
不少线程本来只要睡眠就行,结果却被唤醒,虽然很快就又接着等待,但是 
CPU时间又消耗不少。有了这两大限制,我的一个师兄告诉我说,一般都是 
用一个线程守侯,当来了REQUEST,就通知另一个线程守侯,自己处理,或者 
通知另一个线呈处理,自己接着守侯。这样仍然增加了开销。如果LINUX 
象NT那样,提供能够只唤醒一个线程的函数,无疑将提高处理REQUEST的效率。 
   2异步IO的能力。真正的异步IO和非阻塞IO是不同的,LINUX下实现的就 
是非阻塞IO。LINUX下一个网络线程执行了非阻塞IO读,从连接中读取CLIENT 
的数据,但是,这时CLIENT的数据还未到,该线程可以执行其他的工作,但是, 
该线程在数据到来时还要执行一次读,否则就得不到数据,如果不知道什么 
时候数据能到,将循环等待。但是在真正的异步IO中,情况不是这样,线程 
执行一条读后,就不要在读,系统在数据到来时会通知线程。 
大家都熟知WAITMULTIOBJECT和GETOVLAPPED函数,我就不多说了。 
   3长时间以来,我个人感觉就是LINUX的重入性不好,当然,很多人都告诉 
我说要用发展的眼光看问题,但是,我觉得还是发展的太慢。重入性不好带 
来的直接问题就是多处理器解决不好,这个问题LINUX社区都已经承认,我 
不再多说。我只加一条NT的例子。NT4的写函数在网络IO中只有很少的在 
网卡driver的函数不可重入,但是,就是这个问题,使的NT在4处理器的SERVER 
中和SOLARIS相比处于下风,MS迅速的推出了SP4,和NT2000,解决了这个问题。 
LINUX的定位我相信是要在SERVER上和其他OS一争的,解决不了这个问题,是 
无法达到这个目标的。 
  LINUX的目标,我个人的看法是LINUX肯定是想在大型服务器上和其他OS 
竞争的,但是就LINUX目前的状态,还无法和NT和SUNOS相比。PC WEEK做 
的NT VS LINUX,当在多CPU,多网卡的情况下,LINUX根本不能和NT比, 
在IT发展如此迅猛的今天,MS的做法是把资源耗光,这样,硬盘, 
内存发展迅猛,才会如此的便宜,如果NT2000早点推出,现在也许还要更便宜。 
LINUX如果停留在能让过期的机器跑起来的目标之中,是不能参与未来的 
竞争的。 
  以上都只是我个人的一些看法,抛砖引玉,希望大家能深入讨论。 
    
 
 
    
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.197.0.1]  

BBS水木清华站∶精华区