日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内存管理相关【内存布局内存管理方案】

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存管理相关【内存布局内存管理方案】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

iOS系統下的內存布局

最上面是內核區,最下面是保留區,中間是給程序加載的空間。

從高地址到低地址依次為內核區、棧、堆、靜態全局區(未初始化區域.bss和已初始化區域.data)、代碼區、保留區;

程序被加載到內存分成三段未初始化數據(.bss)、已初始化數據(.data)和代碼段(.text)。

代碼段顧名思義存放代碼;

已初始化區域:已經初始化聲明的靜態變量和全局變量;

未初始化區域:未初始化的靜態變量和全局變量;

堆heap:創建的對象或被copy的block;

棧stack:定義的方法或者函數都存放在棧上,由高地址向低地址,向下擴展

內存管理方案
ios管理系統針對不同的場景提供不同的內存管理方案。

·TaggedPointer:對一些小對象使用,如NSNumber

·NONPOINTER_ISA:非指針型的ISA;應用于64位架構下的iOS應用程序。在64位架構下,isa指針占64個比特位,實際上有32位或者40位就夠用了,剩余的比特位就浪費了。為了不讓內存浪費更好的管理內存,剩余的32位蘋果用來存儲和內存管理相關的內容。

·散列表:是一個復雜的數據結構,其中包含了引用計數表和弱引用表。

【詳解NONPOINTER_ISA】

在64位架構下:

第0位叫indexed的標志位,如果是0,代表它是一個isa指針,表示當前對象的類對象的地址;如果是1,代表它不僅是一個isa指針,當前對象的類對象的地址,還存儲內存管理相關的內容。

第一位has_assoc表示當前對象是否有關聯對象,0表示沒有,1表示有。

第二位has_cxx_dtor代表當前對象是否有c++代碼

第三位 3···31、32···35到第35位共33位,表示當前對象的類對象的內存地址。

第36···41位共6位,是magic 字段。

第42位weakly_referenced表示是否含有弱引用指針。

第43位deallocating表示當前指針是否正在進行dealloc操作。

第44位has_sidetable_rc表示當前isa指針的引用計數是否達到上限,如果達到上限需要外掛一個sidetable,來額外存儲相關的引用計數內容。

第45···63位extra_rc表示額外的引用計數,儲存內存管理相關的,當引用計數很小的時候,就直接存在isa指針當中。

如下圖: ?

【詳解sidetable】

散列表是通過SideTables()結構來實現的,sidetables下面掛了很多sidetable,在不同的架構下是有不同個數的,比如說在非嵌入式系統中sidetable有64個。

sideTables()實際上是一個哈希表(hash),可以通過它的對象指針,找到它對應的引用計數表或者弱引用表具體在哪個sidetable中。

sidetable有自旋鎖(spinlock_t),引用計數表(refcountMap)和弱引用表(weak_table_t)。

sideTable結構:

自旋鎖:是忙等的鎖。如果鎖已經被其他線程獲取,那么當前線程會自己去不斷的獲取是否被釋放,直到其他線程釋放。適用于輕量訪問。如+1,-1。

引用計數表:是hash表,其實就是hash查找,插入和查找通過同一個hash函數,避免了循環遍歷,提高了查找效率。

size_t實際上是一個無符號long型(unsign long)的變量。在獲取對象的真實的引用計數值時,需要向右偏移兩位。

弱引用表:weak_table_t也是一個hash表。

思考如下問題:

為什么不是一個sidetable?而是有多個sidetable組成一個sideTables;或者說sidetables為什么是多張表,而不是一張表?

解析:

假設只有一張sidetable表,那么內存中的所有對象的引用計數或者弱引用都存儲在這張表中,這個時候,如果我們要對某一個對象的引用計數值進行操作,+1或者-1;由于不同的對象在不同的線程中,不同的線程操作同一張表,就有資源訪問的問題,那么我們要對這張大表進行加鎖操作來保證數據訪問的安全性。在這個過程中就會產生一個效率問題,比如,成千上萬的對象進行引用計數操作,那么需要加鎖排隊,就會有效率問題。比如,現在已經有一個對象在操作這個大表,那么下個對象就要等前對象操作結束,把鎖釋放之后,它才能操作這張表。系統為了解決這種效率問題,引入了分離鎖。分離鎖就是把一個大表分成幾個小表,A、B分別在不同表中,同時進行操作的話,可以并發進行,這樣就提高了訪問效率。

思考如下問題:

怎樣實現快速分流?找到當前對象在哪張表中?【快速分流指給出一個對象的指針,如何快速的定位到這個這個對象在哪張表中】

解析:

sidetables本質是一張Hash表。

什么是Hash表?有一個指針對象key,通過hash函數的運算,得到一個值value,找到對應的sidetable。

思考如下問題:

你是否使用過自旋鎖,自旋鎖和普通鎖有什么區別?適用于哪些場景?

解析:

自旋鎖是忙等的鎖,適用于輕量訪問。

思考如下問題:

引用計數表示通過什么實現的?為什么引用計數表要用hash表來實現呢?

解析:

是通過hash表實現的。插入和查找都通過同一個hash函數,避免了循環遍歷,提高了查找效率。

關于內存管理的討論全部基于objc-runtime-680版本講解。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的内存管理相关【内存布局内存管理方案】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。