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水木清华站∶精华区