select既然是轮询,为什么不占用很多cpu
2个回答
展开全部
先问题引概括两机制区别联系介绍每接口用
、问题引 联系区别
问题引需要读两I/O候使用阻塞式I/O能间阻塞描述符面另外描述符虽数据能读实性能满足要求概解决案几种:
1.使用进程或者线程种造程序复杂且与进程与线程创建维护需要销(Apache服务器用进程式优点隔离用户)
2.用进程使用非阻塞I/O读取数据I/O读候立刻返检查否读种形式循环轮询(polling)种比较浪费CPU间数间读仍花费间断反复执行read系统调用
3.异步I/O(asynchronous I/O)描述符准备候用信号告诉进程由于信号数限描述符适用
4.种较式I/O路转接(I/O multiplexing)(貌似翻译路复用)先构造张关描述符列表(epoll队列)调用函数直些描述符准备才返返告诉进程哪些I/O绪selectepoll两机制都路I/O机制解决案selectPOSIX标准epollLinux所特
区别(epoll相select优点)主要三:
1.select句柄数目受限linux/posix_types.h文件声明:#define __FD_SETSIZE 1024 表示select同监听1024fdepoll没限制打文件句柄数目
2.epoll处随着FD数目增降低效率selec采用轮询处理其数据结构类似数组数据结构epoll维护队列直接看队列空epoll"跃"socket进行操作---内核实现epoll根据每fd面callback函数实现"跃"socket才主调用 callback函数(句柄加入队列)其idle状态句柄则点epoll实现"伪"AIO绝部I/O都跃每I/O端口使用率高epoll效率定比select高(能要维护队列复杂)
3.使用mmap加速内核与用户空间消息传递论select,pollepoll都需要内核FD消息通知给用户空间何避免必要内存拷贝重要点epoll通内核于用户空间mmap同块内存实现
二、接口
1)select
1. int select(int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict tvptr);
struct timeval{
long tv_sec;
long tv_usec;
}
三种情况:tvptr == NULL 永远等待;tvptr->tv_sec == 0 && tvptr->tv_usec == 0 完全等待;等于0候等待间select三指针都空候select提供种比sleep更精确定器注意select第参数maxfdp1并描述符数描述符加1起限制作用防止错二给内核轮询候提供届提高效率select返-1表示错0表示超返值所已经准备描述符数(同描述符读写都准备结影响+2)
2.int FD_ISSET(int fd, fd_set *fdset); fd描述符集合非0否则返0
3.int FD_CLR(int fd, fd_set *fd_set); int FD_SET(int fd, fd_set *fdset) ;int FD_ZERO(fd_set *fdset);
用段linux manFD_ZERO() clears a set.FD_SET() and FD_CLR() respectively add and remove a given file descriptor from a set. FD_ISSET() tests to see if a file descriptor is part of the set; this is useful after select() returns.几函数与描述符01没关系添加删除检测描述符否set
2)epoll
1.int epoll_create(int size);
创建epoll句柄size用告诉内核监听数目共参数同于select()第参数给监听fd+1值需要注意创建epoll句柄占用fd值linux查看/proc/进程id/fd/能够看fd所使用完epoll必须调用close()关闭否则能导致fd耗尽
2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll事件注册函数同与select()监听事件告诉内核要监听类型事件先注册要监听事件类型第参数epoll_create()返值第二参数表示作用三宏表示:
EPOLL_CTL_ADD:注册新fdepfd;
EPOLL_CTL_MOD:修改已经注册fd监听事件;
EPOLL_CTL_DEL:epfd删除fd;
第三参数需要监听fd第四参数告诉内核需要监听事struct epoll_event结构:
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
events几宏集合:
EPOLLIN :表示应文件描述符读(包括端SOCKET关闭);
EPOLLOUT:表示应文件描述符写;
EPOLLPRI:表示应文件描述符紧急数据读(应该表示带外数据);
EPOLLERR:表示应文件描述符发错误;
EPOLLHUP:表示应文件描述符挂断;
EPOLLET: EPOLL设边缘触发(Edge Triggered)模式相于水平触发(Level Triggered)说
EPOLLONESHOT:监听事件监听完事件需要继续监听socket需要再socket加入EPOLL队列
关于epoll工作模式ETLT
LT(level triggered)缺省工作式并且同支持blockno-block socket.种做内核告诉文件描述符否绪绪fd进行IO操作作任何操作内核继续通知所种模式编程错误能性要点传统select/poll都种模型代表.
ET (edge-triggered)高速工作式支持no-block socket种模式描述符未绪变绪内核通epoll告诉假设知道文件描述符已经绪并且再文件描述符发送更绪通知直做某些操作导致文件描述符再绪状态请注意直fd作IO操作(导致再变未绪)内核发送更通知(only once)
3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
等待事件产类似于select()调用参数events用内核事件集合maxevents告内核eventsmaxevents值能于创建epoll_create()size参数timeout超间(毫秒0立即返-1永久阻塞)该函数返需要处理事件数目返0表示已超
请采纳
、问题引 联系区别
问题引需要读两I/O候使用阻塞式I/O能间阻塞描述符面另外描述符虽数据能读实性能满足要求概解决案几种:
1.使用进程或者线程种造程序复杂且与进程与线程创建维护需要销(Apache服务器用进程式优点隔离用户)
2.用进程使用非阻塞I/O读取数据I/O读候立刻返检查否读种形式循环轮询(polling)种比较浪费CPU间数间读仍花费间断反复执行read系统调用
3.异步I/O(asynchronous I/O)描述符准备候用信号告诉进程由于信号数限描述符适用
4.种较式I/O路转接(I/O multiplexing)(貌似翻译路复用)先构造张关描述符列表(epoll队列)调用函数直些描述符准备才返返告诉进程哪些I/O绪selectepoll两机制都路I/O机制解决案selectPOSIX标准epollLinux所特
区别(epoll相select优点)主要三:
1.select句柄数目受限linux/posix_types.h文件声明:#define __FD_SETSIZE 1024 表示select同监听1024fdepoll没限制打文件句柄数目
2.epoll处随着FD数目增降低效率selec采用轮询处理其数据结构类似数组数据结构epoll维护队列直接看队列空epoll"跃"socket进行操作---内核实现epoll根据每fd面callback函数实现"跃"socket才主调用 callback函数(句柄加入队列)其idle状态句柄则点epoll实现"伪"AIO绝部I/O都跃每I/O端口使用率高epoll效率定比select高(能要维护队列复杂)
3.使用mmap加速内核与用户空间消息传递论select,pollepoll都需要内核FD消息通知给用户空间何避免必要内存拷贝重要点epoll通内核于用户空间mmap同块内存实现
二、接口
1)select
1. int select(int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict tvptr);
struct timeval{
long tv_sec;
long tv_usec;
}
三种情况:tvptr == NULL 永远等待;tvptr->tv_sec == 0 && tvptr->tv_usec == 0 完全等待;等于0候等待间select三指针都空候select提供种比sleep更精确定器注意select第参数maxfdp1并描述符数描述符加1起限制作用防止错二给内核轮询候提供届提高效率select返-1表示错0表示超返值所已经准备描述符数(同描述符读写都准备结影响+2)
2.int FD_ISSET(int fd, fd_set *fdset); fd描述符集合非0否则返0
3.int FD_CLR(int fd, fd_set *fd_set); int FD_SET(int fd, fd_set *fdset) ;int FD_ZERO(fd_set *fdset);
用段linux manFD_ZERO() clears a set.FD_SET() and FD_CLR() respectively add and remove a given file descriptor from a set. FD_ISSET() tests to see if a file descriptor is part of the set; this is useful after select() returns.几函数与描述符01没关系添加删除检测描述符否set
2)epoll
1.int epoll_create(int size);
创建epoll句柄size用告诉内核监听数目共参数同于select()第参数给监听fd+1值需要注意创建epoll句柄占用fd值linux查看/proc/进程id/fd/能够看fd所使用完epoll必须调用close()关闭否则能导致fd耗尽
2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll事件注册函数同与select()监听事件告诉内核要监听类型事件先注册要监听事件类型第参数epoll_create()返值第二参数表示作用三宏表示:
EPOLL_CTL_ADD:注册新fdepfd;
EPOLL_CTL_MOD:修改已经注册fd监听事件;
EPOLL_CTL_DEL:epfd删除fd;
第三参数需要监听fd第四参数告诉内核需要监听事struct epoll_event结构:
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
events几宏集合:
EPOLLIN :表示应文件描述符读(包括端SOCKET关闭);
EPOLLOUT:表示应文件描述符写;
EPOLLPRI:表示应文件描述符紧急数据读(应该表示带外数据);
EPOLLERR:表示应文件描述符发错误;
EPOLLHUP:表示应文件描述符挂断;
EPOLLET: EPOLL设边缘触发(Edge Triggered)模式相于水平触发(Level Triggered)说
EPOLLONESHOT:监听事件监听完事件需要继续监听socket需要再socket加入EPOLL队列
关于epoll工作模式ETLT
LT(level triggered)缺省工作式并且同支持blockno-block socket.种做内核告诉文件描述符否绪绪fd进行IO操作作任何操作内核继续通知所种模式编程错误能性要点传统select/poll都种模型代表.
ET (edge-triggered)高速工作式支持no-block socket种模式描述符未绪变绪内核通epoll告诉假设知道文件描述符已经绪并且再文件描述符发送更绪通知直做某些操作导致文件描述符再绪状态请注意直fd作IO操作(导致再变未绪)内核发送更通知(only once)
3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
等待事件产类似于select()调用参数events用内核事件集合maxevents告内核eventsmaxevents值能于创建epoll_create()size参数timeout超间(毫秒0立即返-1永久阻塞)该函数返需要处理事件数目返0表示已超
请采纳
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询