ä¸é¢æ¯selectçå½æ°æ¥å£ï¼
int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
select å½æ°çè§çæ件æ述符å3ç±»ï¼åå«æ¯writefdsãreadfdsãåexceptfdsãè°ç¨åselectå½æ°ä¼é»å¡ï¼ç´å°ææè¿°å¯å°±ç»ªï¼ææ°æ® å¯è¯»ãå¯åãæè
æexceptï¼ï¼æè
è¶
æ¶ï¼timeoutæå®çå¾
æ¶é´ï¼å¦æç«å³è¿å设为nullå³å¯ï¼ï¼å½æ°è¿åãå½selectå½æ°è¿ååï¼å¯ä»¥ éè¿éåfdsetï¼æ¥æ¾å°å°±ç»ªçæ述符ã
selectç®åå ä¹å¨ææçå¹³å°ä¸æ¯æï¼å
¶è¯å¥½è·¨å¹³å°æ¯æä¹æ¯å®çä¸ä¸ªä¼ç¹ãselectçä¸ ä¸ªç¼ºç¹å¨äºå个è¿ç¨è½å¤çè§çæ件æ述符çæ°éåå¨æ大éå¶ï¼å¨Linuxä¸ä¸è¬ä¸º1024ï¼å¯ä»¥éè¿ä¿®æ¹å®å®ä¹çè³éæ°ç¼è¯å
æ ¸çæ¹å¼æåè¿ä¸éå¶ï¼ä½ æ¯è¿æ ·ä¹ä¼é ææççéä½ã
pollï¼
int poll (struct pollfd *fds, unsigned int nfds, int timeout);
ä¸åä¸select使ç¨ä¸ä¸ªä½å¾æ¥è¡¨ç¤ºä¸ä¸ªfdsetçæ¹å¼ï¼poll使ç¨ä¸ä¸ª pollfdçæéå®ç°ã
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events to watch */
short revents; /* returned events witnessed */
};
pollfdç»æå
å«äºè¦çè§çeventååççeventï¼ä¸å使ç¨selectâåæ°-å¼âä¼ éçæ¹å¼ãåæ¶ï¼pollfd并没ææ大æ°ééå¶ï¼ä½æ¯æ°éè¿å¤§åæ§è½ä¹æ¯ä¼ä¸éï¼ã åselectå½æ°ä¸æ ·ï¼pollè¿ååï¼éè¦è½®è¯¢pollfdæ¥è·å就绪çæ述符ã
ä»ä¸é¢çï¼selectåpollé½éè¦å¨è¿ååï¼éè¿éåæ件æ述符æ¥è·åå·²ç»å°±ç»ªçsocketãäºå®ä¸ï¼åæ¶è¿æ¥ç大é客æ·ç«¯å¨ä¸æ¶å»å¯è½åªæå¾å°çå¤äºå°±ç»ªç¶æï¼å æ¤éççè§çæ述符æ°éçå¢é¿ï¼å
¶æçä¹ä¼çº¿æ§ä¸éã
epoll:
epollçæ¥å£å¦ä¸ï¼
å¤å¶ä»£ç
int epoll_create(int size)ï¼
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)ï¼
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
å¤å¶ä»£ç
主è¦æ¯epoll_create,epoll_ctlåepoll_waitä¸ä¸ªå½æ°ãepoll_createå½æ°å建epollæ件æ述符ï¼åæ°size并ä¸æ¯éå¶äºepollæè½çå¬çæ述符æ大个æ°ï¼åªæ¯å¯¹å
æ ¸åå§åé
å
é¨æ°æ®ç»æçä¸ä¸ªå»ºè®®ãè¿åæ¯epollæ述符ã-1表示å建失败ãepoll_ctl æ§å¶å¯¹æå®æ述符fdæ§è¡opæä½ï¼eventæ¯ä¸fdå
³èççå¬äºä»¶ãopæä½æä¸ç§ï¼æ·»å EPOLL_CTL_ADDï¼å é¤EPOLL_CTL_DELï¼ä¿®æ¹EPOLL_CTL_MODãåå«æ·»å ãå é¤åä¿®æ¹å¯¹fdççå¬äºä»¶ãepoll_wait çå¾
epfdä¸çioäºä»¶ï¼æå¤è¿åmaxevents个äºä»¶ã
å¨ select/pollä¸ï¼è¿ç¨åªæå¨è°ç¨ä¸å®çæ¹æ³åï¼å
æ ¸æ对ææçè§çæ件æ述符è¿è¡æ«æï¼èepolläºå
éè¿epoll_ctl()æ¥æ³¨åä¸ ä¸ªæ件æ述符ï¼ä¸æ¦åºäºæ个æ件æ述符就绪æ¶ï¼å
æ ¸ä¼éç¨ç±»ä¼¼callbackçåè°æºå¶ï¼è¿
éæ¿æ´»è¿ä¸ªæ件æ述符ï¼å½è¿ç¨è°ç¨epoll_wait() æ¶ä¾¿å¾å°éç¥ã
epollçä¼ç¹ä¸»è¦æ¯ä¸ä¸å 个æ¹é¢ï¼
1. çè§çæ述符æ°éä¸åéå¶ï¼å®ææ¯æçFDä¸éæ¯æ大å¯ä»¥æå¼æ件çæ°ç®ï¼è¿ä¸ªæ°åä¸è¬è¿å¤§äº2048,举个ä¾å,å¨1GBå
åçæºå¨ä¸å¤§çº¦æ¯10ä¸å·¦ å³ï¼å
·ä½æ°ç®å¯ä»¥cat /proc/sys/fs/file-maxå¯ç,ä¸è¬æ¥è¯´è¿ä¸ªæ°ç®åç³»ç»å
åå
³ç³»å¾å¤§ãselectçæ大缺ç¹å°±æ¯è¿ç¨æå¼çfdæ¯ææ°ééå¶çãè¿å¯¹ äºè¿æ¥æ°éæ¯è¾å¤§çæå¡å¨æ¥è¯´æ ¹æ¬ä¸è½æ»¡è¶³ãè½ç¶ä¹å¯ä»¥éæ©å¤è¿ç¨ç解å³æ¹æ¡( Apacheå°±æ¯è¿æ ·å®ç°ç)ï¼ä¸è¿è½ç¶linuxä¸é¢å建è¿ç¨ç代价æ¯è¾å°ï¼ä½ä»æ§æ¯ä¸å¯å¿½è§çï¼å ä¸è¿ç¨é´æ°æ®åæ¥è¿æ¯ä¸ä¸çº¿ç¨é´åæ¥çé«æï¼æä»¥ä¹ ä¸æ¯ä¸ç§å®ç¾çæ¹æ¡ã
2. IOçæçä¸ä¼éççè§fdçæ°éçå¢é¿èä¸éãepollä¸åäºselectåpoll轮询çæ¹å¼ï¼èæ¯éè¿æ¯ä¸ªfdå®ä¹çåè°å½æ°æ¥å®ç°çãåªæ就绪çfdæä¼æ§è¡åè°å½æ°ã
3.æ¯æçµå¹³è§¦åå边沿触åï¼åªåè¯è¿ç¨åªäºæ件æ述符ååå为就绪ç¶æï¼å®åªè¯´ä¸éï¼å¦ææ们没æéåè¡å¨ï¼é£ä¹å®å°ä¸ä¼å次åç¥ï¼è¿ç§æ¹å¼ç§°ä¸ºè¾¹ç¼è§¦åï¼ä¸¤ç§æ¹å¼ï¼ç论ä¸è¾¹ç¼è§¦åçæ§è½è¦æ´é«ä¸äºï¼ä½æ¯ä»£ç å®ç°ç¸å½å¤æã
4.mmapå éå
æ ¸ä¸ç¨æ·ç©ºé´çä¿¡æ¯ä¼ éãepollæ¯éè¿å
æ ¸äºç¨æ·ç©ºé´mmapåä¸åå
åï¼é¿å
äºæ ççå
åæ·è´ã
温馨提示:答案为网友推荐,仅供参考