select 有优势吗?

chenzhanyiczy
select 有优势吗?

虽然select是非阻塞的,但在下面的code里,好像体现不出select的优势,因为它跟一般的循环accept(...)没有区别啊,它的优势在哪里?

while(1)
{
  fd_zero(...);
  fd_set(...);
  select(...);
  if(fd_isset(...))
  {
     recv(...);
  }
}

aoegiss
移植性好

chenzhanyiczy
这个不是主要的优势吧

204tian
优势在于可以监听多个描述字

cugb_cat
异步IO

system888net
:)
这得分什么角度去看.
想要觉得它有优势,就站在有优势的角度去看(...).
想要觉得它没有优势,就站在没有优势的角度去看(仅仅要实现accept).

chenzhanyiczy
select就多了个time,同样需要loop来监听每个句柄,不明白怎么就异步io了呢?另外,可以监听多个句柄,这是没错,但还是要阻塞来进行读取

system888net
[quote]原帖由 [i]chenzhanyiczy[/i] 于 2008-6-25 23:48 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663571&ptid=1170765][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
select就多了个time,同样需要loop来监听每个句柄,不明白怎么就异步io了呢?另外,可以监听多个句柄,这是没错,但还是要阻塞来进行读取 [/quote]

难道你希望这样?
recv(fd1,...);
recv(fd2,...);
recv(fd3,...);
recv(fd4,...);
recv(fd5,...);

这时如果fd3可读,而fd1不可读,程序阻塞在fd1上,没法去处理fd3上的数据,这段程序就搞笑了.

[[i] 本帖最后由 system888net 于 2008-6-25 23:56 编辑 [/i]]

system888net
回复 #8 system888net 的帖子

to LZ:
:)
这是站在有优势的角度讲的,当然也可以站在没有优势的角度讲,两者不矛盾.
看问题也是这样,换不同的角度去看,更有利于认识本质.
用其长,避其短.

chenzhanyiczy
[quote]原帖由 [i]system888net[/i] 于 2008-6-25 23:53 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663592&ptid=1170765][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]


难道你希望这样?
recv(fd1,...);
recv(fd2,...);
recv(fd3,...);
recv(fd4,...);
recv(fd5,...);

这时如果fd3可读,而fd1不可读,程序阻塞在fd1上,没法去处理fd3上的数据,这段程序就搞笑了. [/quote]


换成select,不也是要recv的吗?假如fd1阻塞了,fd3仍然不能处理的啊?

system888net
[quote]原帖由 [i]chenzhanyiczy[/i] 于 2008-6-26 00:23 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663720&ptid=1170765][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]



换成select,不也是要recv的吗?假如fd1阻塞了,fd3仍然不能处理的啊? [/quote]

用了select,就可知道哪个fdx可读, fdx可读时才会recv,不可读就跳过,就不会阻塞而不能处理其它可读的fdx了.

scutan
[quote]原帖由 [i]system888net[/i] 于 2008-6-26 00:08 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663664&ptid=1170765][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
to LZ:
:)
这是站在有优势的角度讲的,当然也可以站在没有优势的角度讲,两者不矛盾.
看问题也是这样,换不同的角度去看,更有利于认识本质.
用其长,避其短. [/quote]

嗯。是的。每个工具都不是万能的,关键是我们如何去使用、整合工具,让它们达到最佳的效果

system888net
[quote]原帖由 [i]scutan[/i] 于 2008-6-26 00:43 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663801&ptid=1170765][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]


嗯。是的。每个工具都不是万能的,关键是我们如何去使用、整合工具,让它们达到最佳的效果 [/quote]

所以经常换位思考对了解问题和处理问题都是非常有益的.

chenzhanyiczy
[quote]原帖由 [i]system888net[/i] 于 2008-6-26 00:32 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663773&ptid=1170765][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]


用了select,就可知道哪个fdx可读, fdx可读时才会recv,不可读就跳过,就不会阻塞而不能处理其它可读的fdx了. [/quote]


谢谢,也就是说select是确保 句柄确实有数据的情况下,才进行read和write操作,这样就不会造成在没有数据的情况下,read或write的阻塞 。这样理解对吗?

system888net
[quote]原帖由 [i]chenzhanyiczy[/i] 于 2008-6-26 00:54 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663811&ptid=1170765][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]



谢谢,也就是说select是确保 句柄确实有数据的情况下,才进行read和write操作,这样就不会造成在没有数据的情况下,read或write的阻塞 。这样理解对吗? [/quote]

理解正确.

chenzhanyiczy
非常感谢system888net

Cyberman.Wu
select返回可读的话阻塞式的读操作是不会阻塞的,而返回可写的话却不一定,如果是以阻塞方式写还是有可能阻塞掉的,具体看我原来帖子中的实验数据:
[url]http://bbs.chinaunix.net/thread-1090258-1-1.html[/url]

另外有许多人提到异常I/O,实际上是概念上混乱了,先不说select(I/O复用),就算是非阻塞式socket也不能称为异步I/O,真正的异步I/O是固定地发起一个操作,由系统完成之后返回一个通知;应该得到通知时操作已经完成了,如recv可以是非阻塞的,但真正把数据写回recv指定的缓冲区是在recv内完成的,这个还是同步I/O。

chzCPU
用好了就好.

blizzard213
什么阻塞 异步 i/o多路复用 非阻塞的
大家还是把UNP vol1好好看看吧
该说的都说了