Bosh sahifa Wiki Buffer

Buffer

Buffer — ma’lumotni bir komponentdan boshqasiga uzatish jarayonida vaqtincha saqlaydigan xotira hududi. U ishlab chiqaruvchi va iste’molchi turli tezlikda ishlaganda oqimni muvofiqlashtiradi.

Buffer operativ xotira, qurilma xotirasi, kernel xotirasi yoki application ichidagi data structure ko‘rinishida bo‘lishi mumkin.

Tarmoq, disk, audio, video, fayl va stream processing tizimlarida buffer keng qo‘llanadi.

Asosiy vazifa

Ma’lumot ishlab chiqaruvchi komponent consumerdan tezroq bo‘lsa, buffer vaqtincha ortiqcha ma’lumotni saqlaydi.

Misol:

  • network adapter packetlarni tez qabul qiladi;
  • application ularni navbat bilan qayta ishlaydi;
  • receive buffer paketlarni vaqtincha ushlab turadi.

Buffer bo‘lmasa, tezlikdagi kichik farq ham data lossga olib kelishi mumkin.

Input va output buffer

Input buffer

Qabul qilinayotgan ma’lumotni saqlaydi.

Misollar:

  • keyboard input;
  • socket receive buffer;
  • file read buffer;
  • audio capture buffer.

Output buffer

Yuboriladigan ma’lumotni vaqtincha saqlaydi.

Misollar:

  • stdout buffer;
  • socket send buffer;
  • disk write buffer;
  • printer queue.

Buffering

Bufferdan foydalanish jarayoni buffering deb ataladi.

Buffering:

  • system call sonini kamaytiradi;
  • kichik yozuvlarni katta blokka birlashtiradi;
  • disk va tarmoq throughputini oshiradi;
  • kechikishdagi qisqa o‘zgarishlarni yutadi;
  • producer va consumer ishini ajratadi.

Biroq buffer ma’lumotning darhol yetib bormasligiga sabab bo‘lishi mumkin.

Full buffering

Full-buffered output buffer to‘lganda yoki explicit flush chaqirilganda yoziladi.

Faylga output berishda keng tarqalgan.

Afzalligi — katta blok bilan samarali I/O.

Kamchiligi — dastur crash qilsa bufferda qolgan ma’lumot yozilmasligi mumkin.

Line buffering

Line-buffered output newline kelganda flush qilinadi.

Terminalga yozishda ko‘p ishlatiladi.

Pipeline yoki faylga redirect qilinganda runtime full bufferingga o‘tishi mumkin. Shu sababli terminalda darhol ko‘ringan output pipe ichida kechikishi mumkin.

Unbuffered I/O

Har amal darhol pastki qatlamga uzatiladi.

Debugging yoki real-time holatda qulay, ammo ko‘p system call sabab sekinroq bo‘lishi mumkin.

“Unbuffered” deb atalgan qatlam ostida operatsion tizim yoki qurilma baribir buffer ishlatishi mumkin.

Flush

Flush — buffer ichidagi ma’lumotni keyingi qatlamga majburan uzatish.

Masalan:

  • file bufferini kernelga yozish;
  • stdoutni terminalga chiqarish;
  • network streamni yuborish;
  • compressor holatini yakunlash.

Flush ma’lumot diskning fizik yuzasiga yozilganini har doim anglatmaydi. Kernel page cache va qurilma cache alohida bo‘lishi mumkin.

Ring buffer

Ring buffer fixed-size aylana massivdan iborat.

Head va tail pointerlar buffer bo‘ylab aylanadi.

Afzalliklari:

  • xotira qayta ajratilmaydi;
  • queue uchun qulay;
  • real-time tizimlarda predictable;
  • producer-consumer oqimi uchun mos.

Buffer to‘lganda yangi data rad etilishi yoki eski data ustiga yozilishi mumkin.

Double buffering

Ikki buffer navbatma-navbat ishlatiladi.

Masalan:

  1. GPU birinchi frame’ni ekranga chiqaradi.
  2. Application ikkinchi bufferda yangi frame tayyorlaydi.
  3. Bufferlar almashtiriladi.

Bu ekrandagi tearingni kamaytirishga yordam beradi.

Audio va I/O tizimlarida ham qo‘llanadi.

Triple buffering

Uch buffer GPU va display o‘rtasidagi kutishni kamaytirishi mumkin.

Biroq qo‘shimcha buffer input latency va xotira sarfini oshiradi.

Network buffer

Socket uchun kernel send va receive buffer saqlaydi.

Receive buffer to‘lsa:

  • UDP packet tashlanishi;
  • TCP advertised window kichrayishi;
  • sender vaqtincha sekinlashishi

mumkin.

Send buffer application yozgan, ammo hali tarmoqqa uzatilmagan ma’lumotni saqlaydi.

Bufferbloat

Juda katta network queue congestion paytida packetlarni uzoq kutdiradi.

Natija:

Bu bufferbloat deb ataladi.

Active Queue Management va to‘g‘ri queue limitlari muammoni kamaytiradi.

Disk buffer

Operatsion tizim disk o‘qish va yozishni page cache orqali bufferlaydi.

Write tez tugagandek ko‘rinadi, ammo data hali RAMda bo‘lishi mumkin.

fsync yoki platformaga mos amal data’ni storage’ga barqaror yozishni so‘raydi.

Elektr uzilishida volatile cache’dagi data yo‘qolishi mumkin.

Audio buffer

Audio application sample’larni buffer bilan uzatadi.

Buffer kichik bo‘lsa:

  • latency past;
  • CPU vaqtida ishlamasa click va dropout.

Buffer katta bo‘lsa:

  • barqarorlik yuqori;
  • input-output kechikishi katta.

Professional audio tizimlarda buffer hajmi workloadga mos tanlanadi.

Video buffer

Streaming player bir necha soniyalik video ma’lumotni oldindan yuklaydi.

Network tezligi qisqa vaqt pasaysa ham playback davom etadi.

Buffer tugasa rebuffering yuz beradi.

Katta buffer start vaqtini va live stream latency’sini oshiradi.

Producer-consumer

Producer bufferga data qo‘shadi, consumer oladi.

Synchronization vositalari:

Bounded buffer backpressure beradi. Unbounded buffer xotira tugashiga olib kelishi mumkin.

Buffer overflow

Dastur ajratilgan buffer chegarasidan tashqariga yozsa, buffer overflow yuz beradi.

Natijalar:

  • ma’lumot buzilishi;
  • crash;
  • code execution;
  • stack yoki heap corruption.

Himoya:

  • uzunlik tekshiruvi;
  • safe API;
  • memory-safe til;
  • stack canary;
  • sanitizer;
  • fuzzing.

Buffer underflow

Consumer data tayyor bo‘lishidan tezroq o‘qisa underflow yuz beradi.

Audio underflow — tovush uzilishi, video underflow — playback to‘xtashi.

Yechim — katta buffer, tezroq producer yoki adaptiv oqim.

Buffer va cache farqi

Buffer data uzatish tezligini muvofiqlashtiradi.

Cache esa keyin yana kerak bo‘lishi mumkin bo‘lgan data nusxasini saqlaydi.

Bir xil memory region ayrim tizimda ikkala vazifani qisman bajarishi mumkin, ammo tushunchalar boshqa.

Diagnostika

Buffer bilan bog‘liq muammoda:

tekshiriladi.

Buffer kattalashtirish har doim to‘g‘ri yechim emas; u muammoni yashirib, kechikishni oshirishi mumkin.

Bog‘liq tushunchalar

Buffering, Flush, Ring buffer, Double buffering, Queue, Cache, Buffer overflow, Buffer underflow, Backpressure, Bufferbloat