Avatar billede mxs Nybegynder
04. april 2009 - 14:36 Der er 7 kommentarer og
1 løsning

Asynkront I/O kald. Hvordan sker dette?

Hej eksperten

Da jeg er ved at se lidt nærmere på asynkront I/O kald, har jeg et spørgsmål som jeg er lidt i tvivl, så jeg håber at der er en her der kan svare.
Først lidt baggrundsinformation. Hvis vi antager at jeg starter en process. Denne process opretter en tråd, som laver forskellige opgaver, men den rammer lige pludselig ind i et read, lad os sige fra keyboardet. Dette gør den synkront, altså tråden ryger i en blokeret tilstand og må vente at den får noget data. Dette er selvfølgelig en dårlig måde at gøre det på da tråden ikke kan arbejde videre, så derfor vælger jeg at den skal lave det non-blocking, altså asynkront, men hvordan sker dette? Spawner denne tråd så en ny tråd, som så ryger hen i I/O køen og venter, så tråden som lavede et read, kan køre videre? Denne tråd kan så på en eller anden måde blive gjort opmærksom på at den spawnede tråd har returneret, og derefter hente det data?
Jeg ved ikke om keyboardet er et dårligt eksempel.

Håber at høre fra en eller anden, for det har naget mig her de sidste 24 timer.
Avatar billede arne_v Ekspert
04. april 2009 - 16:25 #1
Det er et lidt generelt spørgsmål, som i nogen grad er platform specifikt.

Men jeg vil sige nej for de gængse platforme.

Et asynkront kald tester for om der er noget i en buffer der vedligeholdes af device driver og hvis der ikke er det så afslutter det øjeblikkeligt.
Avatar billede mxs Nybegynder
04. april 2009 - 17:08 #2
Ok. Den spawner ikke en ny tråd, men den overlader det så til kernen at tjekke og give tilbage kald? Jeg ved godt at jeg snakker meget generelt. Vil også gerne bare gerne have retningslinierne.
Avatar billede arne_v Ekspert
04. april 2009 - 22:07 #3
Når IO faktisk sker, så vil kernen/device-driver/whatever læse input og anbring det i en buffer. Det non-blocking kald checker så bare om der er noget i den buffer.
Avatar billede mxs Nybegynder
05. april 2009 - 16:53 #4
Okay. På den måde. Hvis der ikke er noget i bufferen så kører den videre. Det kan jeg godt se. Ved blocking så venter den altså på at bufferen bliver fyldt. Denne buffer ligger så i userspace?
Avatar billede arne_v Ekspert
05. april 2009 - 17:05 #5
Ved blocking venter den typisk til at der er mindst 1 byte i bufferen.

Jeg vil tro at den original buffer ligger i system space, men data kan godt blive kopieret til userspace i forbindelse med et kald. Typisk vil et kald nemlig bestå af nogle runtime library kald i user mode og så nogle system kald bagved. Og der kan godt ske en kopiering af data system buffer->runtime library buffre->appplikations buffer.
Avatar billede mxs Nybegynder
05. april 2009 - 18:21 #6
Jeg troede bare at et asynkront kald ventede til at bufferen var fyldt op/over nogle bytes, og derefter gjorde processen opmærksom på at den har noget data. Men da dette er generelt så kan jeg godt se at det er lidt svært at give et specifikt svar.
Nuvel. Smid et svar, for jeg har fået nogenlunde klargjort det jeg søgte!!
Avatar billede arne_v Ekspert
05. april 2009 - 23:29 #7
De fleste blocking API'er kræver kun 1 byte (undtagen dem som kræver en linie - men de bliver jo oversat til en while løkke som læser indtil der er en hel linie).

Og svar.
Avatar billede segmose Nybegynder
07. april 2009 - 23:48 #8
Hvorfor rammer den ind i et read? det må være fordi den skal bruge inputtet ellers ville den vel ikke stå der?

Hvis det kun er en del opgave kan man jo lave en tråd til den.
Hvis det er meningen at der skal laves noget arbejde hele tiden men at man skal kunne interagere med det må man aflæse om der er nogen der vil noget en gang imellem og så nytter det ikke at have en lang løkke der ikke spørger en gang imellem.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester