天天看點

【nginx】1、理論備用知識

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)
    • 那麼使用者要讀一個檔案:
      • 首先,請求發給核心,核心再發給使用者空間
      • 然後使用者空間處理完後,将内容發給核心空間,核心空間再發給使用者
        【nginx】1、理論備用知識
    • 那麼如果是sendfile,
      • 假如是讀取一個靜态檔案,靜态檔案是在硬碟上的,硬碟誰可以讀?核心可以讀,那麼也就不需要使用者空間處理。
      • 也就是說,使用者讀一個靜态檔案(比如.css),直接請求給核心,核心直接把檔案返給使用者了。不經過使用者空間。
        【nginx】1、理論備用知識
    • 靜:靜态内容
      • 比如html、css、js
      • nginx直接讓核心空間把檔案讀出來返給使用者,不經過使用者空間
    • 動:動态内容
      • 比如需要經過應用程式處理的内容,比如注冊、登陸
      • nginx讓核心接受使用者請求,再轉交給使用者空間,使用者空間處理後,傳回給核心,核心再返給使用者

繼續閱讀