国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Symbian內(nèi)存管理

在Symbain OS中內(nèi)存管理的主要任務(wù)是:如何為程序分配內(nèi)存以及如何在程序的內(nèi)部分配內(nèi)存。

  Symbian OS 程序最根本和基礎(chǔ)的東西就是內(nèi)存,作為一個有限的資源,必須小心細(xì)致地處理,特別是當(dāng)有錯誤或異常發(fā)生的時候。正是由于這樣的原因,在支持清理機(jī)制的API中,異常處理和內(nèi)存管理幾乎是綁在一起的。

  Uikon核心框架使用這些支持清理機(jī)制的API來管理內(nèi)存,使GUI程序的基礎(chǔ)架構(gòu)具有良好的性能和表現(xiàn)。GUI程序還支持異常情況下內(nèi)存清理,以及調(diào)試模式下的內(nèi)存泄露檢測。

  一、Symbian OS的清理機(jī)制(cleanup)
  
  清理機(jī)制是Symbain OS 程序?qū)τ诔绦虍惓L幚淼囊环N特有方式。當(dāng)異常發(fā)生時,清理機(jī)制將清理錯誤的內(nèi)存區(qū)域。Symbian OS的清理策略和它所有類的基類CBase類有著密切關(guān)系。要了解Symbian OS清理機(jī)制就必須清楚以下三個概念:異常處理(exception handling)、清理棧(cleanup stack)以及通用清理項(general cleanup item)。

  1、異常處理 (Exception Handling)

  Symbian OS沒有使用C++的try…catch異常處理方式,而是使用了它自己所特有的方式:leave。在Symbian OS中,異常以 leave 的形式出現(xiàn),trap harness可以在程序中設(shè)置一個點,使程序發(fā)生leave時回跳到這個點上,宏TRAP和TRAPD 可以在程序中設(shè)置這個點。調(diào)用系統(tǒng)API User 類的一些靜態(tài)函數(shù)可以觸發(fā)Leave ,例如 User::Leave()方法,這就相當(dāng)于主動地拋出異常,當(dāng)然某些系統(tǒng)函數(shù)或是用戶代碼,也有可能發(fā)生leave。

  2、清理棧(Cleanup Stack)

  當(dāng) leave 發(fā)生時,任何分配了資源的heap內(nèi)存,例如通過new()方法創(chuàng)建的對象,他們將被孤立,因為leave一旦發(fā)生已指向他們的指針就不存在了,這樣就導(dǎo)致了內(nèi)存泄漏。為了防止內(nèi)存泄漏發(fā)生,程序就有要記錄那些已經(jīng)被創(chuàng)建的對象,如果程序運行發(fā)生leave,那么系統(tǒng)可以自動找到并清理他們所占用的內(nèi)存。這些工作可以通過清理棧來完成。CleanupStack類是支持清理棧的一個類。GUI應(yīng)用程序擁有一個由應(yīng)用程序框架所提供的清理棧,其他的應(yīng)用程序必須用CTrapCleanup 類自己構(gòu)建一個清理棧。

  3、通用清理項(General Cleanup Item)

  在默認(rèn)情況下,清理棧只處理那些 CBase-based 類(也就是它所處理的類必須是由 CBase類繼承下來的)和那些untyped 類型對象(用一個簡單的內(nèi)存釋放語句就可以釋放的對象)。通用清理項(General Cleanup Item)使其他類型的對象也可以放到清理棧中。TCleanupItem類是支持通用清理項的一個類。

  二、Symbian OS的內(nèi)存分配

  內(nèi)存分配管理的目的在于 能夠使Symbian OS 進(jìn)程通過底層函數(shù)訪問和操縱內(nèi)存區(qū)域。絕大多數(shù)的客戶端程序不需要直接使用這些函數(shù),那些在進(jìn)程間共享內(nèi)存區(qū)域以及在一個進(jìn)程的線程間共享內(nèi)存區(qū)域的程序會使用這些底層函數(shù)來管理內(nèi)存。這里有兩個概念需要了解 chunk(塊) 和 heap(堆)。

  1、Chunk(塊)

  chunk 是一組線性相鄰的內(nèi)存地址在RAM 中的映射。進(jìn)程創(chuàng)建以后,它的地址空間包括1到3個chunk:

  (1)stack/heap chunk:這里包括了進(jìn)程的主線程所要使用的stack 和 heap。所以這個chunk 通常是進(jìn)程所必須的。
 ?。?)code chunk:這個chunk 只有當(dāng)進(jìn)程被加載到RAM時才出現(xiàn)。
 ?。?)data chunk:只有當(dāng)進(jìn)程擁有靜態(tài)數(shù)據(jù)的時候才會有這個chunk。

  當(dāng)然,程序可以還創(chuàng)建額外的chunk。 一個全局的chunk可以被其他進(jìn)程訪問,這樣就實現(xiàn)了大量內(nèi)存的共享。RChunk 類提供了對chunk的支持。TFindChunk 類可以用來查找其他進(jìn)程創(chuàng)建的全局chunk。

  2、Heap(堆)

  heap 通常用于顯式的動態(tài)內(nèi)存分配 。Symbian OS定義了C++中new操作符創(chuàng)建對象到當(dāng)前線程的heap中。Heap的功能可以是:
  •監(jiān)控內(nèi)存泄漏:對于一個GUI程序來說,這個是經(jīng)常發(fā)生的。
  •在同一進(jìn)程的線程間進(jìn)行共享。
  •在單元一級上進(jìn)行訪問和操作。
  RHeap類提供了對heap的支持。如果heap 是當(dāng)前線程的 heap,那么使用等價系統(tǒng)靜態(tài)方法API 的User 類 將更加方便。這些系統(tǒng)靜態(tài)方法API 同樣也提供了宏來管理內(nèi)存,以防止內(nèi)存泄漏。

  三、進(jìn)程和地址空間

  Symbian OS 的程序可以包含若干進(jìn)程,每個進(jìn)程包含若干在概念上并發(fā)執(zhí)行的線程。每一個用戶進(jìn)程都有他自己私有的地址空間。一個用戶進(jìn)程不可以直接訪問另外一個用戶進(jìn)程的地址空間。進(jìn)程包括若干線程,他們運行在進(jìn)程的特權(quán)級。

  Kernel 進(jìn)程是一個比較特殊的進(jìn)程,它的線程運行在超級訪問者級別,這個進(jìn)程通常包括兩個線程。

  Kernel server 線程:是一個原始的進(jìn)程,在系統(tǒng)啟動時就已經(jīng)存在。它可以在heap執(zhí)行核心函數(shù)請求的內(nèi)存分配或重新分配。

  null 線程:當(dāng)系統(tǒng)中沒有其他可運行的線程時這個線程就開始運行,null 線程使處理器處于空閑狀態(tài),減少耗電

  線程的地址空間包括若干chunk,在剛創(chuàng)建的時候,進(jìn)程只有一個線程和1到3個chunk。如果進(jìn)程創(chuàng)建了新的線程,那么一個新的chunk將被創(chuàng)建被分配給這個線程。每一個chunk都包括一個了stack,如果線程沒有共享當(dāng)前heap,那么在chunk中也將包括heap。

  四、Chunks(塊)


  Chunk 把RAM映射到一個連續(xù)的虛擬地址。一個chunk中包括了一個保留區(qū)(reserved region)和和委托區(qū)(committed region)。保留區(qū)是一個連續(xù)的虛地址區(qū)域,它的大小可能是整個chunk的大小。在委托區(qū)中存放了真正映射到RAM的地址。chunk的大小是可以被動態(tài)修改的,允許委托區(qū)也可以修改大小,他的范圍是從0一直到保留區(qū)大小,是處理器頁面大小的整數(shù)倍。這樣,就允許進(jìn)程獲得更多的內(nèi)存空間。通常,委托區(qū)起始地址位于保留區(qū)底部。另外還可以創(chuàng)建 double-ended chunk ,那么委托區(qū)將是保留區(qū)的任意連續(xù)子集,他的大小也是處理器頁面大小的整數(shù)倍,這種Chunk的委托區(qū)可以有兩個頂端和底端,并且它們的大小也是可變的。
在chunk創(chuàng)建時可以指定chunk的最大空間,保留區(qū)大小應(yīng)該小于這個最大值。.盡管這樣,如果保留區(qū)請求比當(dāng)前chunk更大的空間,那么chunk可以被重新分配空間,以允許保留區(qū)擴(kuò)大。保留區(qū)可以擴(kuò)大到撐滿整個chunk.。

  Local chunks(本地 chunk)

  如果一個chunk對于創(chuàng)建它的進(jìn)程是私有的,不允許被其他用戶進(jìn)程訪問,那么那么這個chunk就是本地chunk,本地chunk是沒有名字的。

  Global chunks(全局chunk)

  如果一個chunk可以被其他進(jìn)程訪問,那么這個chunk就是全局chunk。全局chunk是有名字的,這樣,進(jìn)程可以根據(jù)chunk的名字來訪問他們。當(dāng)進(jìn)程打開一個全局chunk的時候,他把chunk映射到自己的地址空間,這樣就可以對chunk進(jìn)行直接訪問和數(shù)據(jù)共享了。如果已經(jīng)知道了 chunk的名稱,那么使用 RChunk::OpenGlobal() 可以直接打開chunk.。如果只知道了chunk的部分名字,那么可以使用帶 TFindChunk 型參數(shù)的 RChunk::Open()方法來打開chunk.。

  五、Heaps(堆)

  Each thread has a chunk which contains that thread’s program stack. For the main thread of a process, this chunk also contains the thread’s heap. A program’s request for memory is allocated from this heap. For example, a code fragment such as:

  每一個線程都有一個包含了自身程序棧(program stack)的chunk。.對于進(jìn)程的主線程來說,這個chunk中同樣也包含了線程heap。程序?qū)τ趦?nèi)存的請求都是從這個heap的地址空間來分配的,例如有以下代碼:

  CArrayFixFlat<...>* fixflat;
  ...
  fixflat = new (ELeave) CArrayFixFlat<...>(3);

  程序請求了heap中部分的內(nèi)存地址,并把地址返回給調(diào)用者。請求heap中的內(nèi)存必須是顯式的,同樣,釋放這些內(nèi)存時也必須進(jìn)行顯式調(diào)用。

  Structure of a heap(heap 結(jié)構(gòu))

  heap包括兩個單元列表。一個是已經(jīng)分配的內(nèi)存單元列表,一個是還未分配的內(nèi)存單元列表。兩個列表都在heap對象上。內(nèi)存單元由單元頭和單元體組成,單元體實際上就是一個內(nèi)存區(qū)。單元頭是在e32std.h 中定義的 RHeap::SCell 結(jié)構(gòu)體,他是RHeap類的一部分。

  如何共享heap

  heap通常被同一個進(jìn)程的線程所共享當(dāng)一個線程創(chuàng)建時:
  •它可以和父線程使用同一個heap。
  •父線程同時為新線程創(chuàng)建一個新的heap。
  •新線程使用系統(tǒng)為它創(chuàng)建的heap。
  這里,只有第一和第二中情況可以認(rèn)為是heap的共享。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C語言面試題大匯總之微軟亞洲技術(shù)中心面試題
Dalvik虛擬機(jī)簡要介紹和學(xué)習(xí)計劃
「計算機(jī)基礎(chǔ)」操作系統(tǒng)的認(rèn)識
虛存管理與任務(wù)調(diào)度 | 兮軟
RTOS中的任務(wù)是線程、進(jìn)程、還是協(xié)程?
QNX簡介
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服