cow[車載基站]

cow[車載基站]

一般有兩個理解:一、車載基站,安裝在平板拖車上的基站設備;二是寫時複製,有一定經驗的程式設計師應該都知道Copy On Write(寫時複製)使用了“引用計數”(reference counting),會有一個變數用於保存引用的數量。

車載基站

安裝在平板拖車上的基站設備,這種設備可用於緊急狀態時,例如某個基站的發射塔發生倒塌,或基站設備發生意外事故時,車載基站就可以迅速暫時替代,保持小區內的通信。

英文

名詞 n.

1.母牛

Most cows run dry in about 10 months.

大多數乳牛約10個月後就不再有奶了。

2.雌象,雌鯨(及某些大型雌性動物)

3.婆娘;娘兒們及物動詞

vt.

1.恐嚇;嚇唬;威脅;脅迫

寫時複製

英文縮寫:COW (copy-on-write) 中文譯名: 。

技術原理

有一定經驗的程式設計師應該都知道Copy On Write(寫時複製)使用了“引用計數”(reference counting),會有一個變數用於保存引用的數量。當第一個類構造時,string的構造函式會根據傳入的參數從堆上分配記憶體,當有其它類需要這塊記憶體時,這個計數為自動累加,當有類析構時,這個計數會減一,直到最後一個類析構時,此時的引用計數為1或是0,此時,程式才會真正的Free這塊從堆上分配的記憶體。

通俗理解

Scott Meyers在《More Effective C++》 中舉了個例子,在你還在上學的時候,你的父母要你不要看電視,而去複習功課,於是你把自己關在房間裡,做出一副正在複習功課的樣子,其實你在幹著別的諸如給班上的某位女生寫情書之類的事,而一旦你的父母出來在你房間要檢查你是否在複習時,你才真正撿起課本看書。這就是“拖延戰術”,直到 你非要做的時候才去做。

當然,這種事情在現實生活中時往往會出事,但其在編程世界中搖身一變,就成為了最有用的技術,正如C++中的可以隨處聲明變數的特點一樣,Scott Meyers推薦我們,在真正需要一個存儲空間時才去聲明變數(分配記憶體),這樣會得到程式在運行時最小的記憶體花銷。執行到那才會去做分配記憶體這種比較耗時的工作,這會給我們的程式在運行時有比較好的性能。畢竟,20%的程式運行了80%的時間。

思想套用

當 然,拖延戰術還並不只是string這樣一種類型,這種技術被我們廣泛地套用著,特別是在作業系統當中,當一個程式運行結束時,作業系統並不會急著把其清除出記憶體,原因是有可能程式還會馬上再運行一次(從磁碟把程式裝入到記憶體是個很慢的過程),而只有當記憶體不夠用了,才會把這些還駐留記憶體的程式清出。

寫時複製(Copy-On-Write)技術,就是編程界“懶惰行為”——拖延戰術的產物。舉個例子,比如我們有個程式要寫檔案,不斷地根據網路傳來的數據寫,如果每一次fwrite或是fprintf都要進行一個磁碟的I/O操 作的話,都簡直就是性能上巨大的損失,因此通常的做法是,每次寫檔案操作都寫在特定大小的一塊記憶體中(磁碟快取),只有當我們關閉檔案時,才寫到磁碟上 (這就是為什麼如果檔案不關閉,所寫的東西會丟失的原因)。更有甚者是檔案關閉時都不寫磁碟,而一直等到關機或是記憶體不夠時才寫磁碟,Unix就是這樣一個系統,如果非正常退出,那么數據就會丟失,檔案就會損壞。

為了性能我們需要冒這樣大的風險,還好我們的程式是不會忙得忘了還有一塊數據需要寫到磁碟上的,所以這種做法,還是很有必要的。

而我們最經常使用的fork()函式,在父進程創建子進程時,就是採用此技術,不是立刻將父進程的進程空間拷貝一份給子進程用,而是讓子進程共享父進程的進程空間,只在需要寫入時才進行拷貝,讓它們擁有各自的進程空間。這是很有用的,因為拷貝進程空間是一個開銷很大的過程,而很多情況下並不需要對進程空間進行寫操作,比如創建一個進程只是執行,或者子進程馬上啟動一個新的進程,這些情況下,並不需要獨立的進程空間,寫時複製就顯得很“高明”。

相關詞條

相關搜尋

熱門詞條

聯絡我們