select()的简单问题

发表于:2007-05-25来源:作者:点击数: 标签:问题Select作为简单函数
select()函数作为I/O复用时,如果其超时值设为0,则立即返回,即处于polling模式,程序对select进行"轮询",一般认为这样会对 性能 有影响,请问,会有什么样的影响?我做了试验,我把超时值设为1秒,我发现这两种情况下程序的速度没什么变化,那么到底超时值为0对程序

select()函数作为I/O复用时,如果其超时值设为0,则立即返回,即处于polling模式,程序对select进行"轮询",一般认为这样会对性能有影响,请问,会有什么样的影响?我做了试验,我把超时值设为1秒,我发现这两种情况下程序的速度没什么变化,那么到底超时值为0对程序会有什么样的影响?为什么设定一个超时值就可以避免对CPU时间的浪费呢?谢谢!

 minsky 回复于:2003-08-09 11:11:14
怎么没人回复我啊?55555555555~~

 gadfly 回复于:2003-08-10 10:10:52
如果你的进程不停的接到数据,当然就看不出区别了。都马上返回

如果不忙的话,你不停的轮询一直占用cpu。而设置超时,在等待的时候,
进程阻塞,cpu资源就可以空闲给其它的进程用了。

 fls 回复于:2003-08-10 14:18:42
select如果处于轮询状态,就相当于不停的在问“有数据了吗?”,你的程序可是要靠cpu来运行的;而处于阻塞状态的时候,就相当于睡觉,有数据的时候,其它“人”会告诉它“喂,数据来了,快处理吧”,你的select就返回了,ok?

 flw 回复于:2003-08-10 16:47:22
[quote:30df4d2903="fls"]select如果处于轮询状态,就相当于不停的在问“有数据了吗?”,你的程序可是要靠cpu来运行的;而处于阻塞状态的时候,就相当于睡觉,有数据的时候,其它“人”会告诉它“喂,数据来了,快处理吧”,你的select就返?.........[/quote:30df4d2903]
好!形象!就冲这段话,马上置成“精彩回帖”。

 minsky 回复于:2003-08-12 09:27:59
两位回答的非常精彩 ,谢谢 :D

 minsky 回复于:2003-08-12 09:33:16
[quote:bca6b0aedc="flw"]
好!形象!就冲这段话,马上置成“精彩回帖”。[/quote:bca6b0aedc]     
嗯!同意

 victorxiang 回复于:2003-08-12 09:41:46
我也明白了,谢谢!

 minsky 回复于:2003-08-12 10:19:45
新问题又来了:)
如果在单任务系统中,上述问题可能会影响系统的性能;但:
如果我用的是多任务的操作系统,它肯定是按照时间片来分配任务的,也就是一段时间内只能有一个任务在跑,如果select()超时值设为0的话,立即返回,把CPU时间交给了别的任务,这样反而对性能有提高??迷惑中...望大虾指导!

 蓝色键盘 回复于:2003-08-12 18:41:14
如果你觉得select或者poll影响了性能。

那么采用其它的方式吧。

 mills 回复于:2003-08-30 23:04:31
null吧可以吗

 mills 回复于:2003-08-30 23:05:41
null吧可以吗

 tanchanghe 回复于:2004-02-25 14:10:55
用NULL的时候,表示socket一直处于阻塞状态(永远不会发生超时),这时除非套接字可读或者可写的时候才会返回,你就不能应用超时机制来控制程序了,如果这时你要控制程序,你必须要客户端发送数据来控制这个套接字

 llac 回复于:2004-06-07 15:32:12
我的问题:
假设开始时connect 是成功的,但是在循环处理接收数据时连接断了,此时
select()是否会一直在等待而不会有返回值?

 tanchanghe 回复于:2004-06-07 15:50:06
此时select会立即返回,但是此时你在受信的时候会返回0字节长

 llac 回复于:2004-06-07 16:18:59
实际情况是:
通过FTP接受文件,若有新文件则传送到AIX.
经常出现该进程被挂住,好像一直在睡觉。杀掉该进程重启,一切又正常。隔一段时间又出现该现象。通过跟踪发现执行到该函数就没有返回:
int get_ftp_data(int f_sock_id,FILE *fp,char *f_buffer,int f_recv_len)
{
    int hi,retu_value;
    fd_set readfs;
    struct timeval tv;
    int nfds,recv_number;

    FD_ZERO(&readfs);
    FD_SET(f_sock_id,&readfs);
    tv.tv_sec=45;
    tv.tv_usec=0;
    nfds=select(f_sock_id+1,&readfs,NULL,NULL,&tv);

    if (nfds==0)
    {
       return (-1);
    } else
    {
       if (FD_ISSET(f_sock_id,&readfs))
       {
          for(hi=0;hi<f_recv_len;hi++)
          {
                 *(f_buffer+hi)=0;
          }

          recv_number=fread(f_buffer,1,f_recv_len,fp);

          if(recv_number>=0)
          {
              return (recv_number);
          } else
          {
              return (-1);
          }
        }else
        {
            return (-1);
        }
    }
}

 tanchanghe 回复于:2004-06-07 16:48:24
tv.tv_sec=45; 
tv.tv_usec=0; 
nfds=select(f_sock_id+1,&readfs,NULL,NULL,&tv);

该select语句在f_sock_id不可读的时候, 会有45秒延迟, 你尝试将时间设置小一点看看

 llac 回复于:2004-06-07 16:57:32
实际情况时半小时会有个新文件。
问题是等了好几个小时都没有处理,进程重启后一下会接收好几个文件。

 tanchanghe 回复于:2004-06-07 17:31:22
没有发现其他地方会引起这个错误, 你看看其他地方有没有影响这个进程
或则,你调试进取看看你一条语句挂起

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)