Engineering Notes
2.45K subscribers
137 photos
5 files
208 links
Kanalda asosan backend engineeringga oid postlar yozib boriladi.

Ba'zi postlarda xatoliklar bor.
Postlar foydali bo’lgan bo’lsa adminni duo qilib qo’ying. Rahmat.

Contact: @Bobosher_Musurmonov
LinkedIn: https://www.linkedin.com/in/bobosher-musurmonov
Download Telegram
OSI modeli haqida

Open Systems Interconnection (OSI) modeli 1984-yilda ISO tomonidan standartlashtirilgan model bo’lib, qurilmalar orasidagi communikatsiya(ya’ni aloqa) qanday bo’lishini belgilab beruvchi konseptlardan (ha, konseptlar, qandaydir dastur emas) tashkil topgan. Shoshmang, avval yaxshilab tushunib oling: qurilmalar orasidagi aloqani ta’minlash. Masalan, men komputerim orqali biror saytga kirishim uchun mening komputerim va o’sha sayt serveri ma’lumot almashishi, ya’ni “gaplashishi” kerak. OSI esa shu ma’lumot uzatish jarayonini bir qancha bosqichlarga ajratib, har bir bosqichning vazifasini va ma’lumot qanday ko’rinishda bo’lishi kerakligini belgilaydi. Demak, bugun biz ko’p hollarda “shunchaki” ishlaydi deb hisoblagan jarayonlardan biri - qurilmalar orasida ma’lumot almashishni network engineer sifatida emas, dasturchi sifatida software tomondan batafsilroq ko’rib chiqishga harakat qilamiz.

OSI modeli ma’lumot uzatishning eng pastdagi ko’rinishi - networkda (havoda, internet kabelda va h.k) suzib yurgan ikkilik ma’lumotdan eng yuqoridagi (siz oladigan “odam tushunadigan” tildagi) ma’lumotni qabul qilishgacha bo’lgan yo’lni 7 ta qavatga ajratadi. Umumiy jarayon quyidagicha: Ma’lumot yuborayotgan qurilmada ma’lumot 7-qavatdan 1-qavatgacha tushib, shu holida network orqali qabul qiluvchi qurilmaga boradi. U esa ma’lumotni 1-qavatdan qaytarib yana 7-qavatgacha olib chiqadi va ma’lumotni o’qiydi.

Har bir qavat haqida gaplashishdan oldin bu qavatlar va umuman, OSI modeli nega ishlab chiqilgan degan savolga javob topishga harakat qilamiz (axir hech narsa sababsiz ishlab chiqilmaydi, shunday emasmi?):

1. Qavatlarga ajratish natijasida yangi abstraksiyalar paydo bo’ladi. Biz ma’lum bir qavatda ishlagan vaqtda qolgan qavatlar biz uchun “shunchaki” ishlaydi. Natijada ma’lum ishni bajarish uchun butun boshli tizimni to’liq tushunish talab qilinmaydi, faqat kerakli qismni bilish yetarli bo’ladi. Masalan, TCP protocoli uchun ma’lumot kabel orqali yoki wi-fi orqali yuborilayotgani qiziq emas.

2. Butun boshli jarayonni bir-biridan mustaqil kichik qismlarga ajratish natijasida tizimning ma’lum bir qismigni modifikatsiya qilish uchun minimal o’zgartirishlar yetarli bo’ladi. Masalan, kelajakda ma’lumot uzatishning yorug’lik, elektromagnit to’lqinlariga o’xshash yangi yo’li paydo bo’lsa, bu usulni standartlash uchun faqat shu vazifaga javob beradigan qavatni o’zgartirish yetarli bo’ladi. Yoki TCP protokoliga o’zgartirish kiritilsa bu o’zgarish faqat TCP ishlaydigan qavatda bo’ladi, qolgan qavatlar har doimgidek ishlayveradi.

@boboshersnotes
👍14👎1
Layer 1 - Physical layer

Insoniyat ming yillar davomida ma’lumot saqlashning ko’plab usullarini o’ylab topgan. Rasmlar, iyerogliflar, harflar sistemasi, raqamlar sistemasi va hokazo. Lekin bizga standart, saqlash, tashish va qayta ishlash oson bo’lgan usul kerak edi. Har qanday ma’lumotni sanoq sistemasiga o’tkaza olishimiz ma’lum bo’lganidan keyin sanoq sistemasidagi belgilarni saqlash va tashish oson bo’lgan fiziologik obyektlarning har xil holatiga o’girish g’oyasi keldi. Masalan, ikkilik sanoq sistemasida 1 va 0 raqamlari bor. Bu ikki raqamni har xil usullarda represent qilishimiz mumkin: chiroq yoniq - chiroq o’chgan, ovoz bor - ovoz yo’q, tok bor - tok yo’q va hokazo. Natijada, biz ma’lumotlarni saqlash va yuborish uchun bitta standartga ega bo’ldik. Endi biz ma’lumotni qog’ozga yozib, qog’ozni kaptar orqali yuborishimiz shart emas. Ma’lumotni raqamli ko’rinishda tasvirlash mumkin bo’lgan istalgan ko’rinishda saqlaymiz va yubora olamiz: elektr, ovoz to’lqini, yorug’lik va hokazo. Muhimi, endi bizda raqamli standart bor.

OSI modelining eng pastdagi – 1-qavati biz aytgan ma’lumotni bir turdan boshqa o’tkazish uchun ishlaydi. Bu qavat yuborilayotgan ma’lumotning qurilmadagi ko’rinishi va yuborish uchun o’tkaziladigan ko’rinishi orasida ko’prik vazifasini bajaradi. Masalan, ma’lumot wi-fi orqali yuborilsa bo’lsa radioto’lqinlarga, ethernet orqali bo’lsa elektromagnetik to’lqinlarga, optik tola orqali yuborilsa yorug’lik signallari va h.k. o’tkaziladi. Yoki aksincha, shunday ko’rinishda kelayotgan ma’lumotni komputer tushunadigan ko’rinishga o’tkaziladi. Bu jarayonlarning hammasi Network Interface Card (NIC) tomonidan bajariladi.

Bu qavat ishlab chiqilishi natijasida ma’lumotlarni tarmoqqa chiqarish va qabul qilish biz - dasturchilar uchun abstrakt bo’ldi. Shu sabab endi biz har bitta dasturda ma’lumotni networkka chiqarish uchun ma’lumotni har xil ko’rinishga (elektromagnit signal, radiosignal va h.k) o’tkazish haqida o’ylamasak ham bo’ladi. Bu allaqachon yozib qo’yilgan va biz uchun “shunchaki” ishlaydi. Kelajakda ma’lumot yuborishning boshqa usullari o’ylab topilsa, o’sha usuldan foydalana olish uchun faqat shu qavatni o’zgartirish yetarli bo’ladi. Qolgan qismlar hech qanday modifikatsiya talab qilmaydi.

@boboshersnotes
👍15
Layer 2 – Data link layer

Bu qavatda aslida IP address va router tushunchasi bo’lmasa ham, yaxshiroq tushunish uchun IP addresslar haqida ham gaplashamiz.

Avvalroq kelishganimizdek IP va MAC address bir-biri bilan inoq, birga ishlaydi. Global networkda biz faqat IP address va portlar haqida gaplashsak ham, internet ishlashi uchun biz haliyam MAC addresslarga muhtojmiz. Aslida, global tarmoq orqali ma’lum qurilmaga ma’lumot yuborish uchun IP address yetarli bo’lsa ham, lokal tarmoqdagi qurilmalar bilan ma’lumot almashish uchun MAC address kerak. Biz esa iloji boricha ikki xil standartlardan qochishga harakat qilamiz. Natijada biz aslida zarur bo’lmagan holatda ham MAC address ishlatishga majbur bo’lamiz.

Endigina tandirdan uzilgan physical layerdan kelgan binary data 2-qavatda frame deb ataladigan bo’laklarga bo’lib chiqiladi. Frame bu shunchaki network orqali bir bo’lak sifatida yuborilgan ma’lumot. Hajmi odatda, 1500 byte bo’ladi, lekin tarmoq xususiyatlariga qarab o’zgaradi. Har bir frameda esa asosiy kontentdan tashqari ikkita MAC address bo’ladi: yuboruvchining MAC addressi va qabul qiluvchining MAC addressi. Ikkinchisi biz uchun juda qiziq. Sababi, kelishganimizdek MAC addresslar bilan ishlaganda biz frame faqat qabul qiluvchiga emas, balki tarmoqdagi hammaga yuboriladi. Bizning vazifamiz esa qabul qiluvchining va o’zimnizning MAC addresslarni solishtirib ko’rish orqali bu frame biz uchunmi yoki yo’q, shuni aniqlash.

Shu o’rinda savol tug’iladI: Yuboruvchi qabul qiluvchining MAC addressini qanday oldi? Yaxshi savol! Buning uchun ARP protocoli ishlab chiqilgan. Yuboruvchi frameni yuborishdan oldin ARP protocoli orqali ma’lum IP addressi egasining MAC addressi oladi va framega destination address sifatida qo’yadi. Umuman olganda, ko’p hollarda bu aynan qabul qiluvchi qurilmaning emas, shu qurilma uchun global tarmoqdagi interface sifatida ishlayotgan routerning MAC addressi bo’ladi. Router esa frameni qabul qilib olganidan keyin Local networkda ARP qilish orqali haqiqiy qabul qiluvchi qurilmaning MAC addressini topadi va framedagi destination addressni o’zgartirib, frameni local tarmoqqa tarqatadi. Natijada, qabul qiluvchi ma’lumotni oladi.

Qisqacha aytganda, OSI layer 2 ning vazifasi MAC addresslar bilan ishlash. Bu qavat natijasida biz IP yoki MAC address ishlatadigan ikki xil standartdan qochib, IP + MAC address ko’rinishidagi bitta standartga ega bo’ldik.

P.S IP address va routerlar haqida keyinroq batafsil gaplashamiz.

@boboshersnotes
👍13
Engineering Notes
IP vs MAC Yoxud birga ishlashga nima yetsin Taxminan 50 yillar oldin bitta tarmoq orqali 2 tadan ortiq qurilmalar orasida ma’lumot almashish usuli o’ylab topildi. Lekin ma’lumotni aynan kerakli qurilmaga yuborish uchun har bir qurilma uchun unikal bo’lgan…
IP qanday ishlaydi?

Yoxud “Mail service: ko’chirmachilar”

Tasavvur qiling, yer yuzida faqatgina 100 kishi yashaydi. Deylik, Amerikalik bir kishi O’zimizning Eshmatov Toshmat akaga pochta yubordi, sizning vazifangiz esa uni egasiga yetkazish. Xo’sh nima qilasiz?

Eng sodda usuli, 100 kishining har biridan birma-bir ismini so’rab chiqib Toshmat akani topish. Yaxshi g’oya, MAC addresslar aynan shu g’oya ustiga qurilgan. Bu usulning kamchiligi, bir kishiga pochta yetkazib berish jarayonida faqat Toshmat aka emas, hamma qatnashishi kerak. Lekin yerda faqat 100 kishi emas, 8 milliard kishi yashasa Eshmat akani topish uchun hammadan birma-bir ismini so’rab chiqish imkonsiz.

Katta hajmli ma’lumot orasidan kerakli ma’lumotni izlashning eng yaxshi usullaridan biri qidiruv doirasini iloji boricha toraytirishga harakat qilish. Pochta tizimlarida address “Eshmatov Toshmatga” emas, “O’zbekiston res. Toshkent shahri, Chilonzor tumani falon ko’chada turadigan Eshmatov Toshmatga” deb yoziladi.
Bunday darajalangan addresslar natijasida addressni izlash davomida qidiruv doirasi torayib boradi.
— Pochta avval Amerikadan O’zbekistonga yuboriladi. Addressda shu davlat yozilgani uchun Toshmat akani Xitoy yoki Kanadadan qidirish shart emas. Shu yerning o’zida qidiriv doirasi 8 milliarddan 35 milliongacha kamaydi.
— Pochta O’zbekistonga kelganidan keyin uni Toshmat akaga yuborish uchun Qashqadaryo yoki Sirdaryoga yuborilmaydi, Sababi Toshmat aka Toshkentda turishini bilamiz. Natijada qidiruv doirasi yana toraydi. Xuddi shunday bir-ikki bosqichdan keyin pochta egasiga yetib boradi.

IP addresslar xuddi shu g’oya asosida ishlaydi. Router packetning IP addressiga qarab qabul qiluvchining internet provideri va joylashgan xududi haqida ma’lumot oladi (joylashuv haqidagi ma’lumot ishonchli emas). Masalan, men USda joylashgan serverga ma’lumot yubormoqchi bo’lsam men yuborgan IP packetni (bu haqida keyinroq) o’qigan router aynan qaysi server ekanini bilmasa ham, paket taxminan qaysi tomonga ketishini biladi va Rossiyaning providerlari tomondagi emas, USning providerlari joylashgan tomondagi routerlarga yuboradi.

P.S. Albatta, IP packet routing bundan ko’ra juda murakkab ishlaydi, lekin asosiy g’oyashi shunga o’xshash.

@boboshersnotes
👍19
Layer 3 – Network Layer

Internet tarmog’ida ma’lumotlarni almashish uchun IP addresslar ishlatilishini biroz darajada bo’lsa-da o’rgandik. Aslini olganda, bu jarayon shunchalik murakkab-ki, uni amalga oshirish uchun butun boshli IP protocoli ishlab chiqilgan. IP protocolida ma’lumotlar IP packet deb nomlangan alohida bo’laklarda, qismlarga bo’lib yuboriliadi. IP packet ham xuddi 2-qavatdagi framega o’xshash tushuncha, faqat IP protocoli bilan ishlash uchun ishlab chiqilgan.

Router - IP packetlarni qabul qilib, boshqa routerlarga yoki qabul qiluvchi qurilmalarga yuboradigan qurilma. Marshrutkada orqada o'tirganlarning yo’lkirasini haydovchiga uzatib yuboradiganlar borku, xuddi o’shalar. Teoritik jihatdan “toza” layer 3 qurilma, lekin aslida bundan yuqori qavatlarga ham chiqadi.

IP packetlarning tezligi muhim omil bo’lgani uchun IP stateless protocol sifatida ishlab chiqildi. Lekin murakkab yetkazish jarayonida packetni nazorat qila olish ham muhim edi. Buning uchun esa ma’lum darajada state saqlanishi kerak edi. Shunda ikkala talabni ham qondira oladigan chiroyli yechim paydo bo’ldi: Packet yuboruvchi state saqlamaydi, lekin packetning o’zida metadata saqlanadi. Routerlar esa bu metadata orqali packetni nazorat qila olish imkoniyatiga ega bo’ladi. Lekin baribir ba’zida routerlar bir-biriga yoki paket yuboruvchisiga to’g’ridan to’g’ri qisqa va avvaldan kelishilgan tartibdagi ma’lumotlarni yuborishi kerak bo’ladi. Buni bajarish uchun esa ICMP protocoli ishlab chiqildi.

IP packetlarni yo’naltirish hardware tomondan ham software tomondan ham ancha murakkab jarayon. Buni tasavvur qilishingiz uchun IP protocolining software tomondagi bir nechta xususiyatlarini sanab o’taman:
— IP versiyasiga qarab yo'naltirish. Hozirda IP addresslarning ikki xil versiyasi bor. Ba'zi routerlar ikkita versiyadan faqat bittasini support qiladi.
— IP packet qancha vaqt “yashashi”ni nazorat qilish. Bu orqali agar networkdagi packet kerakli manzilni topa olmasa, tarmoqda to’xtovsiz suzib yurib, routerlardan resurs olishining oldi olinadi. Buning uchun packet headerlari ichida TTL (Time To Live) deb nomlanga header bor. Router packetni qabul qilgan vaqtda shu headerga qaraydi va agar packetning vaqti-soati yetgan belgilangan vaqti tugagan bo’lsa, uni chopadi tashlab yuboradi va uni yuborgan qurilmaga “Packet aytilgan joyga yetib bora olmadi” degan ma’noda ICMP message yuboradi.
— Bitta IP packet bitta framega sig’masa, uni bo’laklash(fragmentation). Framelardagi fragmentlardan qayta yana bitta packet tuzib olish esa ancha ish talab qiladi.

Tepada aytilganlarning hammasi ma’lumotni IP addresslar orqali internetda kerakli joyga yuborish uchun kerak. Boshqa jarayonlar bilan networkda chalkashlik kelib chiqmasligi uchun bularning hammasini OSI modelida alohida qavatga joylandi va bu qavat Network layer deb nomlandi. Natijada, tepada ko’rsatilgan murakkabliklarning hammasi abstraksiya orqasiga yashirildi va qolganlar uchun ma’lumot berilgan IP addressga “shunchaki” yetib boradi deb o’ylash imkoni paydo bo’ldi.

@boboshersnotes
👍12
Odatda, OSI protocoli eng yuqoridan boshlab o’rganiladi. Sababi, shunda butun jarayonni tasavvur qilish oson bo’ladi. Chunki masalan, 4-qavat haqida o’rganilayotganda undan pastdagi qavatlar abstrakt bo’ladi. Men esa bu safar top-down emas, bottom-up approachda yozib chiqishga harakat qilayapman. Maqsad esa internetning rivojlanish evolutsiyasini analiz qilish orqali har bir qavatning ahamiyatni o’rganish va ishlab chiqilishi uchun sabablarni ko’rib chiqish.

Agar OSI modeli haqida avval eshitmagan bo’lsangiz bu usulda sizga biroz tushunarsiz bo’lishi mumkin, lekin inshaallah oxirigacha yetib, recap qilganimizda hammasi tushunarli bo’lishni boshlaydi deb umid qilaman. Ana shundan keyin yana boshidan bir marta o’qib chiqsangiz nur ustiga a’lo nur.

@boboshersnotes
👍11
Albatta, postlarda ko’plab kamchiliklar va xatoliklar bo’layotgani aniq. Agar sizda OSI modeli haqida yetarlicha ma’lumot bo’lsa, tepada yozilgan 3 ta qavat haqida ma’lumotlarni o’qib, berilgan ma’lumotlar va ma’lumotni berish usulidagi kamchiliklar haqida feedback qoldirsangiz, juda xursand bo’lardim.
Rahmat.

P.S. Kontent foydali bo'layotgan bo'lsa tanishlarga ulashavering ))

@boboshersnotes
👍25👎1
Ba'zi katta platformalarda username tanlayotganingizda aslida mavjud bo'lmagan username kiritsangiz ham "Username already exists" deb chiqishi mumkin. Ko'p hollarda bunga sabab platforma usernameni tekshirish uchun bloom filter ishlatgani va false positive holat uchun ikkinchi darajali qidiruv ishlatilmagani sabab bo'ladi. Natijada qidiruv tezligi oshsa-da, ba'zida bir username boshqasini "to'sib" qo'yadi.

Bloom filter nima?

Agar O(1) vaqtda kiritilgan ma'lumot sizdagi ma'lumotlar to'plami ichida bor yoki yo'qligini tekshirish so'ralsa qanday yechim qilasiz? Menimcha, Joma akaning eng kuchli quroli – hashmap ishlatasiz. Lekin sizdagi ma'lumot hajmi juda kattalashib ketsa hashtable anchagina joy talab qiladi.

Bloom filter ham hash tablega o'xshash data structure, faqat ancha kam joy oladi. Buning uchun u bitta hash function o'rniga bir nechta hash function kombinatsiyasini ishlatadi. Lekin buning natijasida bloom filter probabilistic data structurega aylanadi. Ya'ni u "bor" yoki "yo'q" emas, "yo'q" yoki "bor bo'lishi mumkin" degan javoblar qaytaradi. Bor bo'lishi mumkin degani bor degani emas.

Masalan A qiymatni bloom filterga (hash functionlarga) kiritganda 1 va 2 qiymatlari qaytdi va bit arrayda shu qiymatlar "band" deb belgilandi. B qiymat esa 2 va 3 natija qaytardi. Endi 3 ham band qilindi. Keyin C ma'lumot hash functionlarga kiritilganda 1 va 3 natijalar qaytdi. Aslida oldin bunday ma'lumot kiritilmagan bo'lsa ham 1 ham 3 ham "band" bo'lgani uchun bloom filter bu ma'lumot oldindan bor degan natijani qaytaradi. Xuddi mana shu holat false positive deb hisoblanadi.

Bloom filterning eng katta kamchiliklaridan biri esa unga kiritilgan ma'lumotni o'chirib bo'lmasligida. Sababi, bit arraydagi 1 ta bitni bir nechta kiritilgan bir nechta qiymatlar har xil boshqa kombinatsiyalarda belgilagan bo'lishi mumkin. Masalan, A (1, 2) bitlarni, B (2, 3) bitlarni belgilagan. Ikkalasi ham bit 2 ni belgilagan. Agar A (1, 2) ni o'chirsa B (2, 3) ham bit 2 o'chgani sabab invalid bo'lib qoladi. Shuning uchun bloom filterga kiritilgan ma'lumotni qaytib o'chirib bo'lmaydi.
(G'oya: Browsing history uchun ishlatish kerak edi buni🙂)

@boboshersnotes
👍22
Forwarded from Abduaziz π
​​🥚 "self-hosting" kompilyatorlar 🐔

G'alati ammo deyarli barcha duch kelgan mavzu.

Cpython(yoki python)ning 65%i python'da yozilgan ekan. Typescript'ning github sahifasiga kirib ko'rsangiz, yanada g'alati holatga duch kelasiz "typescript, 100% typescript'da yozilgan" (wasssup!) Tushunganingizdek post shu jarayonni to'liq yoritishga harakat qiladi.

Mantiqan imkonsiz, X paydo bo'lmasidan avval, yangi X'ni qanday qilib X'da yozilishi mumkin? Tovuq va tuxum bekorga emasda! Lekin miyani shishirib o'ylasa buning iloji bor, misol uchun siz birinchi robot "yasovchi" robotni ishlab chiqasiz. Keyin esa u ham o'ziga o'xshagan robot "yasovchi" robotlarni ishlab chiqaveradi. Bundan esa "robot yasovchi robot, robot yasovchi robot tomonidan yasaladi" degan falsafa paydo bo'ladi☠️ Vs-Code'ning yangi talqinini, eski talqinida kod yozib ishlab chiqish mumkin-ku! Birinchi qadam muhim, birinchi robotni aynan siz yasaysiz va eski || kuchsiz narsadan foydalanib kuchliroqini ishlab chiqish mumkin. O'zini-o'zi "yoza" oladigan ya'ni "self-hosting" kompilyatorlarda ham shu holat.

Ushbu bosh og'riq uchun boshida albatta bir til kerak bo'ladi. Tasavvur qiling, shunaqangi tosh davrida yashayapsizki sizda assemblerda yozishdan boshqa chora yo'q (xuddi GM'dek). Biror loyihani 0 dan assemblerda terib chiqish, umringizni qisqartirishdan boshqasiga yaramaydi. Keyin odam bolasi ishlata oladigan til ishlab chiqmoqchi bo'lasiz. "Ojayib", lekin birozdan so'ng yeb qo'yganingizni tushunasiz. Yangi til ishlab chiqmoqchi bo'lsangiz uni yana oxirigacha assemblerda terib chiqishingizga to'gri keladi (2 15 1 30). Sizda yangi "genialniy" g'oya bor. Umringizni 5-10 yilga qisqartirib, 1-2 oy ichida tilingizni (xlang deylik) 1- talqin(=versiya) kompilyatorini assemblerda yozib chiqasiz. Bu talqin juda sodda va keyingilari uchun asos vazifasini o'tab, tilning asosiy xususiyatlari, operatsion tizim va xotira bilan ishlash ko'nikmalarini ham qanchadur miqdorda o'z ichiga olgan bo'ladi. Demak xlang-1 tayyor unda kod yozish mumkin. Endi esa xlang-1 va qisman assemblerdan foydalanib yangi xlang-2 hisoblanmish yanada kuchliroq kompilyatorni ishlab chiqasiz. Har safar avvalgi kompilyatordan foydalanganingiz sari tilingizda assemblerning ulushini 0%ga intiladi, qaysidur talqinda tilingizni 100% o'z-o'zida yozib qo'yasiz 🎉 Post boshida keltirilgan TypeScript ham avval JavaScriptda ishlab chiqilgan edi. Yuqorida izohlab o'tilgan yangi kompilyatorni, eski talqinida yozish kabi jarayonlarning barchasi bootstraping deb nomlanadi.

Shaxsan, bu texnikani ko'pchilik bilgan ikki soqolli "brat"lar ko'proq qo'llagan deb bilaman. Ken Thompson bir kun B tilini ishlab chiqgan. Sintaksis biroz sodda, hisob-kitoblarga yaraydigan yaxshi til bo'lgan. Ammo Dennis Ritchie "brat"iga qarab UNIXni oxirigacha assemblerda terib chiqsang soqoling ichkariga qarab o'sadi, kel undan ko'ra xotira & "temir mashina" bilan ishlay oladigan til ishlab chiqaylik degan (sarkazm). So'ng, B'dan foydalanib C'ni yaratib qo'yishgan. Ammo C'ning o'rtada kichkina relizi bo'lganki aynan o'sha kompilyatordan foydalanib, ushbu ketma-ketlik asosida yangi kompilyatorlar yozilib borgan. Ushbu texnika odamzotni qanday muammolardan saqlab qolganini shunchaki tasavvur qilib ko'ring.

Sizda savol paydo bo'lishi mumkin, python C'ga, C esa self-hosting yoki boshqa balo-battarlarga, hammasi esa assemblerga asoslangan bo'lsin ammo assemblerning o'zichi ?! Javob: assembler 0 va 1 larga asoslangan. Ha, siz u vaqtda yuqoridagidek "xitrilik"(bootstraping, self hosting ...) qila olmas edingiz va MASHINA KODIda🔥 yozishga shunchaki majbur bo'lgansiz. Ammo keyingi versiyalarida "xitrilik" ishlatilgan ya'ni assembler-2 uchun, assembler-1dan foydalanishgan ... Savolni 0 va 1 larga nisbatan qo'llaydigan bo'lsak, 0 va 1 larning kelib chiqishi elektronika va mikroprotsessorlarga borib taqaladi.

Mavzu juda keng, keyinroq albatta T-diagrammalarini o'rganing(shu yordamida tushunganman). Asosiy savolingizga javob topgan bo'lsangiz xursandman.

Foydali deb bilsangiz yaqinlaringizga ulashing.

@AbduazizPy
👍17
Layer 4 – Transport layer

Va nihoyat butun OSI modelining yuragi bo’lgan transport layerga yetib keldik. Bu qavatda aslida juda ko’p narsa sodir bo’ladi, lekin ular asosan 2 ta muammoni yechishga yo’naltirilgan. Hozir shu ikki muammoni sabablari bilan ko’rib chiqishga harakat qilamiz.

1. Kompyuter qurilmalari rivojlanishi natijasida bitta komputerda bir vaqtda bir nechta dastur ishlashi imkoni tug’ildi. Bu esa networkingda yangi muammoni yuzaga chiqardi. Ma’lumotni tarmoqdagi qaysi qurilma yuborgani va qaysi qurilmaga yuborilayotganini ko’rsatish uchun biz IP addresslardan foydalangandik. Endi bu yetarli bo’lmay qoldi. Endi manzilda qurilmaning o’zini ko’rsatishdan tashqari shu qurilmadagi qaysi dastur yuborayotgani yoki qaysi dasturga yuborilayotganini ham ko’rsatish kerak bo’ldi. Sababi, bitta qurilmada bir vaqtda bir nechta dastur internetdan foydalanayotgan bo’lishi mumkin. Bu dasturlarga kelayotgan ma’lumotlar bir-biri bilan aralashib ketmasligi kerak, axir Telegramga kelishi kerak bo’lgan ma’lumotingiz Youtubega kelishini xohlamasangiz kerak?

Natijada portlar tushunchasi paydo bo’ldi. Portlar shunchaki bitta qurilmadagi har xil sonlar bilan belgilangan bir dunyo (aniqrog’i, 65536 ta) kirish eshiklari. Masalan, Telegram 8000 raqamli eshikdan ma’lumot yuboradi va qabul qiladi. Youtube esa 9000 raqamli eshikdan foydalanadi. Natijada, bitta komputerda ikkita dastur bir-biriga halaqit bermagan holatda internetdan foydalana oladi.

2. Network layer ma’lumotlarni yetkazib berishga xizmat qilsa ham u to’laqonli transport mexanizmi sifatida xizmat qila olmas edi, sababi uning imkoniyatlari juda kam edi. U xuddi g’ildirakka o’xshaydi. Bir o’zi to’la transport bo’la olmaydi, lekin transportlarning asosini tashkil qiladi. Mashina ham, mototsikl ham, avtobus ham g’ildiraklar ustida yuradi, lekin imkoniyatlari, narxi va vazifasiga ko’ra farq qiladi. Masalan, mashina qulay, ishonchli, lekin qimmat. Avtobus arzon lekin shu bilan birga noqulay va sekinroq. Mototsikl esa tez, nisbatan arzon lekin ishonchsiz.

@boboshersnotes
👍10
Xuddi shu jarayon internet bilan ham bo’ldi. Ba’zida yetkazish tezligidan ko’ra ishonchlilik muhim, ba’zida esa tezlik muhim bo’lib ishonchlilik ikkinchi o’ringa tushadi. Bunday har xil talablarni bitta transport mexanizmi orqali hal qilib bo’lmas edi. Shuning uchun ishlashi va ishlatilish o’rni bir-biridan farq qiladigan 2 ta alohida transport mexanizmi – transport qavatidagi protocollar ishlab chiqildi:

— UDP. Yetkazish tezligiga qaratilgan protocol. Lekin yetkazib berishni kafolatlamaydi. Stateless protocol, ya’ni yuboruvchi qurilmada tarmoqqa chiqqan datagram (UDP protocolidagi ma’lumot uzatish birligi) haqida ma’lumot bo’lmaydi. U kerakli joyga yetib bordimi yoki yo’lda adashib qoldimi yoki qayergadir tiqilib qoldimi bundan xabari yo’q. Ma’lumotni tarmoqqa chiqardi va bo’ldi, uning ishi tugadi. Tez, lekin ishonchsiz.

— TCP. Yetkazish sifatiga qaratilgan protocol. Ma’lumotni yetkazib berish kafolatlanadi, lekin UDPdan ko’ra ancha sekin ishlaydi. Stateful protocol, ya’ni yetkazuvchi qurilma tarmoqqa chiqib ketgan segment(TCP protocolidagi ma’lumot uzatish birligi)ning holatidan xabardor bo’lib turadi. TCP ma’lumot yetkazilishini ta’minlash uchun juda ehtiyotkor (xuddi viloyatdan Toshkentga ketgan farzandi yetib borgunicha 8 marta telefon qiladigan ota-onalarga o’xshaydi). Ma’lumot yuborishdan oldin yuboruvchi qabul qiluvchi bilan bog’lanib, ikkala tomon kelishib oladi (bu connection hisoblanadi). Keyin ma’lumotlarni yuborish davomida ham yuboruvchi qabul qiluvchidan tashqari o’rtadagi routerlardan ham hol-avhol so’rab turadi (router bir vaqtda ko’p ma’lumot olsa hazm qila olmay, mazasi qochib qolishi mumkin). Zarur bo’lsa, ma’lumot yuborish tezligini oshiradi yoki kamaytiradi. Har bir borgan ma’lumotni qabul qiluvchidan tasdiqlatib oladi. Agar ma’lumotning bir qismi qabul qiluvchiga yetib bormasa, qaytadan yuboradi. Qisqasi, TCP anchagina ish qiladi. Lekin bu asosiy mavzu bo’lmagani uchun batafsil to’xtalmaymiz.

Xullas, transport layerda ma’lumot yetkazish uchun har xil imkoniyatlarni beradigan transport protocollari ishlaydi. Bundan oldingi 3 ta qavatdan ajralib turadigan jihati, oldingi 3 ta qavat hamma uchun bir xil edi. Shu yerdan boshlab esa bitta qavatda sodir bo’ladigan ishlar tanlangan protocolga qarab farq qiladi. Shu yerdan boshlab bizda yana o’sha klassik tezlik yoki sifat tanlovi bor. Shuning uchun ham bu qavat OSI modelidagi eng asosiy qavat hisoblanadi. Albatta, yana portlar ham bor.

@boboshersnotes
👍13
Bugun Leetcodeda mana bu masalani yechib ko’rayotganda qiziqib, linear search ishlatib ko’rdim. Albatta, bu eng oddiy va effektivligi past yechim edi, lekin shu yechim orqali qanday natija olishni ko’rmoqchi edim.
Qizig’i, runtime 91% submissionlardan yaxshiroq chiqdi.
Menimcha, ko’pchilik fancy yechim qilaman deb aslida eng oddiy yechimdan ham yomon yechim qilib qo’ygan, yana bilmadim.
👍10
Wanna buy me a coffee? Here you go:
5614681916480936

P.S. Tirikchilik ))
👍25😁22😢5
Bir muammoni yechishning ko'plab usullari bor. Ular tezlik va effektivlikdan tashqari muammoga yondoshuv jihatidan ham bir-biridan farq qiladi. Ba'zi yechimlar qo'pol, muammoni "tekislab" tashlaydigan bo'ladi. Ba'zilari esa nozik va chiroyli yechim bo'ladi.

Masalan, Floyd's cycle (yoki Tortoise and Hare) algorithmiga e'tibor bering. Boshida foydalanish uchun oson, lekin qanday ishlashi biroz abstrakt ko'rinadi. Lekin algorithmning ortidagi g'oyani tushunganingizdan keyin qoyil qolasiz. Oddiy matematika yordamida ishlangan san'at asari.

P.S. Afsuski ko'pchilikka muammoga qanday yondoshish emas, yechimdan qanday foydalanish qiziq.
👍27
There are only two hard things in Computer Science: cache invalidation and naming things.

© Phil Karlton
😁24👍3
Agree?
😁14👍7😢2