<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/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)或者其它應用程序占用,錯誤的寫入可能會導致系統(tǒng)崩潰,經(jīng)常提示的是發(fā)生意外錯誤,比較新的操作系統(tǒng)一般不會崩潰,會提示內(nèi)存寫錯誤,應用程序退出.

          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)存空間 如果沒有這個語句,重復調(dià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)存管理器的工作是非常繁重和緩慢的,它的大量無意義的工作將會導致程序運行效率的急劇下降.

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


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

          1.PANEL                   前面板

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

          3.CODE?。樱校粒茫拧             〈a空間

          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 下一頁

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();