labview深入探索-----內(nèi)存管理和緩存重用
C的內(nèi)存錯誤最多的是兩種情況:
本文引用地址:http://m.butianyuan.cn/article/201701/337246.htm1.數(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ù).
評論