windows守護程序與程序同步
在一些伺服器應用中,守護程序經常被用到,用於與主程序互動或同步資料等。例如,一些應用需要非常頻繁地操作資料,為了減小資料庫伺服器的壓力,有時會在記憶體中對資料庫表進行對映,通常的操作都是在記憶體中進行,然後用一定的策略將記憶體中的資料庫同步到資料庫中儲存。這樣的架構可以提升效能,可以說是用記憶體空間換時間,特別對於大型應用很有效。但是,這樣也存在一定的風險,畢竟不能完全保證伺服器一直穩定地執行,當這個用於管理的資料伺服器突然宕機,或者停電之類的突發情況,記憶體資料還沒來得及同步到資料庫中就消失了,會造成部分資料丟失。我們不能因此而停止優化的腳步,因為即使是實時寫資料庫的策略在停電的情況下也會導致資料丟失,我們能做的就是在資料丟失率和效能之間找到一個平衡點。所以,這裡討論的是採用快取策略的伺服器架構下,採用守護程序來減小伺服器宕機導致的資料丟失率。對於停電情況不討論,因為你可以加裝一個備用發電機或蓄電池之類的東西,這不在程式的可控範圍。
說到守護程序,很多人一定會想到Unix系統的Daemon程序或者windows的服務,這些都是很好的解決方案。這裡要討論的是實施簡便的一般守護程序,類似於Unix的Daemon程序,不是windows服務。
我們假設有這樣的需求:主服務程式啟動時啟動守護程序,當伺服器程式宕機的時候,守護程序有兩套解決方案:1、守護程序將主服務程式在記憶體中的資料進行寫資料庫操作,儲存資料。2、守護程序一直執行,等待主服務程序啟動,以便讓主服務程式再次接管那片記憶體,從而不丟失資料。很明顯,這裡要用到共享記憶體。
對於方案一,一般流程可以如下:
1、啟動主程序,檢查是否是唯一例程,如果不是則退出
2、啟動守護程序,等待守護程序初始化
3、守護程序檢查是否唯一例程,如果不是則關閉已執行的例程後退出。否則初始化,給主程序傳送初始化成功的同步訊息,等待主程序共享記憶體初始化
4、主程序繼續初始化共享記憶體,傳送共享記憶體初始化成功的同步資訊
5、守護程序獲取共享記憶體控制代碼,等待主程序退出
6、主程序繼續初始化其他東西,並正常執行
7、主程序如果正常退出,則將共享記憶體中的資料儲存並清空。
8、守護程序檢測到主程序退出,則判斷共享記憶體中是否有需要儲存的資料,如果有則儲存,退出。
對於方案二,一般流程可以如下:
1、啟動主程序,檢查是否唯一例程,如果不是則退出
2、檢查守護程序是否存在,如果存在則獲取共享記憶體控制代碼,儲存共享記憶體資料,清空共享記憶體。否則跳至7
3、啟動守護程序,等待守護程序初始化
4、守護程序初始化,給主程序傳送初始化成功的同步訊息,等待主程序共享記憶體初始化
5、主程序初始化共享記憶體,傳送共享記憶體初始化成功同步訊息
6、守護程序獲取共享記憶體控制代碼,執行不退出。
7、主程序繼續初始化其他東西,並正常執行
這個方案中,守護程序主要起到保護共享記憶體控制代碼的作用
在windows中可以用於程序間同步的有很多核心物件,如Event、Mutex、程序控制代碼等。
共享記憶體中可以保持資料庫資料的一個對映,並用一個標記是否修改、是更新還是插入操作等。當然,共享記憶體也可以用其他的資料結構表示不同的操作,看需要確定。