select内存拷贝有关问题
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则是类似于向内核注册回调的方式,不需要轮询