Middle+
Ինչպես է կառուցված հիշողությունը iOS-ում։
sobes.tech AI
Պատասխան AI-ից
iOS օգտագործում է հիերարխիկ հիշողության կառուցվածք մի քանի տեսակներով:
-
RAM (Աշխատող Հիշողություն):
- Արագ, էներգիայի կախված տեսակի հիշողություն:
- Օգտագործվում է ակտիվ աշխատող ծրագրերի և տվյալների պահեստավորման համար:
- Կառավարում է օպերացիոն համակարգը և ARC (Automatic Reference Counting) մեխանիզմը՝ Swift/Objective-C օբյեկտների համար:
- Հիշողության պակասի դեպքում համակարգը կարող է փակել (տարածել) ամենաակտիվ ծրագրերը:
-
Ներքին հիշողություն (NAND Flash):
- Ավելի դանդաղ, քան RAM-ը, բայց էներգիա-ազատ:
- Օգտագործվում է օպերացիոն համակարգի, ծրագրերի, օգտվողի տվյալների (նկարներ, տեսանյութեր, փաստաթղթեր) պահպանման համար:
- Սահմանափակ է վերագրումների ցիկլերի քանակով:
-
Էջային հիշողություն (L1, L2, L3):
- Շատ արագ հիշողություն պրոցեսորի մակարդակում:
- Օգտագործվում է հաճախ օգտագործվող հրահանգների և տվյալների պահեստավորման համար՝ արագ մուտքի համար:
ARC (Automatic Reference Counting)
- Մեխանիզմ՝ հիշողության կառավարման՝ Swift և Objective-C-ում, որը ավտոմատ կերպով հետևում և կառավարում է օբյեկտների հղումները:
- Յուրաքանչյուր օբյեկտ ունի հղումների հաշվիչ: Երբ այն հասնում է զրոյի, օբյեկտի զբաղեցրած հիշողությունը ազատվում է:
- Պրևենտիվ է հիշողության արտահոսքներից, բայց պահանջում է ուշադրություն ցիկլային ամուր հղումներից՝
strong reference cycles, որոնք կարելի է լուծելweakկամunownedհղումներով:
Վիրտուալ հիշողություն
- iOS-ը օգտագործում է վիրտուալ հիշողություն, որը թույլ է տալիս ծրագրերին օգտագործել ավելի մեծ հասցեային տարածք, քան ֆիզիկական RAM-ը:
- Հիշողության էջերը կարող են տեղափոխվել RAM և ֆայլային համակարգի միջև (համենայն դեպս iOS-ում դա սահմանափակ է, հիմնականում անօգտագործվող էջերի մաքրման միջոցով, ոչ լիարժեք սվոփինգի միջոցով дискին, ինչպես macOS-ում):
- Մեխանիզմներ՝ ինչպես "սեղմված հիշողություն" կարող են սեղմել էջերը՝ փոխարենը գրառելու պահեստում:
Հիշողության կառավարման ծրագրում
- Ծրագրավորողը հիմնականում աշխատում է հիշողության հետ ARC-ի միջոցով:
- Կարևոր է խուսափել հիշողության արտահոսքներից, ճիշտ օգտագործելով
weakևunowned: - Պետք է օպտիմալացնել հիշողության սպառումը՝ օրինակ, ռեսուրսները պահանջով բեռնել, օգտագործել արդյունավետ տվյալների կառուցվածքներ և խուսափել ավելորդ օբյեկտներ ստեղծելուց:
- Օգտագործվում են գործիքներ՝ ինչպես Xcode Instruments (Allocations, Leaks), որոնք օգնում են հիշողության սպառման պրոֆիլավորել և արտահոսքերը գտնել:
Նմուշ՝ weak օգտագործելու՝ ցիկլային ամուր հղումներից խուսափելու համար:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("Person \(name) is being initialized")
}
deinit {
print("Person \(name) is being deinitialized")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Օգտագործեք 'weak'
init(unit: String) {
self.unit = unit
print("Apartment \(unit) is being initialized")
}
deinit {
print("Apartment \(unit) is being deinitialized")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john
// Եթե tenant-ը լիներ ուժեղ, ապա `john` և `unit4A`
// օբյեկտները չեն դեինիցիալիզացվեր
john = nil // deinit կանչվում է john-ի համար
unit4A = nil // deinit կանչվում է unit4A-ի համար