Mashina xotirasida qiymatlarni saqlash
Qiymatlarni ikkilik sanoq sistemasida tasvirlash
Biz mashina xotirasida har doim qiymat(son)larni saqlaymiz undan boshqa narsani emas va o‘z navbatida bu sonlarni ham biz o‘nlik sanoq tizimida emas, balki ikkilik sanoq tizimida saqlaymiz. Chunki biz saqlash deganda ham shunchaki transistorlarda elektr toki o‘qishi(borligi) yoki o‘tmas(yo‘q)ligiga asoslanamiz. Buni tushinishning eng sodda darajasi - bu shunchaki qiymatlarni 0 yoki 1 lardan tashkil topgan deb tushunish osonroq. Agar elektrik xususiyatlarga o‘tilsa, bu ancha murakkablashib ketadi. Keling birinchi sanoq tizimi nima ekanligini bilib olaylik. Biz kundalik turmushimizda ishlatadigan sanoq tizimi 10 lik sanoq tizimi deyiladi, chunki unda faqat 10 belgi bor. Ya’ni ular: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 va biz ularni raqamlar deymiz. Hamda shu raqamlardan foydalanib har xil sonlarni yozamiz. Lekin kompyuterda biz bu sanoq tizmidan foydalana olmaymiz, uning o‘rniga biz ikkilik sanoq tizimidan foydalanamiz. Ikkilik sanoq tizimi esa faqat 0 (elektr toki yo‘q) va 1 (elektr toki yo‘q) tashkil topgan, hamda biz hozir qanday qilib ixtiyoriy sanoq tizimidagi soni, belgilarni, harflarni, h.k. faqat shu ikki belgi orqali tasvirlashni o‘rganamiz.
Esdada tuting. Aslida hech qanday 0 yoki 1 ni oddiy dasturga yoki kitobga yozgandek kompyuter xotirasiga yozib qo‘yib bo‘lmaydi hamda saqlash ham qurilma turlariga qarab farqlanadi. Shuning uchun ham eng osoni bu - yuqorida ko‘rayotanimizdek shunchaki 0 yoki 1 deb tushunishdir.
Bit. Bit kompyuterda, umuman olganda hisoblash mashinalarida, berilganlarni o‘lchashning eng kichik birligidir. Agar bir bit deyilsa, sodda qilib aytganda, bizga bitta bo‘sh joy berilgan deb aytamiz hamda u yerga faqat 0 yoki 1 dan birini yoza olamiz deymiz. Agar 2 bit joy bor deyilsa, u holda biz 0 yoki 1 dan xohlagan ikkitasini ketma-ket qo‘ya olamiz. Biz bitlarning joyini sanashni o‘ngdan boshlaymiz, chunki soning oldiga nol raqami qo‘shilsa uning qiymati o‘zgarmaydi, bu esa keyinchalik bizga umumiy holda qulaylik beradi.
Keling birinchi quyidagi ikkita katakdan iborat bo‘lgan 2 bitli xotirani qaraylik.
1-bit |
0-bit |
---|---|
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
Demak, bizda ikki bit bo‘lsa, u joyga biz 0 va 1 larning 4 ta turli xil ko‘rinishini yoza olamiz. Boshqacha aytganda, bizga ikkita joy berilsa, u yerga 0 va 1 turli xil qilib yozishlarimiz soni ko‘pi bilan 4 ta bo‘ladi va biz bu joyga 0, 1, 2, 3 lardan biri joylashgan deb tassavur qilamiz:
1-bit |
0-bit |
ikki bitdagi soning 10 lik qiymati |
---|---|---|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
2 |
1 |
1 |
3 |
Umumiy qoida esa \(2^{bitlar\,soni}\) bo‘ladi. Masalan, 3 bitli joyga biz \(2^3=8\) gacha bo‘lgan sonlarni yozishimiz mumkin bo‘ladi yoki 4 bitlisiga esa \(2^4=16\) gacaha.
Lekin oldindan bizga qanday son berilishini bilmasak, u holda songa ko‘proq xotiradan joy ajratamiz. Agar son biz ajratgan joydan kichik bitlarga sig‘sa, unda uning oldiga keraklicha 0 qo‘shamiz. Masalan, 23 soni bu o‘nlikda desak, unda uning ikkilik ko‘rinishi 10111 bo‘ladi. Agar shu soni 32 bitli xotiraga saqlamoqchi bo‘lsak, uning oldiga 27 ta nol qo‘shamiz, ya’ni
00000000000000000000000000010111
Agar kiritilgan son biz ajratgan bitlardan oshib ketsa, masalan, 8 bitli xotiraga 257 soni yozmoqchi bo‘lsak, u holda biz muammolar paydo bo‘ladi. Bu narsalar turli dasturlash tillarida farqli ravishda yechilgan. Pythonning asl holatida biz bunday muammolarni ko‘rmaymiz, lekin kutubxonalar bilan ishlaganda bu narsaga duch kelamiz. Masalan, NumPy yoki PyTorch kutubxonalarida har bir qiymat uchun aniq xotiradan joy ajratamiz, chunki ular aslida C/C++ tillarida yozilgan hamda hisoblash ishlari uchun optimallashtirilgan(tezlashtirilgan).
NumPy va PyTorch. Ushbu kutubxonalar hozirgi kunda zamonaviy SIning asosi hisoblanadi hamda ularda biz turli xil jadval ko‘rinishidagi qiymatlarni saqlaymiz va ularning tayyor imkoniyatlaridan foydalanamiz. Ushbu kutubxonalarni keyingi boblarda o‘rganib chiqamiz.
Keling endi qanday qilib manifiylikni ifodalashni ko‘raylik. Misol uchun son -23 bo‘lsin, unda ishorani ifodalash uchun biz ajratgan bitlarning oxirgisiga 1 qo‘yish bilan shu soni manifiyligini bildiramiz, ya’ni:
10000000000000000000000000010111
ya’ni soning manifiyligini bildirish uchun birinchi nol 1 ga aylanadi. Bu degani birinchi bit sonning manifiy yoki musbatligi uchun ajratiladi, qolgan 31 bitga esa sonning o‘zini saqlaymiz. Ushbu qoidalar sababidan biz xotiradan joy olmoqchi bo‘lsak, shu joyga nima yozishimiz kerakligini oldindan aytamiz aks holda qiymatlarni umumiy satr turida saqlashga to‘g‘iri keladi. Bu esa o‘z navbatida dasturning ishlash tezligini keskin tushirib yuboradi.
Odatda ko‘pchilik o‘rganuvchilarda savol tug‘uladi: Nimaga biz soni ikkilik ko‘rinishda saqlanishini bilishimiz kerak, chunki biz dasturlash tillari bilan ishlayotganimizda ular o‘zgaruvchiga o‘zlashtirgan qiymatni to‘g‘iridan-to‘g‘iri ikkilik ko‘rinishga o‘tkazsa?
Bu jarayon shunday bo‘lishi rost, faqat biz nega saqlanayotgan qiymatlarning turlarni va ayniqsa biz haqiqiy sonlar bilan amallar bajarayotganimizda qiymatlarni yo‘qolishini ham bilishimiz kerak. Buni esa faqat sonlarni qanday xotirada joylashtirishga bog‘liqligi asosida tushunishimiz mumkin. Masalan, \(-\frac{200}{3}\) soni 32 bitli xotirada IEEE 754 standart bo‘yicha quyidagicha bo‘ladi. Biz qo‘shimcha ushbu misolda soddaroq holni qaraymiz, ya’ni bu haqiqiy standartdagi berilgan hamma hollarni o‘z ichiga olmaydi. Berilgan 32 bitni 3 ta qismga bo‘lamiz:
ishora (musbat yoki manifiy uchun) 1 bit;
exponenta uchun 8 bit;
hamda, mantissa uchun qolgan 23 bit.
Ishora |
Exponenta |
Mantissa |
---|---|---|
1 |
8 |
23 |
Berilgan son manifiy bo‘lgani uchun, birinchi bit ga 1 yozamiz.
Exponentani quyidagicha hisoblash uchun birinchi soni quyidagi ko‘rinishda yozamiz: \(\frac{2}{3}10^2\). Keyin esa, 10 sonining darajasidagi 2 sonini ikkilik sanoq tizimiga o‘tkazib(\(2_{10}\rightarrow 10_{2}\)), uni Exponentagaga yozamiz. Lekin bizda 8 bit bor, shuning uchun \(10_{2}\) oldiga 6 nol qo‘shamiz, ya’ni \(00000010_{2}\). Oxir oqibatda Exponenta qiymati \(00000010_{2}\) ga teng bo‘ladi.
Endi bizda \(\frac{2}{3}\) qoldi. Bu soni biz shunchaki Matnissaga yoza olmaymiz, uni birinchi ikkilik sanoq tizimiga o‘tkazishimiz zarur. Buning uchun shu soni 2 ko‘paytiramiz va butun qismidagi soni (0 yoki 1) saqlab qo‘yamiz. Quyidagi jadvalda ushbu jarayon batafsil keltirilgan.
Son |
ko‘paytiriluvchi son (2) |
Ikkilik ko‘rinish |
---|---|---|
\(1+\frac{1}{3}\) |
\(\frac{2}{3}*2\) |
1 |
\(0+\frac{2}{3}\) |
\(\frac{1}{3}*2\) |
10 |
\(1+\frac{1}{3}\) |
\(\frac{2}{3}*2\) |
101 |
\(0+\frac{2}{3}\) |
\(\frac{1}{3}*2\) |
1010 |
\(1+\frac{1}{3}\) |
\(\frac{2}{3}*2\) |
10101 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
\(1+\frac{1}{3}\) |
\(\frac{2}{3}*2\) |
10101010101010101010101 |
Yuqoridagi takrorlash 23 ta raqam bo‘lgunicha davom etadi va sonning qolgan qismi tashlab yuboriladi. Ko‘rib turganimizdek, biz xotiraga kichkina sonni ham aniq(to‘liq) holda saqlay olmas ekanmiz. Shuning uchun sonlarning turlari bilan xotirada ishlayotganda, har bir qismdan maqsadli foydalanish zarur bo‘ladi. Hamda ular o‘rtasidagi har xil amallarda (+, -, *, /) har doim yaxlitlash xatoligi mavjud bo‘ladi va bu o‘z navbatida ba’zi vaqtlarda tanlagan matematik modelimiz xatoliklarga olib keladi. Bu xatolik nafaqat modelga bog‘liq bo‘ladi, balki model nazariy jihatdan mukammal bo‘lsada, amaliy jihatdan yechimga ega bo‘lmaydi.
Hisoblash mashinasining fizik xususiyatlari
Transistorlar yordammida hisoblash
Ushbu qism ixtiyoriy bo‘lib, hisoblash mashinalari qanday qilib amallarni bajarishini qisqacha qurilma jihatdan yoritadi. Avvalo, biz o‘zi hisoblash mashinasi nima degan savolga javob berishimiz zarur. Chunki hisoblash mashinalarining bir qancha turlari mavjud. Masalan, anolog, raqamli(ba’zida diskret ham deyilishi mumkin) yoki kvantum(quantum). Hozirgi kunda biz anolog mashinalardan deyarli foydalanmaymiz va kvantum kompyuterlari hali ham yetarli natija bergani yo‘q. Shuning uchun ham kompyuter yoki hisoblash mashinasi yoki elektron hisoblash mashinasi deganda faqat 0 yoki 1 dan iborat qiymatlarni saqlovchi va ular ustida amallar bajaruvchi biror qurilmani tushinamiz. Bu narsa hattoki oddiy Kalkulyator(Calculator) ham bo‘lishi mumkin yoki raqamli soat ham. Ingliz tilidagi "Computer" so‘zi "Hisoblovchi" deb tarjima qilishimiz mumkin. Lekin zamonaviy hayotda biz biror ixtiyoriy mashinani kompyuter deyishimiz uchun - u mashinaga dastur yoza olishimiz kerak hamda bu dastur orqali mashina berilgan amallar ketma-ketligini to‘g‘iri bajarishi zarur.
Keling endi raqamli hisoblash qurilmalarida qanday qilib amallar bajariladi shuni bir ko‘rib o‘tsak. Birinchi biz ozroq fizika sohasiga to‘xtalib o‘tmoqchimiz, chunki biz qurilma qanday qismlardan tashkil topganini bilishimiz zarur. Quyida biz vakumli quvurni ko‘rishmiz mumkin:
Ushbu quvurdan elektr energiyasi o‘tishi yoki o‘tmasligi asosida amallar bajarilgan va berilgan(qiymat)lar xotirada saqlangan. Bu kabi qurilmalar ko‘p issiqlik chiqarishi, energiya iste’mol qilishi hamda katta hajmdagi kompyuterlar qurish uchun juda ham murakkab bo‘lgan. Keyinchalik 1950-yillarda transistor deb ataluvchi yarim o‘tkazgichlarga asoslangan qurilma ishlab chiqilgan hamda hozirgi qurilmalarning asosi shu hisbolanadi. Keling endi ushbu qurilma qanday ishlaydi shuni bir o‘rganib chiqaylik. Quyida uning rasmi keltirilgan.
Eng sodda holda tushunadigan bo‘lsak, rasmda ko‘rib turganingizdek unda 3 ta ulanish nuqtasi bor: asos(base), tarqatuvchi(emitter) va yig‘uvchi(collector). Agar biz asosga kichik kuchlanish(elektr) bersak u holda, yig‘uvchidan elektr oqimi tarqatuvchiga tomon harakatlanib boshlaydi. Quyidagi rasmda uni biz agar asosda elektr quvvati bo‘lsa, 1 aks holda 0 deb olish bilan ifodalasak bo‘ladi:
Ushbu rasmdan tushinishimiz kerak bo‘lgan eng asosiy g‘oya bu asosda quvvat bo‘lmasa chapdagi rasmdagi kabi taqratuvchida ham quvvat bo‘lmaydi. Agar asosda quvvat bo‘lsa(bu quvvat juda ham kichik bo‘lib, ba’zi turdagi metallardagina bu kabi xususiyat mavjud), u holda tarqatuvchida ham quvvat bo‘ladi. Ushbu qurilma keyingi qismlarda amalarni bajarish uchun asos bo‘lib xizmat bo‘ladi.
Keling soddalik uchun ushbu qo‘llanmada faqat ikkita "VA" hamda "YOKI" mantiqiy amallarini ko‘raylik. "VA" amali deganda biz ikkita qiymat ham 1 bo‘lganda natija 1 bo‘lishini tushinamiz hamda yuqorida biz "Asos"ni kiruvchi, "Yig‘uvchi"dan boshlangan qismni elektr oqim deb qayta nomlaylik. Navbatdagi qilishimiz zarur bo‘lgan ish shunday ikkita transistorni ketma-ket ulasak, unda quyidagi rasm ega bo‘lamiz. Demak shunday ikkita transistorni ketma-ket qo‘yish orqali ikkita asosga ega bo‘lamiz hamda bular biz uchun kirish nuqtalari bo‘ladi.
Yuqoridagi mantiqiy "Va" amalini tasvirlovchi rasm 4 ta qismdan tashkil topgan bo‘lib, har birida 2 ta kiruvchi qiymat mavjud: \(Kiruvchi_1, Kiruvchi_2\). Ushbu ikkita kiruvchilarda elektr quvvati mavjud bo‘lsa, ularning qiymati 1 ga teng aks holda 0 ga. Hamda Elektr oqimi yuqoridan pastga qarab harakatlanishi kera deb qaralgan. Agar ikkita kiruvchida ham bir vaqtda kichik quvvat manbai bo‘lsa, u holda quyida qismda elektr oqimi mavjud bo‘ladi(D qismdagi rasmdagidek). Qolgan qimslardagi rasmlarda esa kiruvchilardan birida yoki bir vaqtda ikkisida ham elektr quvvati yo‘q shuning uchun ham yuqoridagi elektr oqimi pastga yetib bormaydi. Shu tarzda biz elektr oqimi va kichik quvvat manbai bor yoki yo‘qligiga asosan mantiqiy "VA" amali bajaramiz. Ushbu holatni biz umuman olganda quvvat manbalarini ketma-ket ulashga ham o‘xshatishimiz mumkin, lekin bu yerdagi asosiy farq, odatda, kiruvchilardagi elektr quvvati juda ham kichik bo‘ladi. Endi keling shu kabi, parallel ulashga o‘xshash, ikkita transistorni parallel ulaymiz:
Yuqoridagi tasvir bilan oldingisi deyarli bir xil ko‘rinishga o‘xshaydi, lekin bu yerda transistorlar parallel ulangan va natijada bizga mantiqiy "Yoki" amalini bajarishimizga imkon beradi.
Biz shu vaqtgacha bor yo‘g‘i ikkita transistorlarni ulash orqali ikkita amalni qanday bajarishni o‘rgandik. Bu kabi amallar yoki transistorlarni ulash eng sodda holatda hisoblash mashinasi qanday ishlashini tushuntirishga asos bo‘lib xizmat qiladi xolos. Aslida zamonaviy hisoblash mashinalarida bu kabi transistorlardan millionlab bo‘ladi, faqat o‘lchami nano-metrlarda o‘lchanadi. Ta’savur hosil bo‘lish uchun, 1 nano-metr 1 metrni 1 000 000 000 soniga bo‘lganimizda, uning bir ulishi hisoblanadi. Bu degani inson ko‘zi bu kabi kichik o‘lchamdagi transistorlarni ko‘ra olmaydi. Bu esa bizga millionlab transistorlarni 1 sm kvadratga joylashtirishimizga imkon beradi. Quyida AMD EPYC 5 9005 CPU(Central Processing Unit, markaziy ishlov berish birligi) rasmi keltirilgan. U har bir chipda 40 milliardan ortiq transistordan tashkik topgan.
Biz ushbu qismda imkon qadar qisqa va sodda holda hisoblash mashinalari ishlashini tasvirlashga harakat qildik. Albatta hozirgi zamonaviy mashinalarga yuqoridagi sodda amallar asos bo‘lib xizamt qilsada, lekin aslida zamonaviy arxitekturalar qurish hamda bu kabi kichik transistorlardan tashkil topgan chiplarni ishlab chiqish juda ham murakkab hisoblanadi. Shuning uchun ham bunday chiplarni ishlab chiquvchi mashinalarni yasovchi kompaniya dunyoda bitta, ya’ni "ASML Holding"dir va dunyodagi eng rijovlangan davlatlarda yo‘q narsalardan biri shu turdagi mashinalarni ishlab chiqara olmasligidir.
Qiymatlarni qurilmalarda saqlash
Qiymatlarni yuqorida ko‘rib chiqanimizdek faqat ikkilik sanoq sistemasida saqlashimish mumkin ekan va ular ustidagi amallar ham faqat ikkilik sanoq sistemasidagi kabi bajarilar ekan. Keyingi tushunishimiz zarur bo‘lgan vazifa qanday qilib qurilmalar xotirada qiymatlar vaqtinchalik yoki doimiy saqlaydi. Ushbu mavzu umumiy olganda juda keng hisoblanadi, chunki biz bir turdagi xotira bilan ishlamasdan, bir nechta qatlamli xotiralarni birgalikda ishlatamiz. Shuning uchun ham odatda ko‘pchilik xotirada saqlash masalasida juda ham qiynaladi. Yillar o‘tishi bilan texnologiyalar o‘zgardi bu esa nafaqat turli xil usulda xotira manbalarni saqlash usullarini ishlab chiqishga imkon berdi balki ularni ma’lum darajalarga ham ajratib chiqdi. Ushbu darajalarni biz qatlam desak ham bo‘ladi va umumiy qoida sifatida agar qatlam markaziy ishlov berish birligidan qancha uzoq bo‘lsa, shuncha kattaroq sekin, lekin, ko‘p hollarda, kattaroq berilganlarni saqlash imkoniga ega bo‘ladi. Keling birinchi qatlam nima ekanligini haqida qisqa ma’lumot beraylikda, undan so‘ng ushbu qismning asosiy maqsadi: qanday qilib qiymatlarni saqlashni o‘rganaylik. Ingliz tilida ushbu xotira qatlamini Register deb ataymiz va tarjima qilmasdan ishlatamiz. Bu xotira hisoblash uchun markaziy ishlov berish birligi tomonidan to‘g‘iridan to‘g‘iri ishlatiladi va eng tez ishlaydigan xotira hisoblanadi. Ushbu xotira qiymatlarni faqat elektronlar yordamida qiymatlarni saqlaydi. (Yoshiz kerak.)