00000037.htm

来自「一份很好的linux入门资料」· HTM 代码 · 共 64 行

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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?