iOS 運存機制

很多使用iphone的孩紙,可能并不了解iphone的內(nèi)存使用分配原理。今天轉(zhuǎn)載一篇網(wǎng)友的文章,來掃盲一下。

標(biāo)注來源:http://tieba.baidu.com/p/2667751512

引援文章通篇都是比較淺顯文字在說明,所以這里也依然用最白話的方式來解釋一下iOS內(nèi)存機制。

1.為什么iOS的RAM一直都是最少的但iOS卻又是最最流暢的?

先明白一個基本概念,iOS和Mac OS都是基于UNIX開發(fā)的系統(tǒng),這和windows有著很大的不同,包括內(nèi)存機制,這便是為何不能拿windows的使用習(xí)慣來看待iOS。另外要注意,iOS沒有系統(tǒng)緩存。

首先看看內(nèi)存的意義何在,內(nèi)存的介質(zhì)就是高速閃存,它比外存的速度要快不少。通過將程序加載到內(nèi)存后讓處理器在一個更快的讀寫環(huán)境下處理數(shù)據(jù),從而提升系統(tǒng)性能。還要先明白的是內(nèi)存僅是讓軟件流暢運行的條件之一,處理器才是決定性因素。內(nèi)存就好比瓶子的容量,處理器就是瓶頸,瓶子里裝再多水瓶口不夠大那水流的依舊很慢。

在iOS中,撇開聯(lián)動內(nèi)存和可用內(nèi)存不講,所有在內(nèi)存里的程序都是被標(biāo)記為活躍內(nèi)存或者非活躍內(nèi)存的。活躍內(nèi)存可以先簡單理解為正在前臺運行的軟件以及剛退出不久的軟件所占用的內(nèi)存,這些數(shù)據(jù)是當(dāng)前最活躍的(讀寫頻率最高的)。而非活躍內(nèi)存即是系統(tǒng)記錄的你經(jīng)常使用的軟件所占用的內(nèi)存,當(dāng)前處理器并沒有讀取它們,但它們?nèi)匀槐环旁趦?nèi)存里處于“待命”狀態(tài),方便你下一次使用這些軟件時處理器能直接從內(nèi)存讀取數(shù)據(jù),而不必花費更多時間先從外存調(diào)到內(nèi)存再讀取。

重點在這,當(dāng)iOS檢測到你當(dāng)前運行的軟件需要更多活躍內(nèi)存時(實際上軟件向處理器請求更多內(nèi)存),系統(tǒng)會選擇性地釋放掉后臺軟件占用的非活躍內(nèi)存,轉(zhuǎn)而提供給當(dāng)前軟件。如何釋放是根據(jù)你的使用習(xí)慣來定,比如你經(jīng)常用QQ,其次是微信。那么當(dāng)前臺內(nèi)存不足時系統(tǒng)會優(yōu)先釋放掉微信占用的內(nèi)存,若還不夠則繼續(xù)釋放QQ所占用的內(nèi)存。可以假設(shè),如果有個軟件占用的內(nèi)存大到要占滿整個RAM,那么系統(tǒng)則會釋放掉所有非活躍內(nèi)存全部提供給這個軟件使用。這便是為何你不用擔(dān)心玩游戲什么的會因為內(nèi)存不足而卡頓了,因為只要這個游戲有需要,就算是需要所有內(nèi)存系統(tǒng)都會馬上提供給你,不過你若不玩這游戲了那這些內(nèi)存又會馬上提供給其他程序。

這種內(nèi)存釋放機制是有“預(yù)見性”的,并非只在內(nèi)存不足時臨時釋放。iOS會根據(jù)你的使用習(xí)慣等數(shù)據(jù)來分析,在你打開一個軟件時立即準(zhǔn)備足夠內(nèi)存供其使用,若該軟件運行時又需要更多內(nèi)存才會臨時釋放更多。iOS7甚至能根據(jù)你的使用習(xí)慣來預(yù)先加載常用軟件,所以iOS用的時間越長就越順手(當(dāng)然,記錄用戶使用習(xí)慣這種特性并不是只有蘋果才有)。而且iOS的內(nèi)存管理十分嚴(yán)格,任何第三方App都沒有權(quán)限直接調(diào)用設(shè)備上的硬件,也就是說內(nèi)存分配與釋放都是處理器說了算,任何第三方軟件都沒有權(quán)限去占用固定內(nèi)存(除非越獄),不會出現(xiàn)例外。自然就不會像windows里一些不規(guī)范軟件那樣,程序已經(jīng)關(guān)閉連但內(nèi)存還一直占著。

這便是區(qū)別所在,iOS里所有第三方程序都不可能一直占用內(nèi)存,一旦系統(tǒng)需要更多的活躍內(nèi)存,就會強制釋放后臺非活躍內(nèi)存提供給前臺。而windows不同,一個在運行的軟件你若不關(guān)閉它就會一直在內(nèi)存里運行。既然iOS里的程序不可能一直占著內(nèi)存,那iOS豈不是沒有“后臺運行”這一說法了么?iOS也的確不能后臺,不像windows那樣能一邊前臺看著電影一邊后臺干著其他事情。事實上,在iOS內(nèi),當(dāng)一個軟件從前臺轉(zhuǎn)入后臺后5秒內(nèi)便會完全停止運行,極少數(shù)特殊軟件能運行10秒,某些需要后臺下載功能的軟件在轉(zhuǎn)入后臺后也最多繼續(xù)下載10分鐘。這就是某種意義上所謂的的“偽后臺”。

2.什么是墓碑機制?

我們現(xiàn)在用著的iphone后臺功能大概就是這么個尿性。這里要借用一下Windows phone里的一個名詞——墓碑機制。

何為墓碑機制?好比大家能從某一個人的墓碑上了解到該人活著時是個什么鳥樣,但這個人其實已經(jīng)掛了。也就是說當(dāng)一個程序被系統(tǒng)從內(nèi)存移除后,系統(tǒng)允許這個程序給自己立個“墓碑”,記錄自己“生前”的樣子,等你要讓這些程序“復(fù)活”的時候,系統(tǒng)會照著它墓碑上那鳥樣給他重新加載到內(nèi)存里去。“墓碑”狀態(tài)下的程序們不會占用CPU,不會占用內(nèi)存,甚至不會產(chǎn)生功耗。也能稱之為“后臺掛起”,差不多那個意思。這就是為什么你長時間不用瀏覽器后再打開它時,你會發(fā)現(xiàn)頁面重新加載了一次但網(wǎng)頁并沒有刷新,也是為什么iOS的后臺功能需要軟件的支持才能實現(xiàn)。iOS就是用這種方式實現(xiàn)的后臺,同時又保證內(nèi)存的。

綜上所述,在iOS這樣的內(nèi)存管理機制下,你完全不必?fù)?dān)心軟件會因為分配到的內(nèi)存不足而卡頓,因為任何軟件被放在前臺時都有權(quán)限向處理器要求盡量多的內(nèi)存。所以在iOS里,你完全沒有必要去手動清理后臺程序來釋放內(nèi)存,iOS會自動釋放。相反iOS比你更“聰明”,它知道該釋放哪些程序的內(nèi)存,何時釋放,釋放多少,而自己手動清理內(nèi)存完全是多此一舉。至于那些所謂的內(nèi)存清理軟件所列出的后臺程序所占內(nèi)存,那也并不是實際被占用的內(nèi)存,多數(shù)都是那些程序所請求的內(nèi)存大小。

3.那iphone端的清理內(nèi)存的軟件是干啥的?

前面也說了,iOS里的軟件是沒有權(quán)限直接調(diào)用硬件的,那么內(nèi)存清理軟件又是如何實現(xiàn)清理內(nèi)存功能的?當(dāng)你使用內(nèi)存清理功能時,它會一直向處理器請求盡量多的內(nèi)存,處理器便盡量將后臺里的內(nèi)存釋放出來供它使用,等它最大限度的獲得了內(nèi)存后,再自己釋放掉自己占用的這些內(nèi)存......這就完了。本質(zhì)上講,iOS的內(nèi)存清理軟件并不是“清理”了內(nèi)存,而是先將其他軟件“擠出”內(nèi)存后再把內(nèi)存讓出來。

我們再反觀內(nèi)存的意義:是為了讓CPU能更高效的讀取數(shù)據(jù),才將程序直接存放在內(nèi)存里的。而你卻秉著“讓系統(tǒng)更快”的原則隔三差五把內(nèi)存里的程序全抹掉,等你要用那些程序時系統(tǒng)還得先從外存調(diào)到內(nèi)存然后才能開始讀寫,你說這是快了還是慢了?

最后可能有人會問:雖然iOS這種機制能保證每個軟件都最大限度地使用內(nèi)存,但如果有個游戲所需要的運存超過了設(shè)備所配備的RAM那怎么辦?在這里要說的是,你覺得蘋果會批準(zhǔn)一個他們設(shè)備帶不動的軟件上架App Store么?

4.最后來點總結(jié)?

大的內(nèi)存對于iOS來說也并非完全沒有意義,起碼這能為設(shè)備一個運行更大型的軟件創(chuàng)造一些條件。但內(nèi)存不是決定性條件,若蘋果讓iPad具備了運行更大型軟件的處理能力,那自然會給它一個夠用的內(nèi)存。如今的手機軟件還沒有哪個能一口氣占滿1G內(nèi)存的。電腦上顯卡的顯存大家都知道吧?一個獨立顯卡,就算才512M的顯存對90%的人來說都夠了,而且電腦跑的還是x86游戲,ARM上的軟件能占不了多少內(nèi)存。

還有人一定肯定準(zhǔn)備回答說:如果蘋果加大內(nèi)存然后換真后臺的話不是更好嗎?這里只能說,安卓就是真后臺,你可以同時運行幾個軟件,但你不得不犧牲一些流暢度。并且安卓給軟件提供的權(quán)限太高,你在享受高度“自由”的同時卻得防著流氓軟件霸著你的內(nèi)存不讓。所以在蘋果有辦法不影響到現(xiàn)在流暢度的同時提供真后臺之前,你就只能接受這種后臺。既然目前只能是偽后臺那你覺得大內(nèi)存的作用能多大呢。這里沒有說安卓和windows不好,而是說不同的機制都有不同的好處,但同時又有他們相對應(yīng)的弊端。

這些問題不是簡單的好或不好就能評價的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,523評論 25 708
  • 有一個人很幸運,離開爸媽的懷抱來到一個陌生的城市生活。一直平平淡淡的生活著,然而這些平坦的路是背后親人早已鋪好的路...
    wuli嬌妹閱讀 479評論 0 0
  • ――關(guān)于“分享”的一點兒感悟 其一,剛在“劉老師心理工作室”群里,看到他今天的原創(chuàng)分享文章“讓人無語的...
    簫音聲聲閱讀 188評論 0 0
  • 這幾天的忙碌可以說是焦頭爛額,串串出差的兩天我也沒輕松啊,加班加班無盡頭…… 我心里很清楚,這個加...
    車前小草閱讀 223評論 0 0