新聞中心

EEPW首頁 > 測試測量 > 設(shè)計應(yīng)用 > labview深入探索-----內(nèi)存管理和緩存重用

labview深入探索-----內(nèi)存管理和緩存重用

作者: 時間:2017-01-09 來源:網(wǎng)絡(luò) 收藏
使用過常規(guī)C語言的朋友都知道,C允許編程者,申請內(nèi)存,再分配內(nèi)存和釋放內(nèi)存,這為編程者提供了極大的方便的同時,也造成了非常多的隱患,可以說,C程序的運行中許多莫名其妙的錯誤都和內(nèi)存泄露有關(guān).程序可能連續(xù)運行幾個小時沒有任何問題,但突然就發(fā)生錯誤,對于一個比較復(fù)雜的程序,追蹤內(nèi)存泄露非常困難,經(jīng)常要借用第三方的專門的內(nèi)存分析工具.

C的內(nèi)存錯誤最多的是兩種情況:

本文引用地址:http://m.butianyuan.cn/article/201701/337246.htm

1.數(shù)組越界:

int Array[10];//系統(tǒng)自動分配10*4BYTE的空間

for(int i=0;i<100;i++) Array[i]=i; //寫入前10個元素時沒有問題,超過10個,C會繼續(xù)向連續(xù)的內(nèi)存空間寫數(shù)據(jù)

如果該內(nèi)存空間無用,沒有問題.如果這段內(nèi)存空間被系統(tǒng)或者其它應(yīng)用程序占用,錯誤的寫入可能會導(dǎo)致系統(tǒng)崩潰,經(jīng)常提示的是發(fā)生意外錯誤,比較新的操作系統(tǒng)一般不會崩潰,會提示內(nèi)存寫錯誤,應(yīng)用程序退出.

2.分配內(nèi)存沒有釋放(內(nèi)存泄露)

int *p;//定義整型指針

p=(int *)malloc(100*sizeof(int)); //申請100*4個字節(jié)的內(nèi)存

if(p==NULL) //系統(tǒng)無法分配,退出程序

{

return (errro);

}

free(p); //釋放申請的內(nèi)存空間 如果沒有這個語句,重復(fù)調(diào)用這段程序,導(dǎo)致占用的內(nèi)存空間越來越多.


labview則完全不同,它的內(nèi)存分配是由LV的內(nèi)存管理器自動完成的,因此不存在用戶內(nèi)存釋放的問題,也不存在數(shù)組越界的問題,既然如此,討論LV的內(nèi)存管理有意義嗎?

答案是:非常重要.經(jīng)常有人抱怨,LV的運行速度緩慢,性能很差,這里主要的原因都是內(nèi)存使用不當?shù)脑?


LV隨時都在不斷地進行內(nèi)存分配,再分配和釋放的工作,只不過這些工作是由LV內(nèi)存管理器自動進行的,對用戶來說是在后臺進行的,是不受用戶控制的.同時,內(nèi)存管理器的工作是非常繁重和緩慢的,它的大量無意義的工作將會導(dǎo)致程序運行效率的急劇下降.

改進LV內(nèi)存使用的最好辦法是良好的編程風格.


一個VI占用的內(nèi)存空間分成四個部分.

1.PANEL                   前面板

2.BLOCK?。模桑粒牵遥粒汀         〕绦蚩驁D

3.CODE SPACE              代碼空間

4.DATA?。樱校粒茫拧             ?shù)據(jù)空間


代碼空間指的是框圖編譯后形成的機器碼所占的空間.

數(shù)據(jù)空間包括前面板控制器和指示器的值和默認值,常量和動態(tài)定義的數(shù)據(jù).

當打開一個VI的時候,面板空間,代碼空間和數(shù)據(jù)空間載入內(nèi)存,該VI的子VI的代碼空間和數(shù)據(jù)空間載入內(nèi)存.

如果選擇顯示程序框圖,則程序框圖空間也載入內(nèi)存.


可以看出,當打開一個VI時,LV只載入需要的部分,自VI只載入代碼空間和數(shù)據(jù)空間.所以不必要考慮子VI的前面板和程序框圖.如上圖,如果把主VI的部分分成多個SUBVI,可以有效地節(jié)約內(nèi)存的使用.因為SUBVI一方面不再需要前面板和程序框圖,只有代碼空間和數(shù)據(jù)空間載入內(nèi)存,并且在需要的時候,LV可以收回數(shù)據(jù)空間內(nèi)存并重新利用.當我們打開一個非常大的,包含很少SUBVI的程序,速度會非常緩慢,相反,一個很大的包含很多的SUBVI的程序打開速度非??欤褪沁@個原因.


當我們編寫VI的時候經(jīng)常要查看它的內(nèi)存使用情況,有幾種方法:

一.通過ABOUT對話框,可以查到操作系統(tǒng)為LV分配的全部內(nèi)存.全部內(nèi)存包括打開的VI占用的和LV本身占用的.在打開LV之后,記錄下這個值(LV本身占用的),然后編輯你的VI,再查看ABOUT對話框,他們的差就是你的VI占用的內(nèi)存,這個方法可以大概估計您的VI的內(nèi)存使用情況


二:通過FILE菜單中的show vi property(CTRL+I)來查看當前VI的內(nèi)存使用情況.



三.通過Profile Window 來查看.



總結(jié)以上內(nèi)容,得出幾個要點:

.因為LV控制內(nèi)存管理,因此很難知道LV的內(nèi)存是如何分配的.

.良好的編程風格會改進LV的內(nèi)存使用情況.

.VI的內(nèi)存使用分成PANEL,BLOCK,CODE,DATA四部分.


下面的部分詳細分析這四部分的內(nèi)存是如何使用的.

首先看看PANEL和BLOCK,這兩個部分是占用內(nèi)存的主要部分.

前面板主要是由控制器(control)和指示器(indicator)組成的,每個控制器和指示器都有自己的數(shù)據(jù)拷貝,在編輯的情況下我們可以隨意更改控制器和指示器的值,即使他們通過數(shù)據(jù)流連在一起,只要不運行,指示器沒有新的數(shù)據(jù)流到來,它始終保持原來的值.控制器和指示器的數(shù)據(jù)拷貝稱作操作數(shù)據(jù),因為只用通過具體操作才能改變它的值,框圖的中的數(shù)據(jù)(數(shù)據(jù)流)稱作執(zhí)行數(shù)據(jù),因為只有VI運行時候才起作用.可以理解成連線上的數(shù)據(jù).


上一頁 1 2 下一頁

評論


技術(shù)專區(qū)

關(guān)閉