linux select與poll的區別

 linux下面的poll與select的區別:poll與select本質上是一樣的,不同之處有如下:

1. 每個進程使用的select有最大連接數限制,只能有FD_SETSIZE個,而poll沒有這樣的限制(採用鏈表存儲);

弊端:select和poll都需要有一個比較大的結構來存儲所有的socket連接,每次有一個可用(可讀可寫或出錯)的socket過來的時候,都需要遍歷一遍結構,隨着連接的增加,遍歷的長度會越來越長,如此很浪費




使用非阻塞I/O的應用程序也經常使用poll、selec和epoll系統調用。poll、selec和epoll的功能本質上是一樣的:都允許進程決定是否可以對一個和多個打開文件做非阻塞操作的讀取和寫入這些調用也會阻塞進程,直到給定的文件描述符集合中的任何一個可讀取或寫入。因此,他們常常用於那些要使用多個輸入和輸出流而又不會阻塞阻於其中任何一個流的應用程序程序中。同一功能之所以要多個獨立函數提供,是因爲其中兩個幾乎是同時由兩個不同的unix團體分別實現的:selec在BSD unix中引入,而poll由System V引入。epoll系統調用,它用於將poll函數的擴展到能個處理數千個文件描述符。


    對上述系統調用的支持需要來自設備的驅動程序的相應支持。所有三個系統均通過驅動程序的poll方法提供。該方法具有如下的原型:

unsigned int (*poll) (struct file *filp,poll_table *wait);
    
  當用戶空間程序在驅動程序關聯的文件描述上執行poll、selec或epoll系統調用時該驅動程序的poll方法將調用。該設備方法分爲兩步處理:
1.在一個後多個可指示poll狀態變化的等待隊列上調用poll_wait.如果當前沒有文件描述符可用來執行I/O,則內核將使進程再傳遞到該系統調用的所有文件描述符對應的等待隊列上等待。

2返回一個用來描述操作是否可以立即無阻塞執行的位掩碼。

發佈了62 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章