背景
這篇文章是陶輝nginx的學習筆記。
什麼是共享記憶體?
首先,共享記憶體,是所有程序都可以通路。是程序通信的一種方法。
其次,就是磁盤檔案和記憶體的映射。
這裡的記憶體是共享記憶體。
但是,在NGINX裡,是沒有用到磁盤檔案,而隻用到共享記憶體。
NGINX的共享記憶體,主要是被主程序和從程序共同使用。
主程序是master程序,從程序是work程序。
主程序,主要幹幾件事情:
1.管理所有/全局東西
2.建立從程序
fork方法
3.申請共享記憶體
Linux有專門的申請共享記憶體方法,其實就是磁盤檔案和記憶體映射的方法。叫map什麼的。
從程序,主要作用就是,處理請求。
線程
NGINX的程序都是單線程,不是多線程。
linux epoll 多路複用 事件驅動機制
消費隊列和事件隊列的差別?
不同點
一個是資料,一個是操作,都有寫讀。隻不過一個是是寫資料,一個是寫操作。資料是寫到集合裡,比如隊列。操作也是寫到一個資料結構裡,操作其實也隻是一個對象,隻不過概念有一點不一樣而已。比如,消費隊列是叫消費者需要訂閱主題/消費隊列,生産者向消息隊列寫資料。而事件是消費者需要先注冊一個什麼事件,比如TCP socket裡的連接配接事件,寫資料事件,,讀資料事件。
相同點
都有生産者和消費者,都是一個生産者生産資料/操作,一個消費者消費資料/操作。
TCP連接配接細節
1.半連接配接
Syn
2.連接配接成功
Ack
3.關閉
Fin
4.視窗抖動?
這他媽什麼破名字
5.backlog
隊列最大數量,分别在各個不同的狀态
建立連接配接,握手的這個過程,都是由作業系統負責,即Linux核心負責。
具體來說,就是用戶端實際上是和作業系統核心打交道,一直到最終核心建立連接配接,并且把連接配接放到連接配接集合,即accept隊列裡。
NGINX,包括其他的所有的伺服器軟體,都隻是從作業系統核心的連接配接隊列即accept隊列裡取一個已經建立好的連接配接對象而已。
作業系統核心有兩個集合,一個是未完成的連接配接,即剛進來的連接配接,新的連接配接,所謂未完成,指的是握手的這個流程沒有完成。
一個是已經完成的連接配接,即完成握手的連接配接。
握手其實也就是請求,響應。按理來說,應該隻有兩步。
但是,實際情況是,更複雜一點。多了一個确認的過程。
本來應該是
1.用戶端請求
2.伺服器确認收到請求,處理資料
3.伺服器傳回資料
實際是
1.用戶端請求
發送請求
2.伺服器确認收到請求
把确認發給用戶端。
你收到了請求,要告訴别人即用戶端,别人即用戶端才知道你伺服器收到了請求。
3.用戶端确認伺服器收到了請求
和2同理,用戶端收到了伺服器的确認收到用戶端請求,但是用戶端也需要把這個确認告訴伺服器。
4.伺服器,即核心,把新連接配接放到已完成握手的隊列裡面
實際上,就是多了一個互相确認的過程,這個确認是指,還有點不一樣。
伺服器的确認是,收到了用戶端的請求。
用戶端的确認是,伺服器收到了可用戶端的請求。
記憶體池
c本來是需要程式員自己配置設定記憶體,自己釋放記憶體,這樣有兩個問題,麻煩,而且還容易忘。基于此,JVM的垃圾回收就是為了解決這個問題的,就是記憶體釋放的問題,把這個工作自動化,而不需要程式員人為的處理這個跟具體業務沒什麼關系的操作。至于配置設定記憶體,這個肯定是需要程式員手動建立的,因為建立對象,是程式員要不要建立和建立什麼對象。NGINX裡的記憶體池,也是為了解決自動釋放記憶體的問題,具體是每個請求和每個連接配接都有自己的獨立的線程池。這樣的目的是,當請求/連接配接銷毀的時候,即生命周期結束的時候,那麼記憶體池也立即釋放,這樣就不會出現線程池申請之後,就一直占着記憶體的情況。
linux單機程序之間通信的各種方式
信号是其中的一種方式。
回調函數
所有的回調函數,都是基于阻塞隊列,而阻塞隊列的調用者是作業系統,就是有資料來了,就給消費者。
web伺服器
按時間順序
1.Apache
C
2.Tomcat
Java
3.NGINX
C
高性能
現在市場占用率第二名,超過Tomcat
自旋鎖
是什麼
顧名思義,是旋轉多次擷取鎖,就是循環多次擷取鎖。而不是,在那裡等待别人釋放。
代碼
代碼如何實作,來一段代碼。
鎖的使用時間長短
因為要循環多次擷取鎖,是以适合鎖占用時間短的情況。否則,鎖一直被别的線程占用,那麼自旋鎖線程一直在長時間空轉,浪費CPU。
不是擷取不到鎖,就必須要等待嗎?為什麼還能繼續循環執行擷取鎖。
自旋鎖,适合核心業務處理代碼,因為必須要盡快主動擷取鎖,不能隻是光等待。
信号量
作用是同步。
代碼
信号
作用是程序之間的通信。主要是短資料,比如01,就是一個數字,一個程序通知一個程序做什麼事情。
代碼
參考
陶輝 nginx
轉載于:https://juejin.im/post/5cf88e5e6fb9a07ecf721542