回覆列表
  • 1 # 使用者2180107962444

    select、poll、epoll都是IO多路複用的機制,但是他們的機制有很大的區別

    1、select? select機制剛開始的時候,需要把fd_set從使用者空間複製到核心空間,並且檢測的fd數是有限制的,由FD_SETSIZE設定,一般是1024。

    檢測的時候,根據timeout,遍歷fd_set表,把活躍的fd(可讀寫或者錯誤),複製到使用者空間,

    再在使用者空間依次處理相關的fd。

    這個機制是linux核心很早的版本,epool是根據select,pool基礎上最佳化的,缺點比較多。

    缺點:

    1)每次呼叫select的時候需要把fd_set從使用者空間複製到記憶體空間,比較耗效能。

    2)wait時,需要遍歷所有的fd,消耗比較大。

    3)select支援的檔案數大小了,預設只有1024,如果需要增大,得修改宏FD_SETSIZE值,並編譯核心(麻煩,並且fd_set中的檔案數多的話,每次遍歷的成本就很大)。

    2. pool

    poll的實現和select非常相似,只是描述fd集合的方式不同,poll使用pollfd結構而不是select的fd_set結構,其他的都差不多。

    3. epool

    epool是select和poll的改進版本,

    * 先是使用int epoll_create(int size)在記憶體中建立一個指定size大小的事件空間,

    * 再使用int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);事件註冊函式,註冊新的fd到epfd的epool物件空間中,並指明event(可讀寫啊等等),注意:在註冊新事件fd的過程中,也再核心中斷處理程式裡註冊fd對應的回撥函式callback,告訴核心,一旦這個fd中斷了,就把它放到ready佇列裡面去。

    * 再使用int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);在epool物件對應的ready佇列裡取就緒的fd,並使用記憶體對映mmap複製到使用者空間。

    *犜僭謨沒Э佔湟來未硐喙氐膄d。

    優點:

    1)支援一個程序開啟大數目的socket描述符

    select 一個程序開啟FD是有限制的,由FD_SETSIZE設定,預設值是1024。epool可以開啟的FD數可以很大,一般1GB的記憶體有10萬多的FD數,具體數目可以cat /proc/sys/fs/file-max檢視。

    2)營O效率不隨FD數目增加而線性下降

    3)犑褂胢map加速核心與使用者空間的訊息傳遞

  • 2 # 使用者1465424935672

    select、poll、epoll都是IO多路複用的機制,但是他們的機制有很大的區別

    1、select

    select機制剛開始的時候,需要把fd_set從使用者空間複製到核心空間,並且檢測的fd數是有限制的,由FD_SETSIZE設定,一般是1024。

    檢測的時候,根據timeout,遍歷fd_set表,把活躍的fd(可讀寫或者錯誤),複製到使用者空間,

    再在使用者空間依次處理相關的fd。

    這個機制是linux核心很早的版本,epool是根據select,pool基礎上最佳化的,缺點比較多。

    缺點:

    1)每次呼叫select的時候需要把fd_set從使用者空間複製到記憶體空間,比較耗效能。

    2)wait時,需要遍歷所有的fd,消耗比較大。

    3)select支援的檔案數大小了,預設只有1024,如果需要增大,得修改宏FD_SETSIZE值,並編譯核心(麻煩,並且fd_set中的檔案數多的話,每次遍歷的成本就很大)。

    2. pool

    poll的實現和select非常相似,只是描述fd集合的方式不同,poll使用pollfd結構而不是select的fd_set結構,其他的都差不多。

    3. epool

    epool是select和poll的改進版本,

    * 先是使用int epoll_create(int size)在記憶體中建立一個指定size大小的事件空間,

    * 再使用int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);事件註冊函式,註冊新的fd到epfd的epool物件空間中,並指明event(可讀寫啊等等),注意:在註冊新事件fd的過程中,也再核心中斷處理程式裡註冊fd對應的回撥函式callback,告訴核心,一旦這個fd中斷了,就把它放到ready佇列裡面去。

    * 再使用int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);在epool物件對應的ready佇列裡取就緒的fd,並使用記憶體對映mmap複製到使用者空間。

    * 再在使用者空間依次處理相關的fd。

    優點:

    1)支援一個程序開啟大數目的socket描述符

    select 一個程序開啟FD是有限制的,由FD_SETSIZE設定,預設值是1024。epool可以開啟的FD數可以很大,一般1GB的記憶體有10萬多的FD數,具體數目可以cat /proc/sys/fs/file-max檢視。

    2) IO效率不隨FD數目增加而線性下降

    3) 使用mmap加速核心與使用者空間的訊息傳遞

  • 中秋節和大豐收的關聯?
  • 明心見性,性是指什麼?