最直觀的垃圾收集策略是引用計數。引用計數很簡單,但是需要編譯器的重要配合,并且增加了賦值函數 (mutator) 的開銷(這個術語是針對用戶程序的,是從垃圾收集器的角度來看的)。每一個對象都有一個關聯的引用計數 —— 對該對象的活躍引用的數量。如果對象的引用計數是零,那么它就是垃圾(用戶程序不可到達它),并可以回收。每次修改指針引用時(比如通過賦值語句),或者當引用超出范圍時,編譯器必須生成代碼以更新引用的對象的引用計數。如果對象的引用計數變為零,那么運行時就可以立即收回這個塊(并且減少被回收的塊所引用的所有塊的引用計數),或者將它放到遲延收集隊列中。
com組件將維護一個稱作是引用計數的數值。當客戶從組件取得一個接口時,此引用計數值將增1。當客戶使用完某個接口后,組件的引用計數值將減1.當引用計數值為0時,組件即可將自己從內存中刪除。
為什么要選擇為每一個接口單獨維護一個引用計數而不是針對整個組件維護引用計數呢?
主要有兩個原因:一是使程序調試更為方便;另外一個原因是支持資源的按需獲取。
1程序調試:
假設在程序中忘記對某個接口調用Release(其實很多人會犯這個錯)。這樣組件將永遠不會被刪除掉,因為只是在引用計數值0時delete才會被調用 。這時就需要找出接口在何時何處應該被釋放掉。當然找起來是相當困難的。在只對整個組件維護一個接口的情況下,進行這種 查找更為因難了。此時必須檢查使用了此組件所提供的所有接口的代碼。但若組件支持對每個接口分別維護一個引用計數那么可以把查找的范圍限制在某個特定的接口上。在某些情況下這可以節省大量時間。
2.資源的按需獲取
在實現某個接口時可能需要大量的內存或其他資源。對于此種情況,可以在QueryInterface的實現中,在客戶請求此接口時完成資源的分配。但若只對整個組件維護一個引用計數,組件將無法決定何時可以安全地將此些接口相關聯的內存釋放。但基對每個接口分別維護一個引用計數,那么決定何時可以將此內存釋放將會容易得多。
正確使用引用計數三條簡單的規則
1. 在返回之前調用AddRef。對于那些建好些返回接口指針的函數,在返回之前應該相應的指針調用AddRef。這些函數包括QueryInterface 及CreateInstance。這樣當客戶從這種 函數得到一個接口后。它將無需調用AddRef.
2.使用完接口之后調用Release。在使用某個接口之后應該調用些接口的Release函數。
3.在賦值之后調用AddRef. 在將一個接口指針賦給另一個接口指針時,應調用AddRef。換句話說,在建立接口的別外一個引用之后應增加相應組件的引用計數。
在客戶看來,引用計數是處于接口級的而不是組件級的。但從實現的角度來看,誰的引用計數被記錄下來實際上沒有關系。客戶可以一直接相信組件將記錄每個接口本身維護引用計數值。但客戶不能假設整個組件維護單個的引用計數。
對于客戶而言,每一個接口被分別維護一個引用計數意味著客戶應該對它將要使用的指針調用AddRef,而不是其他的什么指針。對于使用完了指針客戶應該調用其Release。
選擇為每一個接口單獨維護一個引用計數而不是針對整個組件維護引用計數的原因:
使程序調試更為方便;支持資源的按需獲取;
可以通過增大和減少某個數的值而實現之。
另外要注意的是AddRef和Release的返回值沒有什么意義,只是在程序調試中才可能會用得上.客戶不應將此從此值當成是組件或其接口的精確引用數。
客戶必須對每一個接口具有一個單獨的引用計數值那樣來處理各接口。因此,客戶必須對不同的接口分別進行引用計數,即使它們的生命期是嵌套的。
一、輸出參數規則
輸出參數指的是給函數的調用者傳回一個值的函數參數。從這一點上講,輸出參數的作用同函數的返回值是類似的。任何在輸出參數中或作為返回值返回一個新的接口指針的函數必須對些接口指針調用AddRer。
二、輸入參數規則
對傳入函數的接口指針,無需調用AddRef和Release,這是因為函數的生命期嵌套在調用者的生命期內。
三、輸入-輸出參數規則
輸入-輸出參數同時具有輸入參數及輸出參數的功能。在函數休中可以使用輸入-輸出參數的值,然后可以對這些值進行修改并將其返回給調用者。
在函數中,對于用輸入-輸出參數傳遞進來的接口指針,必須在給它賦另外一個接口指針值之前調用其Release。在函數返回之前,還必須對輸出參數中所保存的接口指針調用AddRef。
四、局部變量規則
對于局部自制的接口指針,由于它們只是在函數的生命其內才存在,因此無需調用AddRef和Release。這條規則實際是輸入參數規則的直接結果。在下面的例子中,pIX2只是在函數foo的生命期內都在,因此可以保證其生命期將嵌套在所傳入的pIX指針的生命期,因此無需對pIX2調用AddRef和Release。
五、全局變量規則
對于保存在全局變量中的接口指針,在將其傳遞給另外一個函數之前,必須調用其AddRef。由于此變量是全局性的,因此任何函數都可以通過調用其Release來終止其生命期。對于保存在成員變量中的接口指針,也應按此種方式進行處理。因為類中的任何成員函數都可以改變此種接口指針的狀態。
六、不能確定時的規則
對于任何不定的情形,都應調用AddRef和Release對。
另外,在決定要進行優化時,應給那些沒有進行引用計數的指針加上相應的注釋,否則其它程序員在修改代碼時,將可能會增大接口指針的生命期,從而合引用計數的優化遭到破壞。
忘記調用Release造成的錯誤可能比不調用AddRef造成的錯誤更難檢測。
與跟蹤式垃圾回收相比,引用計數的主要優點是可以盡快地回收不再被使用的對象,同時在回收過程中不會導致長時間的停頓,還可以清晰地標明每一個對象的生存周期。
在實時應用或內存受限的系統中,實時響應能力是一項重要指標,而引用計數作為最容易實現的垃圾回收技術之一,很適合于這種情況。引用計數還可以用于管理其他非內存資源,如操作系統對象(經常比內存資源更稀缺)。跟蹤式垃圾回收技術用終結器處理此類目標,但延遲回收可能引發其他問題。加權引用計數是適用于分布式系統的派生技術。
在可用內存被活躍對象填滿的平臺上,跟蹤式垃圾回收會被頻繁觸發,從而降低性能。而引用計數即便在內存瀕臨耗盡的情況下性能依然有所保障。引用計數還能為其他運行時優化技術提供參考信息,例如對于許多使用不可變對象的系統來說(如函數式編程語言),大量復制對象導致的性能懲罰有時十分嚴重;在此類系統上一個典型的優化措施是:假如一個對象被創建以后僅使用了一次,且在其不再被引用的同時另一個類似的對象被創建出來(如Javascript中的字符串拼接賦值操作),可以將刪除原對象創建新對象的行為變為修改原對象,從而提高效率。引用計數可以為這類優化提供充分的參考信息。
未經優化的引用計數相比跟蹤式垃圾回收有兩個主要缺點,都需要引入附加機制予以修復:
頻繁更新引用計數會降低運行效率。
原始的引用計數無法解決循環引用問題。
另外,如果使用空閑列表分配內存,那么引用計數的空間局域性非常差。僅使用引用計數無法通過移動對象來提高CPU緩存的性能,所以高性能的內存分配器都會同時實現一個跟蹤式垃圾回收器以提高性能。許多引用計數實現(比如PHP和Objective-C)的性能不佳都是因為沒有實現內存拷貝。
先稱一個產品的個數重量,然后再輸入取樣產品的重量,再放上其他的產品,再按點數功能鍵。就可稱出其他產品的個數
這個很簡單,只要接成計數器,然后有四個輸出,第一個輸出的是2分頻,第二個輸出時四分頻往后推,然后再接以個數據選擇器,選擇你要的分頻數
提議點分解試試看
格式:pdf
大小:467KB
頁數: 6頁
評分: 4.7
1 電梯常用計算簡介 1曳引電動機客容量校核: )( 102 vK)(1Q kWN 式中: N—電動機功率( kW); K—電梯平衡系數; Q—額定載重量( kg); V—額定速度( m/s);. η—機械傳動總效率; (教材(3-6)的 V 應該為曳引輪節經線速度,或把公式中的 i 去掉,否則計算會出錯) 根據功率的定義和換算關系, 102kgf.m/ s= 1kW 102 101.972 1000kgf/g n (重力加速度 ) 102 vK)(1Q 電梯滿載上升工作時理論功率 電機的功率應折算電梯機械傳動總效率η,對蝸輪蝸桿曳引機電梯η =0.5-0.65, 對無齒輪曳引機電梯η =0.8-0.85, 102 vK)(1Q 電機的功率 例 設電梯額定載重量 Q=2000kg,額定速度 v=0.5m/s,鋼絲繩曳引比 i=2,平衡系數 k=0.5,曳引輪直徑 D=640mm
格式:pdf
大小:467KB
頁數: 4頁
評分: 4.5
介紹玻璃纖維濾紙的發展情況和歐洲標準EN1822所推薦的高效濾紙過濾性能測試系統,通過理論推導與實驗對比,分析此測試系統中光學粒子計數器的重疊損失和系統中測試氣溶膠濃度波動引起的測量誤差。結果表明,當高效濾紙效率測試系統選用2臺計數器時,測試結果受氣溶膠濃度波動影響很小,僅取決于計數器自身的重疊誤差;當選用1臺計數器分別上、下游采樣時,存在著由于氣溶膠粒子濃度波動所造成的測試誤差,可通過減少氣溶膠發塵器發塵濃度的波動來有效地減小這種誤差。
μC/TCP-IP在運行過程中維護著一組計數器,用于追蹤網絡協議棧的各種錯誤態。如果需要的話,應用程序可以通過檢查錯誤計數器來調試運行當中的問題,包括內存剩余空間較低、性能差或數據包丟失等等。
網絡協議的錯誤計數器被放在一個命名為Net_ ErrCtrs的結構體變量中,可以利用調試器或應用程序(以外部變量的形式引用)在運行時檢測該變量。
要使能這些錯誤統計,必須將net_cfg.h中的 NET_CTR_CFG_ERR_EN配置為DEF_ENABLED。
具有記憶輸入脈沖個數作用的邏輯部件,稱之為計數器。計數器的種類很多,按進位制可分為二進制、十進制、五進制、七進制等計數器;按計數器中觸發器翻轉的次序可分為異步式和同步式兩種;按計數過程中數字的增、減可分為加法、減法、加減可逆計數器等。
在數字系統中,對脈沖的個數進行計數、以實現數字測量、運算和控制的數字部件,稱為計數器。
計數器主要由觸發器構成。若按觸發器的翻轉的次序來分類,可以把計數器分為同步式和異步式。在同步計數器中,當計數脈沖輸入時所有觸發器是同時翻轉的;而在異步計數器中,各級觸發器則不是同時翻轉的。若按計數過程中計數器中數字的增減來分類,可以分為加法計數器,減法計數器和可逆計數器(亦稱加減計數器)。加法計數器是隨著計數脈沖的不斷輸入而遞增計數的;減法計數器是隨著計數脈沖的不斷輸入而遞減計數的;可增可減的稱可逆計數器 。
計數器是一種邏輯元件,在一事件發出時,可使所存儲數據增加“1”或一個常數。從某種意義上說,計數器也是一個寄存器,它能“記住”送到其輸入端的脈沖數目。計數器對計算機來說是很重要的,例如在控制器中要對程序中的指令地址進行計數,以便在執行完一條指令后,按新的地址轉入下一條指令。計數器由一定數量的觸發器和門電路組成,現在一般都采用集成電路 。
1、如果按照計數器中的觸發器是否同時翻轉分類,可將計數器分為同步計數器和異步計數器兩種。
2、如果按照計數過程中數字增減分類,又可將計數器分為加法計數器、減法計數器和可逆計數器,隨時鐘信號不斷增加的為加法計數器,不斷減少的為減法計數器,可增可減的叫做可逆計數器。