/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Non-blocking IO og lokale filer
Fra : Christoffer H.-Frede~


Dato : 05-03-02 14:04


Kan det virkelig passe, at man på en *NIX-kasse ikke kan lave non-blocking IO
til en fil? Man kan på en fifo eller en socket.

--
   Christoffer

 
 
Kent Friis (05-03-2002)
Kommentar
Fra : Kent Friis


Dato : 05-03-02 15:02

Den Tue, 5 Mar 2002 13:04:11 +0000 (UTC) skrev Christoffer H.-Frederiksen:
>
>Kan det virkelig passe, at man på en *NIX-kasse ikke kan lave non-blocking IO
>til en fil? Man kan på en fifo eller en socket.

Det giver normalt ikke mening med non-blocking IO til en fil.

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/ - Ny tegning uploadet.

Claus Rasmussen (05-03-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 05-03-02 15:12

Kent Friis wrote:

> Den Tue, 5 Mar 2002 13:04:11 +0000 (UTC) skrev Christoffer H.-Frederiksen:
>>
>>Kan det virkelig passe, at man på en *NIX-kasse ikke kan lave non-blocking
>>IO til en fil? Man kan på en fifo eller en socket.
>
> Det giver normalt ikke mening med non-blocking IO til en fil.

Jo det gør. Databaser bruger det i stor stil. Dog kombineret med en
absolut blocking skrivning til databasens log.

Async-io som er på vej ind i 2.5 kernen (hvis den ikke allerede er der)
er netop beregnet på dette (læs: Oracle). RedHat har også lavet en
speciel udgave af deres 6.2 distribution med non-blocking io.

For at svare på Christoffers spørgsmål, så tror jeg, at non-blocking io
findes på de fleste større kommercielle un*x'er - i hvert fald Sun.

-Claus

Kent Friis (05-03-2002)
Kommentar
Fra : Kent Friis


Dato : 05-03-02 16:11

Den Tue, 05 Mar 2002 15:11:41 +0100 skrev Claus Rasmussen:
>Kent Friis wrote:
>
>> Den Tue, 5 Mar 2002 13:04:11 +0000 (UTC) skrev Christoffer H.-Frederiksen:
>>>
>>>Kan det virkelig passe, at man på en *NIX-kasse ikke kan lave non-blocking
>>>IO til en fil? Man kan på en fifo eller en socket.
>>
>> Det giver normalt ikke mening med non-blocking IO til en fil.
>
>Jo det gør. Databaser bruger det i stor stil. Dog kombineret med en
>absolut blocking skrivning til databasens log.
>
>Async-io som er på vej ind i 2.5 kernen (hvis den ikke allerede er der)
>er netop beregnet på dette (læs: Oracle). RedHat har også lavet en
>speciel udgave af deres 6.2 distribution med non-blocking io.

Jeg forstår ikke helt det samme ved non-blocking IO, som ved async-io.
Ved non-blocking IO forstår jeg filer der er åbnet med O_NONBLOCK, altså
at en læsning returnerer med det samme, uanset om der er data eller ej.
Fx. kunne man vente på data med select(), og så lave en read på 1024
bytes, og read vil så returnere de 25 bytes der lå klar, i stedet for
at vente på de sidste 999 bytes, som ikke er leveret endnu. *Det* giver
ikke mening til filer.

Ved async-io forstår jeg at man beder system foretage en læsning, og så
arbejder programmet videre. Programmet får så fx. et signal, når data
er indlæst, eller man har et wait()-lignende kald, så programmet kan
behandle data når de er indlæst.

Ved skrivning kan jeg ikke se den store fordel i nogen af delene, da
data alligevel bare ender i RAM, medmindre man bruger O_SYNC (som netop
bliver brugt til bl.a. database-loggen).

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/ - Ny tegning uploadet.

Claus Rasmussen (05-03-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 05-03-02 17:02

Kent Friis wrote:

> Jeg forstår ikke helt det samme ved non-blocking IO, som ved async-io.
> Ved non-blocking IO forstår jeg filer der er åbnet med O_NONBLOCK, altså
> at en læsning returnerer med det samme, uanset om der er data eller ej.

Right. Jeg havde blandet det sammen med un-buffered io.

I øvrigt fandt jeg lige /svaret/ til Christoffer (i hvert fald hvad
linux angår):

http://www.uwsg.iu.edu/hypermail/linux/kernel/9903.3/0347.html

[...]

> Ved async-io forstår jeg at man beder system foretage en læsning, og så
> arbejder programmet videre. Programmet får så fx. et signal, når data
> er indlæst, eller man har et wait()-lignende kald, så programmet kan
> behandle data når de er indlæst.

Dér er vi enige.


> Ved skrivning kan jeg ikke se den store fordel i nogen af delene, da
> data alligevel bare ender i RAM, medmindre man bruger O_SYNC (som netop
> bliver brugt til bl.a. database-loggen).

Man vil bruge async-io i stedet for O_SYNC. Ideen er, at der ikke er
nogen mening i at databasen står og venter på at recorden skrives til
loggen, når det, den behøves at vide, blot er /hvornår/ den skrives, så
den kan markere transaktionen for afsluttet.

Du kan forestille dig, at den skal skrive 3 records til loggen og 3
records til tabellerne (der ligger hvert sit sted på disken). Hvis vi kører
med O_SYNC vil rækkefølgen være

skriv til tabel
skriv til log
(vent 10 ms)
skriv til tabel
skriv til log
(vent 10 ms)
skriv til tabel
skriv til log
(vent 10 ms)

Altså mindst 30 ms. Med async-io bliver det i stedet:

skriv til log
skriv til tabel
skriv til log
skriv til tabel
skriv til log
skriv til tabel
(sync og vent 10 ms på notification hvis den ikke allerede er
kommet)

Altså helt op til 20 ms sparet.

-Claus


Søg
Reklame
Statistik
Spørgsmål : 177512
Tips : 31968
Nyheder : 719565
Indlæg : 6408599
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste