Тооцоолох байгууламжийн хандаж буй санах ойн хаяг нь санах ойг эхний үүрнээс нь дэс дараалан дугаарласан тооноос өөр хаягтай байдаг. Учир нь CPU санах ойд арай өөрөөр ханддаг. Гэхдээ яаж? бас яагаад? Энэ талаар бүгдээрээ судалцгаая.
Эхэн үеийн хөгжил…
Эхэн үеийн компьютерүүд 8 битийн регистртэй байлаа. Ийм регистрээр санах ойг 256 байт хүртэл л хаяглаж чадна. Үнэндээ энэ нь орчин үед ч, тухайн үедээ ч дэндүү жижиг хаяглалт байлаа.
Яваандаа компьютерүүд 16 битийн регистртэй болсон. Ийм регистрийг өргөтгөсөн (extended) регистр гэдэг. Ийм регистрээр 2^16 буюу 64 килобайт үүр хаяглах боломжтой болов. Гэвч тухайн үед 1МБ хүртэл хэмжээтэй санах ойг үйлдвэрлэж чаддаг байсан. Мурын хуулийн дагуу тэр үед хэмжээ бага, үнэтэй санах ойтой байсан бол одоо хэмжээ ихэссэн ба хямд үйлдвэрлэдэг болсон. Тиймээс 1МБ буюу 2^20 хүртэлх үүрийг хаяглахын тулд санах ойг 16 сегментэд хувааж тус бүрийн хэмжээ нь 65КБ буюу нийлээд 1МБ хүртэлх үүрийг дугаарлах боломжтой болсон. Ийм системд програм бичихдээ сегментийн регистрт (кодын, өгөгдлийн, стекийн гэх мэт) хадгалагдсан утга дээр хандах хаягийг нэмж физик хаягаа гаргаж авдаг байсан.
Гэхдээ технологи хөгжихийн хэрээр хүн төрөлхтөн бүр ч их хэмжээний санах ой үйлдвэрлэж чаддаг болсон тул түүнийгээ дагаад тэр их санах ойг хаяглах багтаамжтай регистрийг стандартчилах шаардлагатай байлаа. 32 битийн эрин үе ингэж эхэлсэн юм.
32 битийн регистрээр 2^32 буюу 4 тэрбум үүрийг хаялаж чадна. Ийм регистрийг өргөтгөсөн (extended) регистр гэдэг. Windows XP гэх мэт 32 битийн үйлдлийн системүүд 4ГБ санах ойг 2ГБ хэрэглэгчид, 2ГБ системд зориулж тусгаарлах маягаар яг ийм технологийг бид маш олон жил хэвийн ашиглаж эхэлсэн ч технологи хөгжсөөр л байлаа…
Хүслээс давсан эрин…
32 битийн хаяглалт хангалтгүй болж эхлэхэд 64 битийн CPU-нүүд гарч ирсэн юм. Ийм регистрээр 2^64 буюу 16 экзабайт үүрийг хаяглаж чадна. Өөрөөр хэлбэл бид бүр өөрсдийн хэрэгцээнээс ч илүү зүйлийг хаяглах боломжтой болсон юм. Орчин үед бид 64 битийн регистртэй болсон учир санах ойн бодит хэрэгцээнээсээ ч илүү хаягийн багтаамжтай болсон тул санах ойг сегментэд хуваалгүй шууд физик хаягаар нь хандах боломжтой болсон. Гэхдээ бид тэгдэггүй. Учир нь
- Аюулгүй байдал: Процесс дурын хаяг руу ханддаг байх ёсгүй. Өөрт нь хуваарилсан хаягнаас өөр хаяг руу хандах гэж оролдсон ч хандуулахгүй байх.
- Санах ойн хүртээмжгүй байдлыг зохицуулах: Санах ой хүрэлцэхээргүй болсон тохиолдолд диск рүү бичих.
- Замбараагүй хэрэглээг зохицуулах: Процесс бүхэн ижилгүй хэмжээтэй санах ой үйлдлийн системээс хүсдэг, ажиллаж дуусаад чөлөөлдөг, тэр үед завсар үүсэж болно. Тиймээс санах ойн дараалсан үүрийг өгөх боломжгүй тохиолдолд өөр өөр үүрүүдээс хуваарилж өгч болно. Эдгээр асуудлыг шийдэхийн тулд бид санах ойг виртуалчилдаг.
Энэхүү хэрэгцээнээс давсан шийдэл нь бидэнд дараах боломжуудыг нээж өгсөн юм.
- Paging: Тогтмол хэмжээтэй хуудсаадад хуваагдсан санах ой. CPU аль нэг хуудас руу хандахыг хүсэхэд Memory Management Unit түүнийг физик хуудас руу хөрвүүлж өгнө. MMU логик хуудас бүрийг өөр өөр физик хуудсуудтай холбосон байх тул дээрхтэй ижил давхцалын асуудал үүсэхгүй. Процесс бүрд өөр өөр санах ойн бүлэг хаягийг виртуалаар оноож өгнө, тус бүрд нь Page Table үүсгэнэ. Процессын хандсан дата санах ойд байвал Page hit болно.
- Virtual memory: Санах ой хүрэлцээгүй тохиолдолд хамгийн бага ашиглагдсан хуудсуудыг үйлдлийн систем диск рүү хуулж бичээд чөлөөлсөн зайгаа илүү идэвхтэй ажиллаж буй процесст хуваарилж өгнө. Харин диск рүү шилжсэн датаг эзэмшдэг процесс CPU дээр ирэх үед CPU дисктэй шууд харьцаж чадахгүй. Энэ үед Page fault болно. Энэ тохиолдолд RAM дээр хамгийн бага ашиглагдаж буй датаг чөлөөлж диск рүү, чөлөөлөгдсөн зайнд дискэн дээр байсан датаг тус тус бичнэ. Үүнийг Swap гэнэ. Илүү гарсан датаг диск рүү бичсэн хэсгийг Virtual RAM гэнэ. Дисктэй харилцах нь маш удаан тул Page fault болсон тохиолдолд кернел шууд тасалдал дуудна. Өөрийнх нь дата RAM дээр бүрэн суусан тохиолдолд л эргүүлж ажиллуулна
- Memory mapped I/O: Оролт, гаралтын төхөөрөмжүүдийг тусгай I/O заавраар бус, үндсэн санах ойн хаягийн орон зайд шууд холбож, CPU тэдгээрийг RAM-ын нэг хэсэг мэт хандах боломжтой. Төхөөрөмж бүрт тодорхой хаягийн муж хуваарилж өгдөг бөгөөд CPU тухайн хаяг руу унших, бичих үйлдэл хийхэд яг л санах ойд хандсан шигээр төхөөрөмжтэй өгөгдөл солилцоно. Энэ нь зааврын багцыг хялбарчилж, хурдыг нэмэгдүүлдэг бөгөөд OS болон драйверууд хаяглалтаар дамжуулан төхөөрөмжийг удирддаг. Орчин үеийн процессорууд гол төлөв энэ аргыг ашигладаг ба тусгай хянагчийн тусламжтайгаар RAM ба I/O төхөөрөмжийн хаягийг ялгаж зохицуулдаг.
Гэхдээ бидэнд 128 битийн хаяглал хэрэгтэй болов уу? Уншигч та юу гэж бодож байна?