Linux select epoll網路模型

2021-09-02 04:29:57 字數 3290 閱讀 1138

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   

#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);

}

二. linux epoll模型

//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訊號處理 在零拷貝機制篇...