Sobes.tech
Middle+

Ինչպես է կառուցված հիշողությունը iOS-ում։

sobes.tech AI

Պատասխան AI-ից

iOS օգտագործում է հիերարխիկ հիշողության կառուցվածք մի քանի տեսակներով:

  1. RAM (Աշխատող Հիշողություն):

    • Արագ, էներգիայի կախված տեսակի հիշողություն:
    • Օգտագործվում է ակտիվ աշխատող ծրագրերի և տվյալների պահեստավորման համար:
    • Կառավարում է օպերացիոն համակարգը և ARC (Automatic Reference Counting) մեխանիզմը՝ Swift/Objective-C օբյեկտների համար:
    • Հիշողության պակասի դեպքում համակարգը կարող է փակել (տարածել) ամենաակտիվ ծրագրերը:
  2. Ներքին հիշողություն (NAND Flash):

    • Ավելի դանդաղ, քան RAM-ը, բայց էներգիա-ազատ:
    • Օգտագործվում է օպերացիոն համակարգի, ծրագրերի, օգտվողի տվյալների (նկարներ, տեսանյութեր, փաստաթղթեր) պահպանման համար:
    • Սահմանափակ է վերագրումների ցիկլերի քանակով:
  3. Էջային հիշողություն (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-ի համար