Skip to content

Python GC va Reference Counting: Xotira boshqaruvi

Xotira boshqaruvi — bu dastur ishlayotgan paytda zarur obyektlar uchun xotira ajratish, kerak bo'lmaganda esa xotirani bo'shatish jarayoni hisoblanadi.

Kirish: Tasavvur

Xotira boshqaruvi jarayonini har bir dasturchi tushunishi talab qilinadi, chunki noto'g'ri xotira boshqaruvi dastur samaradorligini pasaytirishi va tizimda xatoliklar yuzaga kelishiga olib keladi.

Dastur tuzish jarayonida ko'p o'zgaruvchi e'lon qilishga ehtiyoj seziladi. Har bir e'lon qilingan o'zgaruvchi xotiradan ma'lum bir miqdorda joy egallaydi. Xotirani samarali boshqarish, keraksiz ma'lumotlarni vaqtida tozalash hisoblanadi. Bu samarali va tejamkor dastur yaratishning muhim jihatlaridan biridir.

Tasavvur qiling, sizning dasturingiz 2 GB tezkor xotiraga (RAM) ega serverda ishlayapti. Dastur ishlayotganda o'zgaruvchilar bir qancha ma'lumotlarni o'qib, o'zida saqlaydi. Bu jarayon davomida xotira miqdori tez-tez o'zgarib turadi. Masalan, sizning dasturingizda bir o'zgaruvchida binar fayl, yana birida esa Excel formatidagi 20 millionta qo'shimcha hisob-kitob fayllari saqlanmoqda. Bu shuni anglatadiki, siz serverning xotirasini to'ldiryapsiz.

Server xotirasini to'ldirish dastur ishlashining samaradorligiga ta'sir qiladi. Xotira to'lib qolganida, tizimda berilgan buyruqlarga kech javob berish, ishlashning sekinlashishi va hatto server butkul javob berishdan to'xtashi ham mumkin. Shuning uchun xotira boshqaruvini to'g'ri tashkil etish, zarur bo'lmagan obyektlarni o'z vaqtida o'chirib tashlash va xotiradan foydalanishni optimallashtirish juda muhimdir.

Xotirani samarali boshqarilishi, katta hajmdagi ma'lumotlar bilan ishlaydigan tizimlarni tezligini va samaradorligini oshiradi. Shu sababli dasturchilarga xotira boshqaruvini yaxshi tushunish va bu jarayonni optimallashtirishni o'rganish juda muhimdir.

Tasavvur qiling, sizning do'koningiz bor. Ushbu do'kon xotirani anglatadi va do'konda sotilayotgan 100 xil maxsulot turlari har biri xotiradagi obyektlar(o'zgaruvchilar) deb tasavur qilishimiz mumkin. Har bir maxsulot turi o'ziga xos xususiyatlarga ega: ba'zi maxsulotlar katta hajmda, boshqalari esa kichikroq. Ularning barchasi do'konda joy egallaydi, lekin har bir maxsulot turiga ajratilgan joy miqdori turlicha. Turlicha mahsulotlar dasturlashda biz ko'p duch keladigan int, float, string ma'lumot turlarini anglatadi, ular ham xotiradan har-xil hajmda joy egallaydi. Quyida do'kon misolida xotirani yana ham aniqroq tushunishga harakat qilamiz.

Hajm

Do'kondagi mahsulotlarning har biri xotiradagi obyektlar. Masalan, bir maxsulot turi kompyuter, boshqasi esa telefon. Do'konda hamma narsaning o'z joyi bor, ammo do'konning o'zi faqat chegaralangan joyga ega (xotira hajmi).

Boshqarish

Do'kondagi xodimlar xotira boshqaruvchilari(reference counting). Ular har bir maxsulotni joylashtiradilar va kerak bo'lganda, keraksiz maxsulotlarni ro'yxatini tuzib chiqishadi yoki o'zlari olib tashlaydi.

Tozalash

Ba'zan do'konda kerak bo'lmagan yoki eski mahsulotlar qoladi. Keraksiz mahsulotlar ro'yxatiga tushganlari olib tashlanadi. Xotiradagi ma'lumotlar ham vaqt o'tishi bilan yangilanib turishi kerak. Do'konni tez-tez tozalash(garbage collection) va eski maxsulotlarni olib tashlash kerak bo'ladi. Shuningdek, ba'zi mahsulotlar (masalan, yuqori sifatli kompyuterlar) ko'proq joy egallaydi, boshqalari esa unchalik katta bo'lmaydi.

To'lishi

Do'konda 100 xil maxsulot turi mavjud va har birining o'ziga xos joyi bor. Ammo do'konda joy cheklangan, shuning uchun siz har bir maxsulot turiga qandaydir joy ajratishingiz kerak. Masalan: kompyuterlar yoki televizorlar xotirada ko'p joy egallaydi. Ularni o'z vaqtida sotish yoki joylarini yangilash zarur. Agar ularni do'konda uzoq saqlasangiz, boshqa maxsulotlarga joy qoldirmaydi(memory leak).

Do'konda joy tugasa, yangilanishlar amalga oshirilmaydi yoki keraksiz maxsulotlar ko'pligidan do'kon xodimlari o'z ishini bajara olmaydi. Xuddi shunday, xotira to'lib qolsa, dastur samarali ishlay olmaydi.

Samarali boshqarish(memory management)

Agar do'kon juda ko'p joyga ega bo'lmasa, ba'zi mahsulotlarni chiqarib yuborishingiz kerak. Shuningdek, eski yoki kam sotiladigan maxsulotlar o'rniga yangi talabgir mahsulotlar joylashtiriladi. Buning yordamida do'konning samaradorligi oshadi, shuningdek, eski va keraksiz mahsulotlardan xalos bo'lib, yangi mahsulotlarga joy ajratiladi.

Info

Xotira boshqaruvi — faqat kerakli ma'lumotlarni saqlash va kerak bo'lmaganda xotiradagi keraksiz ma'lumotlarni olib tashlash jarayonidir. Do'konni yaxshi boshqarish uchun xodimlar, maxsulotlar va joylarni samarali taqsimlash zarur.

Texnik qism

Yuqoridagi misolimizda, jarayonga mos texnik terminlar ishlatildi. Quyida shu terminlarga ozroq to'xtalamiz.

  • Reference counting - xotiradagi obyektlar sonini hisoblash usuli. Agar siz biror obyektni dasturda ishlatayotgan bo'lsangiz, reference count 1 bo'ladi. Agar bu obyekt boshqa biror joyga foydalanilsa, uning reference counti 2 bo'ladi va shu tarzda boshqa joylarda foydalanilganda, ularning barchasi obyektning reference countini oshiradi. Agar reference count 0 ga teng bo'lsa, obyekt xotiradan o'chiriladi.

  • Garbage collection - avtomatik xotira boshqaruvi usuli bo'lib, unda ishlatilmaydigan va kerak bo'lmagan obyektlarni xotiradan tozalash amalga oshiriladi. Bu jarayonni odatda "axlat to'plash" deb atashadi, chunki tizim foydalanilmayotgan xotira obyektlarini aniqlab, ularni xotiradan o'chiradi. garbage collection usullari turlicha bo'lishi mumkin, biroq eng keng tarqalgan metodlardan biri bu obyektlarga bog'lanishlar sonini tekshirish bo'lib bu reference counting ga asoslangan usul. Agar obyektga hech qanday bog'lanish qolmasa, u garbage collection tomonidan aniqlanadi va xotiradan o'chiriladi.

  • Memory leak - tizimdagi xotira resurslarining noto'g'ri boshqarilishi natijasida vujudga keladigan holatdir. Bu holatda, foydalanilmagan yoki kerak bo'lmagan obyektlar xotiradan o'chirilmaydi va ular xotiradagi joyni egallashni davom ettiradi. Bu o'z navbatida xotira resurslarini tezda to'ldiradi va dastur ish faoliyatini to'xtatadi.

Amaliyot

Endi amaliyot qismiga o'tsak ham bo'ladi. Reference counting ortiqcha obyektlarni tezlikda tozalash uchun yaxshi usul hisoblanadi lekin ba'zi cheklovlarga ega. Quyida reference countingga misol:

son = 10
  1. son nomli o'zgaruvchi 0xFFEE xotira manzilida 10 qiymati bilan e'lon qilindi.
  2. son o'zgaruvchisi bu obyektga havola yoki ko'rsatkich(pointer) bo'ladi.

Bu misolda 10 obyekti uchun reference counting 1 bo'ladi, chunki faqat son unga murojaat qilgan.

Pythonning sys moduli ichida getrefcount() funksiya bor, shu funksiya yordamida reference counting bog'lanishlarni aniqlashimiz mumkin.

getrefcount()

import sys

a = []
b = a
print(sys.getrefcount(a)) # natija: 3, chunki a, b, va list getrefcount() ga bog'langan.

del b
print(sys.getrefcount(a)) # natija: 2, chunki b o'chirildi

c = [a]
print(sys.getrefcount(a)) # natija: 3, chunki c ham a ga bog'landi.

del a
print(sys.getrefcount(c[0])) # natija: 2, list hali ham c ichida mavjud

del c # endi roʻyxatga murojaat qilib bo'lmaydi, uning xotirasi boʻshatiladi

Natija:

3
2
3
2