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