BBS水木清华站∶精华区

发信人: holly (holly), 信区: Linux 
标  题: Re: 再论"对linux的质量质疑" 
发信站: BBS 水木清华站 (Fri Jul 30 23:11:37 1999) WWW-POST 
 
【 在 nudtbegger (军人) 的大作中提到: 】 
    很自然的,我们想到了一个线程处理多个连接,这样SERVER里就可以 
 由不多的线程来应付很多个连接。这就要求OS的两个支持,1线程有效的 
 等待多个事件(EVENT)的能力,2真正的异步IO。幸运的是,作为WIN32 
 程序员,NT完全支持这两点,下面我就说一点我个人对LINUX的 
 看法。 
    1等待多个事件的能力,SELECT是LINUX实现单线程对多请求的唯一方法, 
 (若不对,请指出)。系统用SELECT在事件到来(eg.当一个REQUEST到来时) 
 通知所有的等待同一事件的线程,但是却只有一个线程能处理。这样有几个 
 开销,1,唤醒的几个线程要同步,最后只能由一个线程来完成服务。2,有 
 不少线程本来只要睡眠就行,结果却被唤醒,虽然很快就又接着等待,但是 
 CPU时间又消耗不少。有了这两大限制,我的一个师兄告诉我说,一般都是 
 用一个线程守侯,当来了REQUEST,就通知另一个线程守侯,自己处理,或者 
 通知另一个线呈处理,自己接着守侯。这样仍然增加了开销。如果LINUX 
 象NT那样,提供能够只唤醒一个线程的函数,无疑将提高处理REQUEST的效率。 
 
  这里好象有点前后不一致, 前面说的是一个 thread 处理多个连接, 也就是 
一个 thread 在多个 fd 上等待, 怎么后面就变成多个 thread 等待同一个 fd 
的问题了? 对于一个 thread 多个连接的情形, 自然只有这一个 thread 在这个 
fd (也就是您说的事件....). 再者, 在 NT 下写多个 thread, 同时对一个 
Handle 做 WaitSingleObject, 还是都会被唤醒的..... 
 
  很多 thread 之间同步对象的开销, 通过用户级 thread library 而不是 
核心级 thread, 会好很多. 
 
    2异步IO的能力。真正的异步IO和非阻塞IO是不同的,LINUX下实现的就 
 是非阻塞IO。LINUX下一个网络线程执行了非阻塞IO读,从连接中读取CLIENT 
 的数据,但是,这时CLIENT的数据还未到,该线程可以执行其他的工作,但是, 
 该线程在数据到来时还要执行一次读,否则就得不到数据,如果不知道什么 
 时候数据能到,将循环等待。但是在真正的异步IO中,情况不是这样,线程 
 执行一条读后,就不要在读,系统在数据到来时会通知线程。 
 大家都熟知WAITMULTIOBJECT和GETOVLAPPED函数,我就不多说了。 
 
  posix.1 提供了 aio_xxxx 函数, 异步 I/O, Linux 应该是支持 Posix.1 语义的 
吧....Sorry, 这个没仔细看过. 传统的 SIGIO 可以做到象 NT 那样的异步 IO, 
不过使用 IO 机制有其弱点. 
 
 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.120.13.251]  

BBS水木清华站∶精华区