天天看點

陶輝nginx筆記背景什麼是共享記憶體?線程linux epoll 多路複用 事件驅動機制TCP連接配接細節記憶體池linux單機程序之間通信的各種方式回調函數web伺服器自旋鎖信号量信号參考

背景

這篇文章是陶輝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