Hva er forskjellen mellom buffere og bufrede kolonner i / proc / meminfo-utgang?


Svar 1:

I / O-operasjoner har ofte høye latenser; tiden mellom igangsetting av en I / O-prosess og dens fullføring kan være millioner av prosessorklokke-sykluser. Det meste av denne latenstiden skyldes selve maskinvaren; informasjon kan for eksempel ikke leses fra eller skrives til en harddisk før spinningen av disken fører målsektorene direkte under lese / skrivehodet. (I skrivende stund er 7200 RPM-harddisker normen, så denne prosessen kan ta opp til rundt 8 millisekunder å fullføre.) Når inngangs- / utgangsenheten er et nettverksgrensesnitt, er ventetiden vanligvis større ennå.

Dette lindres ved å ha en eller flere inngangs- og utgangsbuffere tilknyttet hver enhet. Selv om et program bare vil lese en blokk med data fra en enhet, kan driveren hente den blokken pluss flere av blokkene umiddelbart etter den på disken, og lagre disse i minnet, fordi programmer ofte får tilgang til disken i rekkefølge, noe som betyr at neste blokkering programmet vil be om, er sannsynligvis den neste fysiske blokken på disken. Når den faktisk gjør det, kan driveren, i stedet for å utføre en annen fysisk lesning på disken, ganske enkelt returnere den blokken (som er lagret i minnet), og dermed redusere ventetiden dramatisk. Når det blir bedt om skriver til disk, kan driveren ganske enkelt buffe dataene i minnet til den har samlet nok datablokker, på hvilket tidspunkt den skriver dem på en gang; dette kalles å spyle ut outputbufferen, eller synkronisere. Sjåføren vil normalt gi et middel til å be om at data blir skyllet umiddelbart, i stedet for å bufres. Dette må for eksempel gjøres før enheten fjernes fra systemet (skulle det tilfeldigvis være flyttbare medier, for eksempel en optisk plate), eller når systemet slås av.

På et operativsystem med flere oppgaver blir maskinvareenheter kontrollert av kjernen, og brukerplass-applikasjoner får ikke direkte tilgang til dem. Av denne grunn krever å utføre I / O utføre systemanrop, som av forskjellige årsaker innfører overhead. Dette overhead er vanligvis i størrelsesorden mikrosekunder i stedet for millisekunder, så bruk av buffering her er ikke avgjørende for programmer som utfører en relativt liten mengde I / O, men utgjør en stor forskjell for applikasjoner som er I / O-bundet (noe som betyr at de bruker mesteparten av tiden sin på å vente på at I / O skal fullføres, i stedet for å utføre beregning som ville blitt fortgang om CPU-en var raskere).

Således vil nesten hvert program skrevet på et høyt nivå programmeringsspråk ha sine egne I / O-buffere (vanligvis en inndatabuffer for hver fil eller enhet som programmet ønsker å lese fra, og en utbuffer for hver den vil skrive til ). Disse bufferne kan være mye større enn de som vedlikeholdes av driverne på lavt nivå, og de finnes på et høyere abstraksjonsnivå, ettersom de er assosiert med filhåndtering eller filbeskrivelsesobjekter.