首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

select内存拷贝有关问题

2014-01-22 
select内存拷贝问题看到网上在说select的缺点时候,谈到select内存拷贝问题,就是从内核态到用户态的拷贝。se

select内存拷贝问题
看到网上在说select的缺点时候,谈到select内存拷贝问题,就是从内核态到用户态的拷贝。
select的用法简单:

int res = select(maxfd+1, &readfds, NULL, NULL, 120);
if(res > 0)
{
    for(int i = 0; i < MAX_CONNECTION; i++)
    {
        if(FD_ISSET(allConnection[i],&readfds))
        {
            handleEvent(allConnection[i]);
        }
    }
}

是哪个调用引发了状态切换和内存拷贝呢?
[解决办法]
几乎所有的系统调用都会发生内核态和用户态的数据交换。干嘛要关心这个?
简单地说,你自己代码中定义的变量,申请的内存,都在用户态内存中保存。调用系统调用时,一定需要把你的内存数据传递给内核,或者把内核从i/o得到的数据传递给你的程序。
[解决办法]

select
poll  二者都要kernel把状态返回给用户空间,由用户空间进行下一步调用,二者需要轮询
epoll则是类似于向内核注册回调的方式,不需要轮询

热点排行