新聞中心

        EEPW首頁 > 測試測量 > 設計應用 > labview深入探索-----內存管理和緩存重用

        labview深入探索-----內存管理和緩存重用

        作者: 時間:2017-01-09 來源:網絡 收藏



        對于一個不顯示的子VI是不存在操作數據的,如果打開了SUBVI的前面板,則包含的控制器和指示器的操作數據.

        在下面的情況下,將包括操作數據.

        .前面板打開.

        .框圖程序使用的屬性節點,導致前面板載入內存,可能不顯示,但是存在.

        .局部變量讀寫了控制器和指示器.

        .設置了VI屬性,OPEN WHEN CALLED.

        對于BLOCK的operate數據只有在BLOCK顯示的情況下才發生,編譯成執行文件時可以不考慮.

        代碼空間,包括所有子VI的代碼空間在主VI載入內存時,一起載入,并長期存在,它包含的是框圖編譯形成的機器碼.

        子VI的代碼空間一般比較小,但是當幾百個以上的SUBVI時,這個內存占用就不能不考慮了,當你執行主VI時候,不管這段代碼是否有用,它都是一直存在的.

        如果是通過VI服務器動態調用的SUBVI,那代碼空間是否載入,何時載入,取決于用戶了.所以使用動態調用的方法可以有效地節約內存,但是同時如果經常重復調用,將影響到運行速度,節約內存是以犧牲速度為代價的.

        LV內存管理是自動的,但并不是完全不可干預的,通過研究它的基本運行規則加上我們良好的編程風格,就可以提高使用效率.

        看一些實際的例子.


         

        因為循環計數端子數據類型是I32,占四個字節,所以1000個數據占4K字節,從循環流出的數據占數據空間4K,

        最上面的圖是數組索引,是讀的操作,對數據流上的數據不做任何改變,所以不需要分配新的內存,而是重用了內存.而下面的圖是替換數組元素.替換后數組將發生變化,因為3個并行的替換是獨立的,沒有先后次序,所以LV不得不為2,3處分配額外的4K+4K字節,加上循環后分配的4K字節,這樣1,2,3處就一共占用了12K.


        這個圖中,替換是要改寫數據的,索引是不需要改寫的,如果替換先執行,則必須為索引部分重新分配4K內存,避免因數據改動讀回錯誤的數據.LV的內存管理器是非常智能化的,因此,它會先執行索引操作,然后在執行替換操作,這樣就重用了4K內存,因此占用數據空間還是4K.



        這兩個框圖的功能是完全一樣的,但是數據空間內存占有量是完全不同的.LV內存重用它首先選擇從上到下的方式,

        循環中隨機數的數據類型是DOUBLE,8個字節,因此數據流出8K,1.2加上指示器的操作數據共24K,

        下面的圖中,在ADD的過程,它首先試圖選擇1的重用,但是1在乘法的輸入需要,所以無法重用,因此在3處又占用了8K的字節,令人感到疑惑的是它為什么不重用2的內存那,因為它首先選的是上面的1,可見,LV的內存管理器也不是萬能的.


        既然LV首先選擇上面的重用,那上圖的字節應該是8K+8K+8K=24K啊,它為什么用的是16K那,這是另外一個原則,因為最上面的是標量,而運算結果是數組,顯然標量是無法重用成數組的,因此,它選擇了下面的數組輸出來重用.8K+8K(指示器)=16K


        從上面的圖可以看出,未連接的輸出并不占內存空間,因為未連接的輸出沒有后續的數據需要流動,所以LV并不為其分配內存.

        SUBVI中的默認值也是內存空間占用比較大的,尤其是數組和字符串,它會在VI內部保持它的默認值,并隨著VI一起保存在磁盤中,當然,設定默認值對子VI的調試非常有好處,如果測試完畢,不需要子VI的默認值,記住要清理掉.

        還有一些主要是涉及數據類型轉換的問題,結合數據類型再分析.



         


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 青阳县| 鄂托克前旗| 和静县| 石首市| 祁门县| 东源县| 隆尧县| 美姑县| 教育| 张北县| 东光县| 读书| 辽宁省| 岳阳市| 建瓯市| 宁化县| 弋阳县| 清苑县| 甘泉县| 贵阳市| 中方县| 朝阳县| 酒泉市| 临沂市| 巴林右旗| 翁牛特旗| 西宁市| 诸城市| 波密县| 龙南县| 广南县| 依安县| 琼海市| 曲周县| 珠海市| 遵义市| 丁青县| 青河县| 建昌县| 西乌珠穆沁旗| 三亚市|