labview深入探索-----內(nèi)存管理和緩存重用
對(duì)于一個(gè)不顯示的子VI是不存在操作數(shù)據(jù)的,如果打開(kāi)了SUBVI的前面板,則包含的控制器和指示器的操作數(shù)據(jù).
在下面的情況下,將包括操作數(shù)據(jù).
.前面板打開(kāi).
.框圖程序使用的屬性節(jié)點(diǎn),導(dǎo)致前面板載入內(nèi)存,可能不顯示,但是存在.
.局部變量讀寫(xiě)了控制器和指示器.
.設(shè)置了VI屬性,OPEN WHEN CALLED.
對(duì)于BLOCK的operate數(shù)據(jù)只有在BLOCK顯示的情況下才發(fā)生,編譯成執(zhí)行文件時(shí)可以不考慮.
代碼空間,包括所有子VI的代碼空間在主VI載入內(nèi)存時(shí),一起載入,并長(zhǎng)期存在,它包含的是框圖編譯形成的機(jī)器碼.
子VI的代碼空間一般比較小,但是當(dāng)幾百個(gè)以上的SUBVI時(shí),這個(gè)內(nèi)存占用就不能不考慮了,當(dāng)你執(zhí)行主VI時(shí)候,不管這段代碼是否有用,它都是一直存在的.
如果是通過(guò)VI服務(wù)器動(dòng)態(tài)調(diào)用的SUBVI,那代碼空間是否載入,何時(shí)載入,取決于用戶了.所以使用動(dòng)態(tài)調(diào)用的方法可以有效地節(jié)約內(nèi)存,但是同時(shí)如果經(jīng)常重復(fù)調(diào)用,將影響到運(yùn)行速度,節(jié)約內(nèi)存是以犧牲速度為代價(jià)的.
LV內(nèi)存管理是自動(dòng)的,但并不是完全不可干預(yù)的,通過(guò)研究它的基本運(yùn)行規(guī)則加上我們良好的編程風(fēng)格,就可以提高使用效率.
看一些實(shí)際的例子.
因?yàn)檠h(huán)計(jì)數(shù)端子數(shù)據(jù)類型是I32,占四個(gè)字節(jié),所以1000個(gè)數(shù)據(jù)占4K字節(jié),從循環(huán)流出的數(shù)據(jù)占數(shù)據(jù)空間4K,
最上面的圖是數(shù)組索引,是讀的操作,對(duì)數(shù)據(jù)流上的數(shù)據(jù)不做任何改變,所以不需要分配新的內(nèi)存,而是重用了內(nèi)存.而下面的圖是替換數(shù)組元素.替換后數(shù)組將發(fā)生變化,因?yàn)椋硞€(gè)并行的替換是獨(dú)立的,沒(méi)有先后次序,所以LV不得不為2,3處分配額外的4K+4K字節(jié),加上循環(huán)后分配的4K字節(jié),這樣1,2,3處就一共占用了12K.
這個(gè)圖中,替換是要改寫(xiě)數(shù)據(jù)的,索引是不需要改寫(xiě)的,如果替換先執(zhí)行,則必須為索引部分重新分配4K內(nèi)存,避免因數(shù)據(jù)改動(dòng)讀回錯(cuò)誤的數(shù)據(jù).LV的內(nèi)存管理器是非常智能化的,因此,它會(huì)先執(zhí)行索引操作,然后在執(zhí)行替換操作,這樣就重用了4K內(nèi)存,因此占用數(shù)據(jù)空間還是4K.
這兩個(gè)框圖的功能是完全一樣的,但是數(shù)據(jù)空間內(nèi)存占有量是完全不同的.LV內(nèi)存重用它首先選擇從上到下的方式,
循環(huán)中隨機(jī)數(shù)的數(shù)據(jù)類型是DOUBLE,8?jìng)€(gè)字節(jié),因此數(shù)據(jù)流出8K,1.2加上指示器的操作數(shù)據(jù)共24K,
下面的圖中,在ADD的過(guò)程,它首先試圖選擇1的重用,但是1在乘法的輸入需要,所以無(wú)法重用,因此在3處又占用了8K的字節(jié),令人感到疑惑的是它為什么不重用2的內(nèi)存那,因?yàn)樗紫冗x的是上面的1,可見(jiàn),LV的內(nèi)存管理器也不是萬(wàn)能的.
既然LV首先選擇上面的重用,那上圖的字節(jié)應(yīng)該是8K+8K+8K=24K啊,它為什么用的是16K那,這是另外一個(gè)原則,因?yàn)樽钌厦娴氖菢?biāo)量,而運(yùn)算結(jié)果是數(shù)組,顯然標(biāo)量是無(wú)法重用成數(shù)組的,因此,它選擇了下面的數(shù)組輸出來(lái)重用.8K+8K(指示器)=16K
從上面的圖可以看出,未連接的輸出并不占內(nèi)存空間,因?yàn)槲催B接的輸出沒(méi)有后續(xù)的數(shù)據(jù)需要流動(dòng),所以LV并不為其分配內(nèi)存.
SUBVI中的默認(rèn)值也是內(nèi)存空間占用比較大的,尤其是數(shù)組和字符串,它會(huì)在VI內(nèi)部保持它的默認(rèn)值,并隨著VI一起保存在磁盤中,當(dāng)然,設(shè)定默認(rèn)值對(duì)子VI的調(diào)試非常有好處,如果測(cè)試完畢,不需要子VI的默認(rèn)值,記住要清理掉.
還有一些主要是涉及數(shù)據(jù)類型轉(zhuǎn)換的問(wèn)題,結(jié)合數(shù)據(jù)類型再分析.
評(píng)論