面試題目I/O

1️⃣ 【面試指南】請解釋下什麼是 I/O 多路複用?

有必要先弄清這個概念,這裏的 I/O 通常指網絡 I/O,多路指多個 Socket 鏈接,複用指操作系統進行運算調度的最小單位線程。整體意思也就是多個網絡 I/O 複用一個或少量的線程來處理 Socket。
關於 I/O 多路複用的多種實現,繼續參考下文。

I/O 多路複用的四種實現I/O 多路服用有多種實現模式:select、 poll、 epoll、 kqueue

  • select
    通過輪詢檢查在文件描述符上設置的標識位來進行判斷,select 的輪詢相當於在數據庫中查找一條記錄沒有建立索引,對所有的 socket 進行全部遍歷,這對 CPU 是浪費的。另外 select 還有一個限制,對於單個進程所能打開的文件描述符最大隻能是 1024,那麼基於 select 的輪詢技術最多也只能很好的處理 1000 併發的吞吐量,無法解決C10K問題

  • poll
    pollselect 在實現上沒有本質的區別,相比較 select,poll 基於鏈表來實現,沒有了最大鏈接 1024 的限制。但是當文件描述符多了之後,每次調用都會對鏈接進行線性遍歷,性能還是十分低下的。

  • epoll

    • epoll是 linux 下效率最高的 I/O 事件通知機制,沒有最大鏈接限制,通過 callbak 回調通知機制,不在是每次調用都對鏈接進行線性遍歷,這樣就不會隨着文件描述符的增加導致效率下降。
    • epoll的處理⽅式是創建⼀個待處理的事件列表,然後把這個列表發給內核,返回的時候在去輪訓檢查這個表,以判斷事件是否發⽣,epoll⽀持⼀個進程打開的最⼤事件描述符的上限是系統可以打開的⽂件的最⼤數,同時epoll庫的IO效率不隨描述符數⽬增加⽽線性下降,因爲它只會對內核上報的“活躍”的描述符進⾏操作。
    • 在 1GB 內存的機器上能監聽大約 10 萬個端口,遠超過 select 的 1024 限制,具體可以在服務器上查看 cat/proc/sys/fs/file-max
    • 內存拷⻉,利⽤mmap(Memory Mapping)加速與內核空間的消息傳遞;即epoll使⽤mmap減少複製開銷
      在這裏插入圖片描述
  • kqueue
    與 epoll 類似,僅存於 FreeBSD(一種類UNIX操作系統)。

2️⃣ 【面試指南】如果問到輪詢技術的實現一般也會考察 select 和 epoll 的區別?

🅿 1.在操作方式上區別

  • select 採用了線性遍歷來查找,鏈接多了之後可以想象一下在一個諾大的數組中每次通過遍歷來鎖定一個鏈接,是多麼的消耗性能。
  • epoll 則不需要遍歷,採用的是回調機制,可以看作一個 HashTable,來鎖定一個對象是很快的。

🅿 2.文件描述符限制

  • 對於文件描述符(最大連接數)select 限制爲 1024。
  • epoll 則沒有這個限制,通常在 1G 內存的機器上所能支持的連接數爲 10W 左右。

🅿 3.對於操作系統的支持

從操作系統支持上來看,目前流行的高性能 Web 服務器 Nginx 是基於 epoll 來實現高併發,當然如果你的鏈接很小的情況下區別還是不大的 select 也能滿足,如果是大流量、高併發情況 epoll 目前還是首選模型。
如果是大流量、高併發情況 epoll 目前還是首選模型。

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