Sobes.tech
Middle+

iOS'da xotira qanday tuzilgan?

sobes.tech AI

AIdan javob

iOS bir necha turdan iborat hierarxik xotira tuzilmasidan foydalanadi:

  1. RAM (Tasodifiy kirish xotirasi):

    • Tez, energiyaga bog'liq bo'lgan xotira turi.
    • Faol dasturlar va ma'lumotlarni saqlash uchun ishlatiladi.
    • Swift/Objective-C ob'ektlari uchun ARC (Avtomatik Referenslar Soni) mexanizmi va operatsion tizim tomonidan boshqariladi.
    • Xotira yetishmovchiligi bo'lsa, tizim kamroq faol dasturlarni yopishi mumkin.
  2. Ichki xotira (NAND Flash):

    • RAMdan sekinroq, ammo energiyasiz.
    • Operatsion tizim, dasturlar, foydalanuvchi ma'lumotlari (rasmlar, videolar, hujjatlar) uchun ishlatiladi.
    • Cheklangan yozish tsikllari resursiga ega.
  3. Kesh-xotira (L1, L2, L3):

    • Protsessor darajasida juda tez xotira.
    • Tez-tez ishlatiladigan ko'rsatmalar va ma'lumotlarni saqlash uchun ishlatiladi, RAMga kirishni tezlashtirish uchun.

ARC (Avtomatik Referenslar Soni)

  • Swift va Objective-C'da xotira boshqarish mexanizmi bo'lib, u ob'ektlarga bo'lgan referentsiyalarni avtomatik ravishda kuzatib boradi va boshqaradi.
  • Har bir ob'ektning referentsiya hisoblagichi bor. U nolga yetganda, ob'ekt tomonidan egallangan xotira bo'shatiladi.
  • Xotira oqib ketishining oldini oladi, ammo weak yoki unowned bilan ishlashda diqqat talab qiladi.

Virtual xotira

  • iOS virtual xotira ishlatadi, bu dasturlarga fizik RAMdan ko'proq manzil maydonidan foydalanishga imkon beradi.
  • Xotira sahifalari RAM va fayl tizimi o'rtasida ko'chirilishi mumkin (iOSda bu cheklangan, asosan ishlatilmaydigan sahifalarni tozalash orqali, diskda to'liq swap qilish emas, macOSda kabi).
  • "siqilgan xotira" kabi mexanizmlar sahifalarni siqib, ularni saqlashga yozmasdan siqib chiqarishi mumkin.

Dasturda xotira boshqaruvi

  • Dasturchi asosan ARC orqali xotira bilan ishlaydi.
  • weak va unowned to'g'ri ishlatilishini ta'minlash orqali xotira oqib ketishlarini oldini olish muhim.
  • Xotira iste'molini optimallashtirish, masalan, resurslarni talab qilinishi bilan yuklash, samarali ma'lumot tuzilmalaridan foydalanish va ortiqcha ob'ektlar yaratishdan saqlanish.
  • Xotira iste'molini profiling qilish va oqib ketishlarni aniqlash uchun Xcode Instruments (Allocations, Leaks) kabi vositalar ishlatiladi.

weak ni ishlatish misoli, kuchli referensiya aylanishlarini oldini olish uchun:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("Person \(name) boshlanmoqda")
    }

    deinit {
        print("Person \(name) tugatilmoqda")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Bu yerda 'weak' ishlating

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) boshlanmoqda")
    }

    deinit {
        print("Apartment \(unit) tugatilmoqda")
    }
}

var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")

john?.apartment = unit4A
unit4A?.tenant = john

// Agar tenant kuchli bo'lsa, john va unit4A ni nil ga o'rnatganda,
// Person va Apartment ob'ektlari deinitialization bo'lmaydi
john = nil // deinit chaqiriladi
unit4A = nil // deinit chaqiriladi