O’zbekiston respublikasi axborot texnologiyalari va



Yüklə 471,54 Kb.
Pdf görüntüsü
səhifə3/4
tarix29.11.2023
ölçüsü471,54 Kb.
#142147
1   2   3   4
Mavzu xotirani taqsimlash usullari

out.println("The animal makes a sound");
}
}
class Pig extends Animal {
public void animalSound() {
System.
out.println("The pig says: wee wee");
}
}
class Dog extends Animal {
public void animalSound() {
System.
out.println("The dog says: bow wow");
}
}
class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal(); // Create a Animal object
Animal myPig = new Pig(); // Create a Pig object
Animal myDog = new Dog(); // Create a Dog object
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
Xotira haqida tushuncha, Xotirani taqsimlash 
Xotirani taqsimlash - bu jarayonga (uning ko'rsatmalari va ma'lumotlari) 
jismoniy yoki virtual xotira manzil maydonini belgilash harakati. Xotirani 
taqsimlashning ikkita asosiy usuli statik va dinamik xotira ajratishdir. Statik xotira 


ajratish usuli xotirani jarayonga, uni bajarishdan oldin tayinlaydi. Boshqa 
tomondan, dinamik xotirani taqsimlash usuli xotirani jarayonga, uni bajarish 
vaqtida tayinlaydi. Ushbu bo'limda biz xotirani taqsimlash nima ekanligini, uning 
turlarini (statik va dinamik xotirani taqsimlash) va ularning afzalliklari va 
kamchiliklarini muhokama qilamiz. Shunday ekan, keling, boshlaylik.
Tarkib: Statik va dinamik xotirani ajratish Xotirani taqsimlash Xotirani 
taqsimlash turlari Statik va dinamik xotirani taqsimlashning afzalliklari va 
kamchiliklari Asosiy xulosalar Xotirani taqsimlash Jarayonni bajarish uchun uni 
birinchi navbatda xotiraga joylashtirish kerak. Xotiradagi jarayonga joy ajratish 
xotirani ajratish deyiladi. Xotirani ajratish - bu bog'lanish atamasining umumiy 
jihati.Keling, misol yordamida bog'lanishni tushunamiz. Faraz qilaylik, dasturda 
atributlar to'plamiga ega ob'ekt mavjud. Endi ushbu ob'ektning o'zgaruvchisi ushbu 
atributlar to'plami uchun qiymatlarga ega bo'ladi. Ushbu qiymatlarni saqlash uchun 
biz ushbu atributlarga ajratilgan xotiraga ega bo'lishimiz kerak. Demak, 
o'zgaruvchining atributiga xotira manzilini belgilash akti xotirani ajratish deyiladi. 
Va qiymatlarni o'zgaruvchining atributlariga ko'rsatish/bog'lash harakati majburiy 
deb ataladi. Ushbu bog'lash amali dasturni bajarish jarayonida o'zgaruvchidan 
foydalanishdan oldin bajarilishi kerak.
Bizda xotirani ajratishning ikki turi mavjud yoki ikkita bog'lash usuli, statik 
va dinamik bog'lanishni aytishimiz mumkin.
Xotirani taqsimlash turlari 
1. Statik xotirani ajratish Statik xotira ajratish kompilyator dasturni 
kompilyatsiya qilganda va obyekt fayllarini hosil qilganda amalga oshiriladi. 
Bog'lovchi ushbu barcha ob'ekt fayllarini birlashtiradi va bitta bajariladigan faylni 
yaratadi. Yuklovchi ushbu bitta bajariladigan faylni bajarish uchun asosiy xotiraga 
yuklaydi. Statik xotirani taqsimlashda jarayon uchun zarur bo'lgan ma'lumotlar 
hajmi jarayon boshlanishidan oldin ma'lum bo'lishi kerak. Agar jarayonni amalga 


oshirishdan oldin ma'lumotlar o'lchamlari ma'lum bo'lmasa, ularni taxmin qilish 
kerak. Agar taxmin qilingan ma'lumotlar hajmi talab qilinganidan kattaroq bo'lsa, 
bu xotiraning isrof bo'lishiga olib keladi. Agar taxmin qilingan o'lcham kichikroq 
bo'lsa, bu jarayonning noto'g'ri bajarilishiga olib keladi. Statik xotirani ajratish 
usuli jarayonni bajarish jarayonida xotirani ajratish operatsiyasini talab qilmaydi. 
Jarayon uchun zarur bo'lgan barcha xotira ajratish operatsiyalari jarayon 
boshlanishidan oldin amalga oshiriladi. Shunday qilib, bu jarayonning tezroq 
bajarilishiga olib keladi.
Statik xotira taqsimoti dinamik xotira ajratish bilan solishtirganda ko'proq 
samaradorlikni ta'minlaydi. 
Dinamik xotira taqsimoti 
2. Dinamik xotira ajratish dastur bajarilayotgan vaqtda amalga oshiriladi. Bu 
erda xotira dasturning ob'ektlari dastur ishlayotgan vaqtda birinchi marta 
foydalanilishi kerak bo'lganda ajratiladi. Kerakli ma'lumotlarning haqiqiy hajmi ish 
vaqtida ma'lum bo'ladi, shuning uchun u dasturga aniq xotira maydonini ajratadi va 
shu bilan xotirani isrof qilishni kamaytiradi. Dinamik xotira taqsimoti dasturni 
bajarish uchun moslashuvchanlikni ta'minlaydi. Chunki u dastur uchun qancha 
xotira maydoni talab qilinishini hal qilishi mumkin. Agar dastur etarlicha katta 
bo'lsa, unda hozirda foydalaniladigan dasturning turli qismlarida dinamik xotira 
taqsimoti amalga oshiriladi. Bu xotira sarfini kamaytiradi va tizimning ish 
faoliyatini yaxshilaydi. Xotirani dinamik ravishda taqsimlash tizim ustidan 
ortiqcha yuk hosil qiladi. Ba'zi taqsimlash operatsiyalari dasturning bajarilishi 
davomida qayta-qayta bajariladi, bu esa dasturning sekin bajarilishiga olib keladi. 
Dinamik xotirani ajratish operatsion tizimdan maxsus yordamni talab qilmaydi. 
Dinamik xotirani taqsimlash usulidan foydalanish uchun dasturni loyihalash 
dasturchining zimmasida. Shunday qilib, dinamik xotira taqsimoti moslashuvchan, 
lekin statik xotira taqsimotiga qaraganda sekinroq.
Statik va dinamik xotira ajratishning afzalliklari 
Statik xotirani taqsimlash


Statik xotira taqsimoti xotirani jarayonga tayinlashning samarali usulini 
ta'minlaydi.Barcha xotira tayinlash operatsiyalari bajarish boshlanishidan oldin 
amalga oshiriladi. Shunday qilib, dasturni bajarish vaqtida xotirani taqsimlash 
operatsiyalari uchun qo'shimcha xarajatlar yo'q.
Statik xotirani taqsimlash tezroq bajarilishini ta'minlaydi, chunki bajarilish 
vaqtida dasturga ajratilgan xotirada vaqtni yo'qotish shart emas.
Dinamik xotirani taqsimlash
Dinamik xotira taqsimoti xotirani jarayonga belgilashning moslashuvchan 
usulini ta'minlaydi. Dinamik xotira taqsimoti xotira sarfini kamaytiradi, chunki u 
ushbu dasturni bajarish jarayonida jarayonga xotirani tayinlaydi. Shunday qilib, u 
dastur tomonidan talab qilinadigan aniq xotira hajmidan xabardor. Agar dastur 
katta bo'lsa, dinamik xotira ajratish dasturning turli qismlarida amalga oshiriladi. 
Xotira dasturning hozirda ishlatilayotgan qismiga biriktirilgan. Bu shuningdek, 
xotira isrofgarchiligini kamaytiradi va haqiqatan ham tizim ish faoliyatini 
yaxshilaydi.
Statik va dinamik xotira ajratishning kamchiliklari
Statik xotirani taqsimlash
Statik xotirani taqsimlashda tizim dasturning xotira talabini bilmaydi. 
Shunday qilib, u dastur uchun zarur bo'lgan xotirani taxmin qilishi kerak. Statik 
xotira taqsimoti xotirani yo'qotishga olib keladi. Chunki u dastur tomonidan talab 
qilinadigan xotira hajmini taxmin qiladi. Shunday qilib, agar taxminiy o'lcham 
kattaroq bo'lsa, bu xotirani yo'qotishga olib keladi, aks holda taxminiy o'lcham 
kichikroq bo'lsa, dastur noto'g'ri ishlaydi.
Dinamik xotirani taqsimlash
Dinamik xotirani taqsimlash usuli xotirani jarayonga uni bajarish vaqtida 
tayinlash uchun qo'shimcha xarajatlarga ega. Ba'zan dasturni bajarish jarayonida 
xotirani ajratish harakatlari bir necha marta takrorlanadi, bu esa qo'shimcha 
xarajatlarga olib keladi. Amalga oshirish vaqtida xotirani taqsimlashning 
qo'shimcha xarajatlari ma'lum darajada bajarilishini sekinlashtiradi. Xotirani 
ajratish dastur yoki jarayon uchun xotira manzilini belgilaydi. Xotirani 


taqsimlashda statik xotira ajratish va dinamik xotira ajratishning ikkita usuli 
mavjud. Statik xotirani taqsimlash samaradorlikni ta'minlaydi, chunki u xotirani 
bajarilishi boshlanishidan oldin jarayonga tayinlaydi. Shunday qilib, dasturni 
bajarish paytida xotirani ajratish operatsiyasi uchun ortiqcha yuk yo'q, bu 
dasturning tezroq bajarilishiga olib keladi. Statik xotirani ajratishda kerakli xotira 
hajmi dastur bajarilishidan oldin ma'lum bo'lishi kerak. Statik xotira ajratish 
jarayonga taxminiy xotira maydonini belgilaydi, chunki u dastur tomonidan talab 
qilinadigan xotira hajmini bilmaydi. Bu xotirani behuda sarflashga olib keladi. 
Dinamik xotirani ajratish dasturni bajarish vaqtida amalga oshiriladi. Shunday 
qilib, u xotirani isrof qilishdan saqlaydigan dasturga aniq xotira miqdorini ajratadi. 
Dinamik xotira taqsimoti dasturning bajarilishini sekinlashtiradigan dasturni 
bajarish paytida xotirani taqsimlash operatsiyasining qo'shimcha xarajatlariga ega.
Dinamik xotira ajratish xotirani taqsimlashda moslashuvchanlikni ta'minlaydi, 
go'yo dastur etarlicha katta bo'lsa, u dasturlarning turli qismlarida xotirani ajratish 
operatsiyalarini bajaradi va xotirani isrof qilishni kamaytiradi. Operatsion tizim 
samarali va moslashuvchan bajarish uchun statik va dinamik xotira ajratishning 
eng yaxshi aralashmasini olishi mumkin.
Dinamik xotirani boshqarish muntazam xotira ajratish va bo'sh joyni bo'shatishni 
talab qiladi. Ushbu maqolada x otirani ajratish uchun ishlatilishi mumkin bo'lgan 
bir nechta usullar keltirilgan. Malloc (xotirani ajratish) yoki bo'sh funksiyani 
chaqirish, ajratilgan xotira manziliga havolaga olib keladi yoki u har safar 
chaqirilganda boshqalar foydalanishi uchun xotirani bo'shatadi. Dinamik xotirani 
boshqarish muntazam xotira ajratish va bo'sh joyni tozalashni talab qiladi. 
Bo'shatilgan bo'sh joy bilan bir qatorda ishlatilgan joy bilan nima qilish kerak? 
Keyingi malloc qo'ng'irog'i uchun qaysi manzillar/uyalardan foydalanish 
kerakligini qanday aniqlaymiz? Xotirani boshqarishning uchta usuli mavjud, biz 
ushbu savollarni hal qilishda foydalanishimiz mumkin, biz ularni batafsil 
muhokama qilamiz. Quyidagi jadval 1024 baytlik bitta katta xotira blokining joriy 
holatini ko'rsatadi. Xotirani ajratish uchun har bir usul uni qanday ishlatishini 
ko'rib chiqamiz.


Eslatma: Ushbu blogda biz faqat First Fit algoritmini ko'rib chiqamiz, garchi 
bu usullarning har biri o'z foydalanish holatlariga ega. Umuman olganda, birinchi 
moslamaga ustunlik beriladi.
Birinchi Fit
Birinchi moslash usulida bepul ro'yxat so'ralgan o'lchamga ega bo'lgan 
birinchi bepul blokni topish uchun ketma-ket o'tkaziladi. Blok topilgach, quyida 
keltirilgan ikkita amaldan biri bajariladi: Agar o'lcham so'ralgan miqdorga teng 
bo'lsa, u bepul ro'yxatdan o'chiriladi. Aks holda, u ikki qismga bo'linadi. Bu erda 
birinchi qism ro'yxatda qoladi va ikkinchisi ajratiladi.Ikkinchi qismni ajratishning 
sababi shundaki, ro'yxatni yangilash operatsiyasidan faqat erkin tugun hajmini 
o'zgartirish orqali oldini olish mumkin. Keling, 200 baytni ajratishga harakat 
qilaylik va strukturaning qanday o'zgarishini tushunamiz.
Ko'rinib turibdiki, xotira ikkinchi bo'limda ajratilgan, oldingi blok birinchi 
qismga ishora qiladi. Agar birinchi qism ishlatilgan bo'lsa, ikkinchi bo'limga ishora 
qilib, o'zgartirish ro'yxatda amalga oshirilishi kerak edi. Endi algoritmni ko'rib 
chiqamiz:
p = freeblock;
alloc = null; // pointer to store the allocated size n’s address
q = null;
// find the free node which can allocate the given size n
while ( p != null && size(p) < n) {
q = p; // previous node
p = next(p);
}
// if there is block large enough found
if ( p != null ) {
s = size(p);
alloc = p + s – n; // alloc contains the address of the desired block
// if the block size matches the requested size, remove the block from the free list
if ( s == n) {


// if the match is found in the first block update the pointer of freeblock to point the 
next of free block
if ( q == null ) {
freeblock = next(p);
} else {
next(q) = next(p); }
} else {
size(p) = s – n; // adjust the size of the remaining free block
}
Hajmi belgilangan “n” o‘lchamidan kattaroq yoki unga teng bo‘lgan bepul 
bloklarning eng kichigi Best Fit yondashuvida tanlanadi. Eng yaxshi moslikni 
topish uchun ushbu algoritm to'liq ro'yxat bo'ylab ishlashi kerak. Keling, 200 bayt 
ajratishga harakat qilaylik va strukturadagi o'zgarishlarni qayd etamiz: Worst Fit 
texnikasidagi algoritm har doim eng katta bo'sh xotira blokining bir qismini 
ajratadi. Ushbu strategiyaning g'oyasi shundan iboratki, ko'pchilik so'rovlarga 
xizmat ko'rsatish uchun oz sonli juda katta bloklardan doimiy ravishda foydalanish 
orqali ko'plab kichik bloklar parchalanmagan bo'lib qoladi. Keling, 200 ni 
ajratishga harakat qilaylik va strukturaning qanday o'zgarishini ko'rib chiqaylik. 
C++ da o‘zgaruvchilar yo 
statik - kompilyatsiya paytida
, yo standart 
kutubxonadan funksiyalarni chaqirish yo‘li bilan dinamik - dasturning bajarilish 
paytida, joylanishi mumkin. Bu usullarni ishlatishning asosiy farqi ularning 
effektivligida va moslanuvchanligidadir. Statik joylashtirish 
birmuncha 
effektivroq
,chunki xotira ajratish dastur bajarilishidan oldin bajariladi. Ammo uning 
moslanuvchanligi ancha pastroq, chunki bu holda biz joylashtiriladigan 
ob’yektlarning turlari va o‘lchamlarini oldindan bilishimiz zarur.Masalan, matn 
fayllarni 
qatorlarning statik massivida
, uning o‘lchamini oldindan bilish zarurligidan, 
joylashtirish ancha qiyin. Ayniqsa, oldindan noaniq sonli elementlarni saqlash va 
qayta ishlash bilan bog‘liq masalalar uchun xotirani dinamik taqsimlash usulidan 
foydalanish qulay.


Xotirani statik va dinamik taqsimlash o‘rtasidagi asosiy farq quyidagilar: 

Statik ob’yektlar nomlangan o‘zgaruvchilar bilan belgilanadi. Shu sababli bunday 
ob’yektlar ustida amallar bevosita ularning nomlarini ishlatish orqali amalga 
oshiriladi. Dinamik ob’yektlar shaxsiy nomga ega bo‘lmaydi, ular 
ustidagi amallar 
bilvosita
, ya’ni ko‘rsatkichlar yordamida bajariladi; 

Statik ob’yektlar uchun xotira ajratish va bo‘shatish kompilyator tomonidan 
avtomatik ravishda bajariladi. Dasturchining bu haqda bosh qotirishi shart 
emas.Dinamik ob’yektlar uchun xotira ajratish va bo‘shatish butunligicha 
dasturchining zimmasiga tushadi. Bu esa hal qilishda xatoga yo‘l qo‘yish mumkin 
bo‘lgan murakkab masaladir.Dinamik ajratilgan xotira bilan ish ko‘rish 
uchun new va 
delete
 
buyruqlaridan foydalaniladi.Shu paytgacha barcha misollarda xotirani statik ajratish 
usulidan 
foydalanilib kelindi. Masalan, i o‘zgaruvchini aniqlash quyidagicha bajarilar edi: 

Yüklə 471,54 Kb.

Dostları ilə paylaş:
1   2   3   4




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©www.genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə