天天看點

【面試專欄】自己整理的WebServer項目問題

1.怎樣應對伺服器的大流量、高并發

  • 用戶端:
    • 盡量減少請求數量:依靠用戶端自身的緩存或處理能力
    • 盡量減少對服務端資源的不必要耗費:重複使用某些資源,如連接配接池
  • 服務端:
    • 增加資源供給:更大的網絡帶寬,使用更高配置的伺服器
    • 請求分流:使用叢集,分布式的系統架構
    • 應用優化:使用更高效的程式設計語言,優化處理業務邏輯的算法

2.線程池與多線程的設計思路

  • 設計一個任務隊列,作為臨界資源
  • 初始化n個線程,開始運作,對任務隊列加鎖取拿取任務執行
  • 當任務隊列為空時,所有子線程(工作線程)阻塞(pthread_cond_wait)
  • 主線程感覺到核心事件表上有事件發生時,将任務添加到任務隊列中,喚醒睡眠的工作線程(pthread_cond_signal pthread_cond_broadcast)

3、用戶端斷開連接配接,服務端epoll監聽到的事件是什麼

在使用 epoll 時,用戶端正常斷開連接配接(調用 close()),在伺服器端會觸發一個 epoll 事件。在早期的核心中,這個 epoll 事件一般是 EPOLLIN,即 0x1,代表連接配接可讀。

連接配接池檢測到某個連接配接發生 EPOLLIN 事件且沒有錯誤後,會認為有請求到來,将連接配接交給上層進行處理。這樣一來,上層嘗試在對端已經 close() 的連接配接上讀取請求,隻能讀到 EOF(檔案末尾),會認為發生異常,報告一個錯誤。

後期的核心中增加了 EPOLLRDHUP 事件,代表對端斷開連接配接。對端連接配接斷開觸發的 epoll 事件會包含 EPOLLIN | EPOLLRDHUP,即 0x2001。有了這個事件,對端斷開連接配接的異常就可以在底層進行處理了,不用再移交到上層

4、epoll的線程安全

簡要結論就是epoll是通過鎖來保證線程安全的, epoll中粒度最小的自旋鎖ep->lock(spinlock)用來保護就緒的隊列, 互斥鎖ep->mtx用來保護epoll的重要資料結構紅黑樹

主要的兩個函數:

  • epoll_ctl():當需要根據不同的operation通過ep_insert() 或者ep_remove()等接口對epoll自身的資料結構進行操作時都提前獲得了ep->mtx鎖
  • epll_wait():獲得自旋鎖 ep->lock來保護就緒隊列

5、SO_REUSEDADDR和SO_REUSEDPORT

在TCP連接配接下,如果伺服器主動關閉連接配接(比如ctrl+c結束伺服器程序),那麼由于伺服器這邊會出現time_wait狀态,是以不能立即重新啟動伺服器程序。在标準文檔中,2MSL時間為兩分鐘。

  • 一個端口釋放後會等待兩分鐘之後才能再被使用,SO_REUSEADDR是讓端口釋放後立即就可以被再次使用。

如果不進行端口重用的話,用戶端可能不受什麼影響,因為在用戶端主動關閉後,用戶端可以使用另一個端口與服務端再次建立連接配接;但是服務端主動關閉連接配接後,其周知端口在兩分鐘内不能再次使用,就很麻煩

6、HTTP請求怎麼拆包

HTTP請求内容:請求行,請求頭,空行,請求體

一個有封包的請求到伺服器時,請求頭裡都會有content_length,這個指定了封包的大小。封包如果很大的時候,會通過一部分一部分的發送請求,直到結束。當這個過程中,出現多個請求,第一個請求會帶有請求頭資訊,前面一個請求的發送的封包如果沒有滿時,會把後面一個請求的内容填上,這個操作就叫粘包。這樣粘包後,它會通過content_length字段的大小,來做拆包。

7、VS怎麼debug多線程

https://www.cnblogs.com/thaughtZhao/p/4277941.html

7-2、Clion怎麼調試多線程

https://blog.csdn.net/m0_38129920/article/details/87454405

8、HTTP請求,判斷get送出還是post送出

浏覽器判斷方法:使用者名,密碼輸入内容123,點選提示按鈕,觀察上面提示欄的資訊(username和password的值):

1、如果是這樣:

【面試專欄】自己整理的WebServer項目問題

​ username和password均有輸入值,則是get送出;

2、如果是這樣

【面試專欄】自己整理的WebServer項目問題

​ username和password均無輸入值,則是post送出;但下面的詳細資訊中必有username和password輸入值資訊;

伺服器判斷:解析出狀态行,檢視請求方法

9、HTTP怎麼接收圖檔和視訊流

使用Content-Type字段,說明響應體中的媒體資料類型

10、pthread_XX這些和C++的thread庫,底層實作的差別

https://segmentfault.com/a/1190000002655852

11、水準觸發和邊沿觸發的優缺點、使用場景

https://blog.csdn.net/weixin_49199646/article/details/112298712

12、怎樣正确關閉線程池

https://www.jianshu.com/p/4aee873d607a

13、大檔案傳輸的方案

https://blog.csdn.net/luguifang2011/article/details/26134151?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2alles_rank~default-9-26134151.pc_search_all_es&utm_term=%E5%A4%A7%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E7%9A%84%E6%8A%80%E5%B7%A7&spm=1018.2226.3001.4187

  1. socket本身緩沖區的限制,大概一次隻能發送4K左右的資料,是以在傳輸大資料時用戶端就需要進行分包,在目的地重新組包
  2. 已有一些消息/通訊中間件對此進行了封裝,提供了直接發送大資料/檔案的接口
  3. 利用共享目錄,ftp,ssh等系統指令

14.大數相加(包含負數)

https://www.jianshu.com/p/2ffb8cfdc97b

繼續閱讀