Bir topar
Keliń, yaddan paydalanıwdıń mısalın kórip shıǵayıq: dinamikalıq túrde keńeytiriletuǵın qatardı (vektordı) qanday ámelge asırıwdı oyda sáwlelendirsek. Biz qatar keńeytiw operaciya mápdar boladı: deylik, array qashannan berli virtual mánzil mákan ayrım úzliksiz maydandı iyeleydi (onıń maǵlıwmatlar virtual mánzil mákan bir neshe betler astında ajıratılǵan edi). Biz bul qatardı keńeytiwdi qáleymen, onıń kólemin eki esege, eski maǵlıwmatlar jańa qatar nusqa. Sonnan keyin, biz eski qatar kerek emes. Eki soraw bar: qaysı betlerdi rezervlew hám eski betler menen ne qılıw kerek. Itibar beriń, jańa betlerdi rezervlew hám olardı fizikalıq yad menen salıstırıw qımbat ekenin aytıw kerek, biz basqa maǵlıwmatlardı ajıratıp alıwımız kerek hám eski ajıratılǵan yad betleri bizge paydalı bolıwı múmkin-olardan paydalanıp, biz jańa betlerdi aytpastan jańa maǵlıwmatlardı jazıwımız múmkin. Bunnan tısqarı, biz ıqtıyat bolıwımız kerekligin da umıtpań.
Yad VirtualAlloc hám VirtualFree sistema funktsiyaları arqalı tuwrıdan-tuwrı ajratılıwı hám shıǵarılıwı múmkin. VirtualAlloc-ǵa yad blokınıń ólshemin hám kerekli kiriw ózgesheligin (ádetde: oqıw-jazıw) kórsetip beriń. Sistema biypul yaddan bloktı ajratadı. Endi programmada yad bar hám oǵan belgi bar. Yad azat etiliwi kerek bolsa - VirtualFree qońıraw etiń. Sistema yadtı bos jayǵa qaytaradı. Biraq aldın aytıp ótkenimizdey, yad nátiyjeli islewi kerek, sol sebepli yad menen nátiyjeli islew ushın betlerdi manipulyatcıya etiwshi shamlardan ibarat. Jaqsı xabar sonda, bir topar menen islew OS dárejesinde ámelge asırıladı hám onı ózińiz ámelge asıra almaysız.
C tilinen kelgen standart kitapxanada libc yad ajıratıw hám bosatıw ushın uqsas túrde malloc() hám free() funktsiyaların ámelge asırdı. C ++ de new(new []) hám delete (delete []) sıyaqlı funktsiyalar bar.
Hár bir malloc/new/new[] ushın free/delete/delete [] dep atalıwı kerek, sebebi funksiyalardan shıǵıw waqtında yad ózin azat etpeydi. Bul funkciyanı shaqırmaydı, bir toparı qaladı hám yad sızıntısı boladı.
Dáslep, birinshi kompyuterlerde processor ushın yad tek bayt qatarı edi. Mısal ushın, i8086 processor ushın bul qatar kólemi 2^20 bayt (1 MB) edi. Álbette, mashinada yad kemrek bolıwı múmkin. Bunday halda, ayrım yad yasheykalarına kiriw itibarsız qaldırıldı. TODO: bar bolmaǵan fizikalıq yaddan oqıtıp atırǵanda ne júz bolıwın anıqlaw ushın (itimal, minus birlik oqıladı). Orınlanıp atırǵan programma hár qanday yad jayında oqıwı yamasa jazıwı múmkin. Sol sebepli qáte programma yamasa zıyanlı programma pútkil sistemanıń nadurıs islewine alıp keliwi múmkin.
Yad menen islew ushın bul jantasıwdıń jetispesligi i80286 ushın qáwipsiz rejim (protected mode) kiritiliwi menen ońlawǵa urındı. Qorǵalǵan rejim bir-birinen processlerdi ajıratıp alıw imkaniyatın berdi, sol sebepli birewiniń basqa maǵlıwmatların buzbawı múmkin. 286 payda bolǵan processlerdi izolyatsiyalaw mexanizmi júdá qolay emes edi hám házirde derlik paydalanılmaydı.
Házirgi waqıtta i80386 processorge kiritilgen betti anıqlaw mexanizmi (paging[3]) processlerdi izolyatsiyalaw ushın isletiledi.
TODO: endi biz qorǵalǵan rejim hám bet adresine keri bolǵanımız haqqındaǵı tásirler payda bolıwı múmkin. Haqıyqattan da, "qáwipsiz rejim" termini eki zattı ańlatadı: segmentli mánzil (segmentaciya) hám bet adresi. 286 tek segmentli adreske iye edi. Segmentirovka adresi qolaysız edi hám házirgi waqıtta derlik paydalanılmay atır (mısalı, "Thread Information Block" [4] den tısqarı ).
Do'stlaringiz bilan baham: |