William Sandqvist Databuffer Omvandlar mellan olika storlekar på dataobjekt Anpassar mellan olika dataöverföringshastigheter Databuffer vid dataöverföring
William Sandqvist Buffertminnet är en ring En cirkulär buffer är som ett dataminne. Tar adresserna slut, börjar det om från början, dvs. slår runt – som vägmätaren på en bil
William Sandqvist C-funktioner void Putbuffer(char c) { buffer[tail] = c; if (tail == LENGTH) tail = 0; else tail++; } char Getbuffer(void) { char c; c = buffer[head]; if (head == LENGTH) head = 0; else head++; return c; }
William Sandqvist C-testprogram #include #define LENGTH 3 void Putbuffer(char); char Getbuffer(void); char buffer[LENGTH]; int head = 0; int tail = 0; int main(void) { Putbuffer('1'); Putbuffer('2'); Putbuffer('3'); Putbuffer('4'); Putbuffer('5'); printf("LENGTH = %d\n", LENGTH); printf("%c\n", Getbuffer()); system("PAUSE"); return 0; }
William Sandqvist LENGTH 3 eller 6 ?
William Sandqvist Buffertens storlek bufferten måste vara rätt dimensionerad, dvs talet LENGTH måste vara tillräckligt stort om ”tail” hinner upp ”head” blir det overflow overflow kan accepteras vid tex video och musik, men i allmänhet måste man ta hand om overflow tex. genom att ”stoppa” Putbuffer() eller ”dynamiskt öka” LENGTH
William Sandqvist Anpassa dataöverföringshastigheter Modem med buffer 56 Kbps Dator systembuss 400 Mbps Bufferten ger interrupt när den blir full och stoppar dataöverföringen från datorn Datorn kan göra annat nyttigt när överföringen stoppats
William Sandqvist Bufferstorlekens påverkan Bufferstorleken påverkar antalet Interrupt/Context switch. Ryms hela datamängden i bufferten blir det inga interrupt! (64 kByte buffer)
William Sandqvist Sifferexempel: Buffer Size = 4B ( Burd, table 6-4) Antag att datamängden 64 Kbyte (65536) ska överföras över en 32 bitars buss, dvs. med 4 Byte /T BUS /4 = T BUS Med Buffer Size 4 Byte blir det ett Off och ett On avbrott efter var fjärde överförd byte! Operativsystemet gör då ”Context switch” för att processorn ska kunna göra annat. Vi antar att detta tar 10 busscykler, 10 T BUS. (65536/4)*(10+10) = T BUS Totalt: = T BUS !
William Sandqvist Buffer Size = 1024 Byte ( Burd, table 6-4) Samma datamängd 64 Kbyte (65536) ska överföras över en 32 bitars buss, dvs. med 4 Byte /T BUS /4 = T BUS Bufferstorleken ökas nu till 1024 Byte. Det blir ett Off och ett On avbrott efter var 1024 överförd byte! Antag att ”Context switch” som tidigare tar 10 T BUS. (65536/1024)*(10+10) = 1280 T BUS Totalt: = T BUS ! Förbättring med 95%!