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