天天看點

關于應用程式的重新開機

實際上,任何可以順序執行的物件都可以重新啟動,這裡的意義很簡單,所謂重新開機必然有一個啟動,隻有啟動的東西才可以重新啟動,而啟動意味着開始,大家都知道馮氏的指令都是順序執行的,是以不光是機器,所有馮氏機器裡面的執行緒都可以被重新開機,當然也都有冷重新開機和熱重新開機兩種方式。本質上講,整台馮氏機器就是一 個執行緒,可以叫做機器程序(參見《作業系統》一書,老外寫的),這個意義上機器程序和我們的應用程式程序沒有差別,隻不過應用程式程序的層次比機器程序的層次更高。 

我們看一下應用程式怎麼重新開機,不知道大家有沒有用過迅雷和eclipse,當遇到一些問題的時候,會彈出一個對話框說程式要重新開機,然後我們點确定,原來的 程序退出,新的程序起來了,這一切看似簡單,仔細考慮一下就會發現并不容易實作,因為在舊程序退出和新程序啟動的時間間隔裡,這個程序實際上沒有任何資訊在系統裡面,除非有一個第三方程序一直在監視這個程序,當檢測到該程序退出并且要求重新開機時,立馬再重新啟動一個相同的程序,如果沒有這個第三方管理程序, 重新開機看來是很難實作的。可是真的就是很難實作嗎? 

我們回想一下馮氏機器的特點就會知道,隻要讓執行指令回到原點就可以了,這種重新啟動就是熱重新開機,那麼怎麼實作指令的回歸呢?在linux中,我們可以用 exec來實作,exec誰呢?當然是exec自己了,比如目前在執行“test”,那麼就在test内部的異常進行中要重新開機目前程序的地方調用 execX("test",...)就可以了,這就是熱重新開機,也就是軟體指令主動的重新開機,一切大環境,大容器都沒有變,隻不過容器裡面的東西變了而已,在 linux中可以看出,在執行完exec重新開機該程序後,程序的pid并沒有變化,包括信号的阻塞掩碼也沒有變化,你要想讓之變化,那麼你就必須手工設定, 在windows中,好像沒有什麼辦法可以實作上述的熱重新開機操作,重新開機操作過後,一切都變了,不光人非,物也非了(linux中可以做到物是人非)。 

如果想實作冷重新開機,很簡單,就是被動的執行就可以了,這就需要一個管理程序來操作重新開機行為了,比如該管理程序先殺死原始程序,等待一切幹淨以後,馬上再啟動一個就是了,這裡的管理程序相當于機器重新開機過程中的硬體的作用,是一個主動發号指令的實體。必須要明白的是,重新開機的種類有兩種,如果容器不變隻是内容變 化了,那麼就是熱重新開機,如果連容器都變了,那麼就是冷重新開機,抛開冷熱不談,重新開機的本質是指令的重新執行,是一種指令的回歸。理論扯完了,那麼就看一下代碼吧,我這裡有一個程序重新開機的代碼,我們知道在linux中程序指的不僅僅是可執行映像的動态行為,還可以是fork後的執行緒,我這裡給出的代碼就是重新 啟動fork後的子程序的代碼:

#include.h>

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274157

繼續閱讀