Middle+
Kā ir uzbūvēta atmiņa iOS?
sobes.tech AI
Atbilde no AI
iOS izmanto hierarhisku atmiņas struktūru ar vairākiem veidiem:
-
RAM (Darba atmiņa):
- Ātra, enerģijai atkarīga atmiņas veids.
- Izmanto aktīvi darbojošu lietojumprogrammu un datu glabāšanai.
- To pārvalda operētājsistēma un ARC (Automātiskās atsauces skaitīšanas) mehānisms Swift/Objective-C objektiem.
- Ja atmiņa ir izsmelta, sistēma var izdzēst (terminēt) mazāk aktīvās lietojumprogrammas.
-
Iekšējā atmiņa (NAND Flash):
- Lēnāka nekā RAM, bet energoizturīga.
- Izmanto operētājsistēmas, lietojumprogrammu, lietotāja datu (foto, video, dokumentu) glabāšanai.
- Ir ierobežots ciklu skaits rakstīšanas reizēs.
-
Kešatmiņa (L1, L2, L3):
- Ļoti ātra atmiņa procesora līmenī.
- Izmanto bieži lietotu instrukciju un datu glabāšanai, lai paātrinātu piekļuvi RAM.
ARC (Automātiskās atsauces skaitīšanas)
- Atmiņas pārvaldības mehānisms Swift un Objective-C, kas automātiski uzrauga un pārvalda atsauces uz objektiem.
- Katram objektam ir atsauču skaits. Kad tas sasniedz nulli, atmiņa, ko aizņem objekts, tiek atbrīvota.
- Novērš atmiņas noplūdes, bet prasa uzmanību, strādājot ar cikliskām stiprajām atsaucēm (
strong reference cycles), kuras var atrisināt arweakvaiunownedatsaucēm.
Virtuālā atmiņa
- iOS izmanto virtuālo atmiņu, ļaujot programmām izmantot adreses telpu, kas ir lielāka par fiziski pieejamo RAM.
- Atmiņas lapas var tikt pārvietotas starp RAM un failu sistēmu (lai gan iOS tas notiek ierobežoti, galvenokārt, iztukšojot neizmantotās lapas, nevis pilnvērtīgu lapu apmaiņu uz diska kā macOS).
- Mekanisma, piemēram, "saspiesta atmiņa", var saspiest lapas, nevis rakstīt tās uz glabātuvi.
Atmiņas pārvaldība lietojumprogrammā
- Izstrādātājs galvenokārt strādā ar atmiņu, izmantojot ARC.
- Ir svarīgi izvairīties no atmiņas noplūdēm, pareizi izmantojot
weakununowned. - Ir jāoptimizē atmiņas patēriņš, piemēram, ielādējot resursus pēc pieprasījuma, izmantojot efektīvas datu struktūras un izvairoties no lieku objektu izveides.
- Rīki, piemēram, Xcode Instruments (Allocations, Leaks), tiek izmantoti atmiņas patēriņa profilaksei un noplūžu meklēšanai.
Piemērs, kā izmantot weak, lai novērstu stipro atsauču ciklu:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("Person \(name) ir inicializēts")
}
deinit {
print("Person \(name) ir iznīcināts")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Izmanto 'weak' šeit
init(unit: String) {
self.unit = unit
print("Apartment \(unit) ir inicializēts")
}
deinit {
print("Apartment \(unit) ir iznīcināts")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john
// Ja tenant būtu stipra atsauce, tad, nomainot john un unit4A
// objekti Person un Apartment netiktu iznīcināti
john = nil // iznīcināšanas paziņojums par john
unit4A = nil // iznīcināšanas paziņojums par unit4A