這篇文章是陶輝nginx的學習筆記。linux
首先,共享內存,是全部進程均可以訪問。是進程通訊的一種方法。nginx
其次,就是磁盤文件和內存的映射。程序員
這裏的內存是共享內存。web
可是,在NGINX裏,是沒有用到磁盤文件,而只用到共享內存。服務器
NGINX的共享內存,主要是被主進程和從進程共同使用。數據結構
主進程是master進程,從進程是work進程。多線程
主進程,主要幹幾件事情:
1.管理全部/全局東西
2.建立從進程
fork方法
3.申請共享內存
Linux有專門的申請共享內存方法,其實就是磁盤文件和內存映射的方法。叫map什麼的。socket
從進程,主要做用就是,處理請求。函數
NGINX的進程都是單線程,不是多線程。性能
消費隊列和事件隊列的區別?
不一樣點
一個是數據,一個是操做,都有寫讀。只不過一個是是寫數據,一個是寫操做。數據是寫到集合裏,好比隊列。操做也是寫到一個數據結構裏,操做其實也只是一個對象,只不過概念有一點不同而已。好比,消費隊列是叫消費者須要訂閱主題/消費隊列,生產者向消息隊列寫數據。而事件是消費者須要先註冊一個什麼事件,好比TCP socket裏的鏈接事件,寫數據事件,,讀數據事件。
相同點
都有生產者和消費者,都是一個生產者生產數據/操做,一個消費者消費數據/操做。
1.半鏈接
Syn
2.鏈接成功
Ack
3.關閉
Fin
4.窗口抖動?
這他媽什麼破名字
5.backlog
隊列最大數量,分別在各個不一樣的狀態
具體來講,就是客戶端其實是和操做系統內核打交道,一直到最終內核建立鏈接,而且把鏈接放到鏈接集合,即accept隊列裏。
NGINX,包括其餘的全部的服務器軟件,都只是從操做系統內核的鏈接隊列即accept隊列裏取一個已經建立好的鏈接對象而已。
操做系統內核有兩個集合,一個是未完成的鏈接,即剛進來的鏈接,新的鏈接,所謂未完成,指的是握手的這個流程沒有完成。
一個是已經完成的鏈接,即完成握手的鏈接。
握手其實也就是請求,響應。按理來講,應該只有兩步。
可是,實際狀況是,更復雜一點。多了一個確認的過程。
原本應該是
1.客戶端請求
2.服務器確認收到請求,處理數據
3.服務器返回數據
實際是
1.客戶端請求
發送請求
2.服務器確認收到請求
把確認發給客戶端。
你收到了請求,要告訴別人即客戶端,別人即客戶端才知道你服務器收到了請求。
3.客戶端確認服務器收到了請求
和2同理,客戶端收到了服務器的確認收到客戶端請求,可是客戶端也須要把這個確認告訴服務器。
4.服務器,即內核,把新鏈接放到已完成握手的隊列裏面
實際上,就是多了一個互相確認的過程,這個確認是指,還有點不同。
服務器的確認是,收到了客戶端的請求。
客戶端的確認是,服務器收到了可客戶端的請求。
c原本是須要程序員本身分配內存,本身釋放內存,這樣有兩個問題,麻煩,並且還容易忘。基於此,JVM的垃圾回收就是爲了解決這個問題的,就是內存釋放的問題,把這個工做自動化,而不須要程序員人爲的處理這個跟具體業務沒什麼關係的操做。至於分配內存,這個確定是須要程序員手動建立的,由於建立對象,是程序員要不要建立和建立什麼對象。NGINX裏的內存池,也是爲了解決自動釋放內存的問題,具體是每一個請求和每一個鏈接都有本身的獨立的線程池。這樣的目的是,當請求/鏈接銷燬的時候,即生命週期結束的時候,那麼內存池也當即釋放,這樣就不會出現線程池申請以後,就一直佔着內存的狀況。
信號是其中的一種方式。
全部的回調函數,都是基於阻塞隊列,而阻塞隊列的調用者是操做系統,就是有數據來了,就給消費者。
按時間順序
1.Apache
C
2.Tomcat
Java
3.NGINX
C
高性能
如今市場佔用率第二名,超過Tomcat
是什麼
顧名思義,是旋轉屢次獲取鎖,就是循環屢次獲取鎖。而不是,在那裏等待別人釋放。
代碼
代碼如何實現,來一段代碼。
鎖的使用時間長短
由於要循環屢次獲取鎖,因此適合鎖佔用時間短的狀況。不然,鎖一直被別的線程佔用,那麼自旋鎖線程一直在長時間空轉,浪費CPU。
不是獲取不到鎖,就必需要等待嗎?爲何還能繼續循環執行獲取鎖。
自旋鎖,適合核心業務處理代碼,由於必需要儘快主動獲取鎖,不能只是光等待。
做用是同步。
代碼
做用是進程之間的通訊。主要是短數據,好比01,就是一個數字,一個進程通知一個進程作什麼事情。
代碼
陶輝 nginx