Node.js-da buferni yaxshiroq tushunishni xohlaysizmi? Buni tekshiring.

rasm manbai

Siz Node.js-da bufer, oqim va ikkilik ma'lumotlarga o'xshash so'zlarni uchratganingizda, men kabi har doim mendan shubhalanasizmi? Bu tuyg'u sizni tushunishga to'sqinlik qilyaptimi, chunki ular siz uchun emas, faqat Node.js guruslari va paketlarini ishlab chiquvchilar tushunishi kerakmi?

Haqiqatan ham, bu so'zlar juda qo'rqinchli bo'lishi mumkin, ayniqsa siz Node.js bilan veb-ishlab chiqishga CS darajasiz kirganingizda.

Afsuski, ko'plab o'quv qo'llanmalar va kitoblar Node.js to'plamlari bilan veb-ilovalarni qanday yaratishni o'rgatishga to'g'ri keladi, bu sizga Node.js-ning asosiy xususiyatlarini va nima uchun mavjudligini tushunishga imkon bermaydi. Va kimdir sizga ularni tushunmasligingiz kerakligi haqida ochiqchasiga aytadi, chunki siz ular bilan bevosita ishlamasligingiz mumkin.

To'g'ri, agar siz Node.js o'rtacha dasturchisida qolishni tanlasangiz, ular bilan hech qachon to'g'ridan-to'g'ri ishlamasligingiz mumkin.

Ammo, agar sirlar sizni chindan ham qiziqtirsa va siz qiziquvchanligingizni qondirish uchun hech narsa to'xtamasangiz va Node.js tushunchangizni keyingi darajaga olib chiqishni istasangiz, unda ko'pgina asosiy xususiyatlarni tushunish uchun chuqurroq qazishni xohlaysiz. masalan, bufer kabi Node.js. Va shuning uchun men ushbu qismni yozyapman - bizga ba'zi xususiyatlarni buzib tashlash va Node.js-ni keyingi bosqichga olib chiqishga yordam berish uchun.

Buferni kiritishda rasmiy Node.js hujjatlari qisman aytiladi ...

... ikkilik ma'lumotlarning oqimlarini o'qish yoki boshqarish mexanizmi. Bufer sinfi Node.js API-ning bir qismi sifatida TCP oqimlari va fayl tizimining operatsiyalari kabi narsalar kontekstida oktet oqimlari bilan o'zaro aloqada bo'lish uchun taqdim etilgan.

Hmmm, agar siz yuqoridagi jumlalardagi barcha so'zlarni oldindan bilmasangiz, ehtimol ular shunchaki bir jargon. Buni biroz tushirish orqali soddalashtirishga harakat qilaylik, shunda biz aniq diqqatni jamlay olamiz va u erdagi ko'plab qo'ng'iroqlar va hushtaklar chalg'itmasligimiz mumkin. Ushbu kirish so'zidan chiqarib, biz ishonch bilan aytishimiz mumkin:

Bufer sinfi Node.js API-ning bir qismi sifatida, ikkilik ma'lumotlarning oqimlarini boshqarish yoki o'zaro ishlashga imkon berish uchun kiritilgan.

Endi bu to'g'rimi? Ammo ... bufer, oqimlar, ikkilik ma'lumotlar ... hali ham ko'p katta so'zlar. Xo'sh, keling, bu katta so'zlarni oxirgisidan birinchisiga qadar echishga harakat qilaylik.

Ikkilik ma'lumotlar, bu nima?

Ehtimol, siz allaqachon kompyuterlar ma'lumotlarni ikkilik shaklida saqlashini va namoyish etishini bilasiz. Ikkilik bu shunchaki to'plam yoki 1s va 0s to'plamidir. Masalan, quyidagilar besh xil ikkilik, besh xil 1 va 0s to'plam:

10, 01, 001, 1110, 00101011

Ikkilikdagi har bir raqam, har bir to'plamdagi har bir 1 va 0 bit deb nomlanadi, bu ikkilik digIT-ning qisqa shakli.

Ma'lumotni saqlash yoki taqdim qilish uchun kompyuter ushbu ma'lumotni ikkilik vakillikka o'zgartirishi kerak. Masalan, 12 raqamini saqlash uchun kompyuter 12-ni 1100 ga teng ikkilik vakillikka aylantirishi kerak.

Qanday qilib kompyuter bu konversiyani amalga oshirishni biladi? Xo'sh, bu toza matematik. Bu biz asosiy matematikada o'rgangan oddiy ikkitomonlama raqamlar tizimi - bazani-2 raqamli tizimida raqamni ifodalash. Kompyuterlar bu matematikani tushunishadi.

Ammo raqamlar biz ishlaydigan yagona ma'lumot turi emas. Shuningdek, bizda satrlar, rasmlar va hatto videolar mavjud. Kompyuterlar barcha turdagi ma'lumotlarni ikkilikda qanday aks ettirishni bilishadi. Masalan, satrlarni olaylik. Qanday qilib kompyuter "L" satrini ikkiliklarda aks ettiradi? Ikkilamchi har qanday belgini saqlash uchun, kompyuterlar avval ushbu belgini raqamga, so'ngra uning raqamini ikkilik ko'rinishida o'zgartiradilar. Shunday qilib, "L" satri uchun kompyuterlar avval L ni L raqamiga o'zgartiradi.

Brauzeringiz konsolini oching va quyidagi kod parchasini qo'ying va Enter tugmachasini bosing: "L" .charCodeAt (0). Siz nimani ko'rdingiz? 76 raqami? Bu raqam vakili yoki Belgilar kodi yoki L belgining kod nuqtasi. Ammo kompyuter har bir belgini aniq raqam nimani anglatishini qaerdan biladi? L ni ifodalash uchun 76 raqamini ishlatishni qanday biladi?

Belgilar to'plamlari

Belgilar to'plamida har bir belgi aniq raqamni ko'rsatadigan qoidalar allaqachon mavjud. Bizda ushbu qoidalarning turli xil ta'riflari mavjud. Eng mashhurlari orasida Unicode va ASCII mavjud. Unicode belgilar to'plamlari bilan JavaScript juda yaxshi ishlaydi. Aslida, brauzeringizdagi Unicode-da 76 harfini L belgisi ko'rsatishi kerakligi aytilgan.

Shunday qilib, biz kompyuterlar raqamlarni belgilarni qanday aks ettirishini ko'rdik. Endi kompyuter, o'z navbatida, 76 raqamini o'zining ikkilik ko'rinishida aks ettiradi. O'ylashingiz mumkin, yaxshi, shunchaki 76 ni tayanch-2 raqamli tizimiga aylantirish kifoya. Bu qadar tez emas!

Belgilarni kodlash

Qaysi raqamni belgini ko'rsatishi kerakligini belgilaydigan qoidalar mavjud bo'lgani kabi, bu raqamni ikkilikda qanday aks ettirishni belgilovchi qoidalar ham mavjud. Xususan, sonni ifodalash uchun qancha bit ishlatilishi kerak. Bunga Belgilarni kodlash deyiladi.

Belgilarni kodlash uchun ta'riflardan biri UTF-8. UTF-8 belgilar baytlar bilan kodlanishi kerakligini aytadi. Bayt - bu sakkiz bitning to'plami - sakkiz 1s va 0s. Shunday qilib, ikkilikda har qanday belgining Code Point-ni ifodalash uchun sakkiz 1 va 0-lar ishlatilishi kerak.

Buni tushunish uchun, yuqorida aytib o'tganimizdek, 12 raqamining ikkilik vakili 1100 ga teng. Shunday qilib, UTF-8 12 sakkiz bit bo'lishi kerakligini aytganda, UTF-8 kompyuter chap tomonga ko'proq bit qo'shishi kerakligini aytmoqda. haqiqiy tayanch-2 ning 12 raqamini bayt qilish uchun. Shunday qilib, 12 00001100 sifatida saqlanishi kerak.

Shuning uchun, 76 raqami 01001100 sifatida saqlanishi kerak.

Bu mening do'stlarim, kompyuterlar simlarni yoki belgilarni ikkilikka qanday saqlashni anglatadi. Xuddi shunday, kompyuterlarda rasmlar va videolarni aylantirish yoki kodlash va ikkilik shaklida saqlash bo'yicha qoidalar ham mavjud. Gap shundaki, kompyuterlar barcha turdagi ma'lumotlarni ikkiliklarda saqlaydi va bu ikkilik ma'lumotlar deb nomlanadi.

Agar siz Belgilarni kodlashning bema'niligi bilan qiziqsangiz, sizga ushbu yumshoq va batafsil kirishni yoqtirishi mumkin.

Endi biz ikkilik ma'lumotlar nima ekanligini tushunamiz, ammo buferga kirishimizdan ikkilik ma'lumotlarning oqimlari nima?

Oqim

Node.js-dagi oqim shunchaki vaqt o'tishi bilan bir nuqtadan boshqasiga o'tkaziladigan ma'lumotlar ketma-ketligini anglatadi. Butun tushuncha shundan iboratki, sizda juda ko'p miqdordagi ma'lumotni qayta ishlash kerak, ammo uni qayta ishlashni boshlashdan oldin barcha ma'lumotlarning mavjud bo'lishini kutishingiz shart emas.

Asosan, bu katta ma'lumotlar parchalanadi va bo'linmalarga yuboriladi. Shunday qilib, buferning dastlabki ta'rifidan ("ikkilik ma'lumotlarning oqimlari ... fayl tizimi kontekstida") shunchaki fayl tizimida ikkilik ma'lumotlarning ko'chirilishini anglatadi. Masalan, file1.txt-da saqlangan matnlarni file2.txt-ga ko'chirish.

Qanday qilib bufer oqimli uzatishda ikkilik ma'lumotlari bilan ishlashga yoki ularni boshqarishga yordam beradi? Bu tampon btw nima o'zi?

Tampon

Ma'lumotlar oqimi bu ma'lumotlarning bir nuqtadan boshqasiga o'tishini ko'rdik, ammo ular qanday aniq ko'chiriladi?

Odatda ma'lumotlarning harakati odatda uni qayta ishlash yoki o'qish yoki unga asoslangan qarorlar qabul qilish niyati bilan amalga oshiriladi. Ammo bu vaqt talab qilishi mumkin bo'lgan ma'lumotlarning minimal va maksimal miqdori mavjud. Shunday qilib, agar ma'lumotlarning uzatilish tezligi ma'lumotni iste'mol qilish tezligidan tezroq bo'lsa, ortiqcha ma'lumotlar qayta ishlashni kutish uchun biron bir joyda kutish kerak.

Boshqa tomondan, agar jarayon ma'lumotlarni kelishiga qaraganda tezroq iste'mol qilsa, oldinroq kelgan ozgina ma'lumotlar qayta ishlashga yuborilishidan oldin ma'lum miqdordagi ma'lumotlarning kelishini kutishlari kerak.

Bu "kutish maydoni" bufer! Bu sizning kompyuteringizdagi kichik bir joy, odatda RAMda, vaqtincha ma'lumotlar to'planadi, kutiladi va oxirida oqim paytida qayta ishlash uchun yuboriladi.

Biz butun oqim va tampon jarayonini avtostantsiya deb o'ylashimiz mumkin. Ba'zi avtovokzallarda, ma'lum miqdordagi yo'lovchilar yetib kelguniga qadar yoki muayyan jo'nash vaqtiga qadar avtobusga yo'l qo'yilmaydi. Shuningdek, yo'lovchilar turli vaqtlarda turli xil tezlikda kelishlari mumkin. Yo'lovchilar va avtovokzal bekatlarning bekatda bo'lishini nazorat qila olmaydi.

Qanday bo'lmasin, oldinroq kelgan yo'lovchilar avtobus bekati avtobusni yo'lga qo'yishga qaror qilguncha kutishlari kerak. Avtobus allaqachon yuklanayotgan paytda yoki avtobus allaqachon jo'nagan paytda kelgan yo'lovchilar keyingi avtobusni kutishlari kerak.

Qanday bo'lmasin, har doim kutish joyi mavjud. Bu Node.js uchun bufer! Node.js ma'lumotlar tezligi yoki vaqtini, oqim tezligini boshqarolmaydi. Faqat ma'lumotlarni yuborish vaqti kelganda qaror qabul qilishi mumkin. Agar hali vaqt bo'lmasa, Node.js ularni tamponga qo'yadi - "kutish joyi" - operativ xotirada kichik joy, ularni qayta ishlashga jo'natish vaqti kelguncha.

Internetda videoni uzatishda siz tamponni ko'rishning odatiy misoli. Agar sizning Internet aloqangiz etarlicha tez bo'lsa, oqim tezligi buferni tezda to'ldirib, uni qayta ishlash uchun yuborish uchun etarli bo'ladi, keyin boshqasini to'ldirib, uzatadi, keyin yana birini va boshqasini ... oqimgacha tugadi.

Ammo agar sizning ulanishingiz sust bo'lsa, kelgan birinchi ma'lumot to'plamini ko'rib chiqqandan so'ng, video pleer yuklash belgisini ko'rsatadi yoki "buferlash" matnini ko'rsatadi, bu ko'proq ma'lumot to'plashni yoki ko'proq ma'lumot kelishini kutishni anglatadi. Va bufer to'ldirilgan va ishlov berilgandan so'ng, pleer ma'lumotlarni, videoni ko'rsatadi. Uni o'ynashda, ko'proq ma'lumotlar kelishni davom etadilar va tamponda kutib turadilar.

Agar pleer oldingi ma'lumotlarni qayta ishlayotgan yoki o'ynatgan bo'lsa va bufer hali to'ldirilmagan bo'lsa, qayta ishlash uchun qo'shimcha ma'lumot to'plashni kutib, "buferlash" matni yana paydo bo'ladi.

Bu bufer!

Tamponning asl ta'rifidan, buferda bo'lganda, biz uzatilayotgan ikkilik ma'lumot bilan ishlay olishimiz yoki o'zaro ishlashimiz mumkin. Ushbu boshlang'ich ikkilik ma'lumotlar bilan qanday o'zaro aloqa qilishimiz mumkin? Node.js-da buferni bajarish bajariladigan narsalarning to'liq ro'yxatini taqdim etadi. Keling, ulardan ba'zilarini ko'rib chiqaylik.

Bufer bilan o'zaro ishlash

O'zingizning buferingizni yaratish ham mumkin! Oqim paytida avtomatik ravishda yaratiladigan bitta Node.js-dan tashqari, o'zingizning buferingizni yaratish va boshqarish mumkin. Qiziqarli huquqmi? Qani yarataylik!

Siz erishmoqchi bo'lgan narsaga qarab, buferni yaratishning turli xil usullari mavjud. Keling, bir oz ko'rib chiqaylik.

// 10 o'lchamdagi bo'sh bufer yarating.
// Faqat 10 baytni sig'dira oladigan bufer.
const buf1 = Buffer.alloc (10);
// Tarkibi bilan bufer yarating
const buf2 = Buffer.from ("salom bufer");

Tamponingiz yaratilgandan so'ng, siz u bilan aloqani boshlashingiz mumkin

// Tampon tuzilishini ko'rib chiqing
buf1.toJSON ()
// {turi: 'Bufer', ma'lumotlar: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
// bo'sh bufer
buf2.toJSON ()
// {turi: 'Bufer',
     ma'lumotlar: [
       104, 101, 108, 108, 111, 32, 98, 117, 102, 102, 101, 114
     ]
   }
// toJSON () usuli ma'lumotlarni simvollarning Unicode Kod Ballari sifatida taqdim etadi
// Tampon hajmini ko'rib chiqing
buf1.length // 10
buf2.length // 12. Yaratilganda dastlabki tarkibga qarab avtomatik tayinlanadi.
// Buferga yozish
buf1.write ("Bufer haqiqatan ham qoyil!")
// Tamponni dekodlash
buf1.toString () // 'Bufer rea'
// oops, chunki buf1 atigi 10 baytdan iborat bo'lganligi sababli, qolgan belgilar joylashtirilishi mumkin emas
// Ikki tamponni solishtiring

Tampon bilan o'zaro aloqalarimiz juda ko'p. Ushbu usullar bilan ko'proq o'ynash uchun rasmiy hujjatlarga o'ting.

Va nihoyat, men sizga bir oz qiyinchilikni qoldiraman: Node.js-ning asosiy kutubxonalaridan biri bo'lgan zlib.js manbasini o'qib chiqing, ikkilik ma'lumotlarning oqimini boshqarish uchun bufer quvvatini qanday ishlatishini bilib oling. Bu gziped fayllar bo'lib chiqadi. O'qiganingizda, o'rgangan narsalaringizni hujjatlang va sharhlarda bu erda biz bilan baham ko'ring.

Ushbu kirish Node.js Buferni yaxshiroq tushunishingizga yordam berdi deb umid qilaman.

Agar siz o'zimni yaxshi ish qildim va boshqalar buni ko'rish imkoniyatiga ega bo'lganday his qilsangiz, bizning Node.js hamjamiyatida bufer haqida yaxshiroq tushunchani tarqatish uchun maqolani diqqat bilan tinglang.

Agar sizda biron bir javob berilmagan savol bo'lsa yoki siz ba'zi fikrlarni tushunmagan bo'lsangiz, bu erda yoki Twitter orqali sharh qoldirishingiz mumkin.