select,epoll網路模型經常在面試中出現,epoll是對poll的優化,是linux下最優秀的網路模型
epoll優點:
# 相對select,沒有最大併發數限制 /proc/sys/file-max
# 資料傳遞(使用者空間跟核心空間)通過共享記憶體(mmap)方式
# epoll_wait 直接返回被觸發的fd對應的一塊buffer,不需要遍歷所有的fd
一.linux select模型
流程:1. 宣告陣列fd_a,新增多個socket client fd
2. 監聽埠
3. 將sock_fd 和 陣列fd不為0描述符放入select將檢查的fd_set中
4. 處理 fdsr可以接收資料的連線; 如是sock_fd,新增新連線至fd_a;
詳見:
// select_tcp_server.c二. linux epoll模型#include #include #include #include #include #include #include #include #include #define myport 1234 // the port users will be connecting to
#define backlog 5 // how many pending connections queue will hold
#define buf_size 200
int fd_a[backlog]; // accepted connection fd
int conn_amount; // current connection amount
void showclient()
printf("\n\n");
}
int main(void)
if (setsockopt(sock_fd, sol_socket, so_reuseaddr, &yes, sizeof(int)) == -1)
server_addr.sin_family = af_inet; // host byte order
server_addr.sin_port = htons(myport); // short, network byte order
server_addr.sin_addr.s_addr = inaddr_any; // automatically fill with my ip
memset(server_addr.sin_zero, '\0', sizeof(server_addr.sin_zero));
if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
if (listen(sock_fd, backlog) == -1)
printf("listen port %d\n", myport);
fd_set fdsr;
int maxsock;
struct timeval tv;
conn_amount = 0;
sin_size = sizeof(client_addr);
maxsock = sock_fd;
while (1)
} ret = select(maxsock + 1, &fdsr, null, null, &tv);
if (ret < 0) else if (ret == 0)
// check every fd in the set
for (i = 0; i < conn_amount; i++) else
} }
// check whether a new connection comes
if (fd_isset(sock_fd, &fdsr))
// add to fd queue
if (conn_amount < backlog)
else
} showclient();
} // close other connections
for (i = 0; i < backlog; i++)
} exit(0);
}
//epoll_tcp_server.c#include #include #include #include #include #include #include #include #include #include #include #include #define buf_size 1024
#define serv_port 1234
#define epoll_run_timeout -1
#define epoll_size 10000
#define str_welcome "welcome to sechat! you id is:client #%d"
#define str_message "client #%d>>%s"
#define str_noone_connected "noone connected to server except you"
#define chk(eval) if(eval<0)
#define chk2(res,eval) if((res = eval)<0)
using namespace std;
listclients_list;
// 設定非阻塞
int setnoblocking(int sockfd)
// 處理訊息
int handlemsg(int client)
else
sprintf(message,str_message,client,buf);
list::iterator it;
for(it = clients_list.begin(); it!=clients_list.end();it++)
}} return len;
}int main(int argc,char **argv)
printf("test passed:.2fs\n",(double)(clock()-tstart)/clocks_per_sec);
printf("total server connections:%d\n",epoll_size);
return 0;
}
Android網路程式設計selector模式
下面上 socketchannel ch null socketaddress addr new inetsocketaddress 172.16 3.194,11904 ch socketchannel.open addr selector selector selector.open ch.co...
Linux Apache和Nginx網路模型詳解
程序阻塞和掛起的定義 阻塞是由於程序所需資源得不到滿足,並會最終導致程序被掛起 程序掛起的原因並不一定是由於阻塞,也有可能是時間片得不到滿足,掛起狀態是程序從記憶體排程到外存中的一種狀態,若在就緒態時,從記憶體調出到外存中,就是就緒掛起態,若在阻塞態時,從記憶體調出到外存中,就轉換成了阻塞掛起態 n...
框架篇 linux網路I O Reactor模型
網路i o,可以理解為網路上的資料流。通常我們會基於socket與遠端建立一條tcp或者udp通道,然後進行讀寫。單個socket時,使用乙個執行緒即可高效處理 然而如果是10k個socket連線,或者更多,我們如何做到高效能處理?程序 執行緒 的阻塞 檔案描述符 linux訊號處理 在零拷貝機制篇...