O、面試問:什麼是程序,什麼是線程?
- 程序是計算機CPU配置設定資源的最小機關。
- 舉例:
比如你有一個計算機,相當于一個工廠,想要幹活,就要建一個廠房,也就是配置設定一定的空間資源。廠房裡有一個或多個勞工在工作。這裡的工廠就是程序,勞工就是線程。一個程序至少有一個線程。
一、同步與異步、阻塞與非阻塞
1. 舉例背景
我們去飯店吃飯,有大廳和後廚。
2. 同步與異步
- 大廳裡的我們下單後,如果等待後廚把飯做好端給我們,然後我們在做其他的事情,這是同步。
- 如果我們下單後,後廚去做飯,我們不等後廚,幹别的事情了,那這就是異步。
- 同步和異步針對的是大廳的我們。
3. 阻塞與非阻塞
- 大廳的我們下單後,把單子給服務員,服務員把單子給後廚。如果服務員等待後廚做好飯後,再做别的事情,那就是阻塞。
- 如果服務員把單子給後廚後,去做别的事情了,那就是非阻塞。
- 阻塞與非阻塞是針對服務員的。
4. 分類
- 同步阻塞IO
- 同步非阻塞IO
- 異步阻塞IO
- 異步非阻塞IO
5. 事件政策
事件模型 | 描述 |
select | 單個程序能打開的最大連接配接數為1024,因為需要對所有的檔案描述符進行線性周遊,是以檔案描述符太多會導緻性能下降。 |
poll | 和select基本一樣,因為用連結清單存儲檔案描述符,沒有最大連接配接數限制 |
epoll | epoll是在每個檔案描述符上設定callback來實作,FD就緒後才會調用callback,活躍socket少的話性能高,socket活躍多的話性能低 |
- 有三種政策:
- 政策一:select
- 當我們下單給服務員後,服務員把單子給廚師。
- 然後服務員輪詢廚師,比如每隔一秒問一次:飯好了沒。一旦有一次飯好了,就把飯給我們。
- 性能不太好
- 政策二:poll
- 與select一樣,隻不過select是數組形式的,有最大限制數,poll是連結清單形式的,沒有最大限制數
-
- 政策三:epoll回調
-
- 然後後廚一旦做好飯了,就告訴服務員,然後服務員就把飯給我們。
- 【面試】什麼時候用select/poll輪詢,什麼時候用epoll回調?
- 後端特别快,用select/poll輪詢,後端滿用epoll回調
4. 誰的性能最低
二、程序間切換
當在a程序做a事情,做到一半,去b程序做b事情,b程序又做到一半,去a程序做a事情。這樣頻繁切換,每次切換的時候,需要儲存目前程序的事情,當下一次再次繼續做的時候,需要恢複儲存的記錄,這樣儲存恢複很消耗性能。
三、檔案描述符
- 檔案描述符(File descriptor)是一個用于表述指向檔案的引用的抽象畫概念
- 當程式打開一個現有檔案或建立一個新檔案時,核心向程序傳回一個檔案描述符
四、I/O模式
- 對于一次IO通路(以read為例),資料會先被拷貝到作業系統核心的緩沖區,然後才會從作業系統核心的緩沖區拷貝到應用程式的緩沖區,最後交給程序。是以說,當一個read操作發生時,它會經理兩個階段:
- a. 等待資料準備
- b. 将資料從核心拷貝到程序中
五、多路IO複用
- 所謂的多路IO複用,就是:
多個顧客點餐,把訂單交給同一個服務員,這個服務員把訂單分發 給多個廚師。
顧客 服務員 後廚
o--> -->o
↓ ↑
o-->-----> O ->------->o
↑ ↓
o--> -->o
六、 CPU親和
- 把CPU核心和nginx的工作程序綁定在一起,讓每個worker程序固定在一個CPU上執行,進而減少CPU的切換并提高緩存命中率,提高性能
七、sendfile
- sendfile 零拷貝傳輸
- 首先,記憶體分為記憶體空間和使用者空間(如果是4G記憶體,那麼分别為1G和3G)
- 那麼使用者要讀一個檔案:
- 首先,請求發給核心,核心再發給使用者空間
- 然後使用者空間處理完後,将内容發給核心空間,核心空間再發給使用者
- 那麼如果是sendfile,
- 假如是讀取一個靜态檔案,靜态檔案是在硬碟上的,硬碟誰可以讀?核心可以讀,那麼也就不需要使用者空間處理。
- 也就是說,使用者讀一個靜态檔案(比如.css),直接請求給核心,核心直接把檔案返給使用者了。不經過使用者空間。
-
- 靜:靜态内容
- 比如html、css、js
- nginx直接讓核心空間把檔案讀出來返給使用者,不經過使用者空間
- 動:動态内容
- 比如需要經過應用程式處理的内容,比如注冊、登陸
- nginx讓核心接受使用者請求,再轉交給使用者空間,使用者空間處理後,傳回給核心,核心再返給使用者