/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Deadlock på sockets
Fra : Morten Winther


Dato : 30-03-03 00:39

Hej

Jeg er godt i gang med min socket bog samt hvad jegf kan finde på nettet.

Jeg har nu læst om hvordan deadlock opstår, men ikke rigtig kunen finde en
forklaring på hvordan man undgår dette. I min bog står der at man skal undgå
at sende samtidigt i begge retninger, men det kan ligesom ikke lade sig gøre
i praksis (f.eks. i en chat).

Nogen har har en praktisk forklaring/læsning?


--
/ morten

"There are only 10 types of people in the world: Those who understand
binary, and those who don't"



 
 
Socketd (30-03-2003)
Kommentar
Fra : Socketd


Dato : 30-03-03 00:59

On Sun, 30 Mar 2003 00:38:40 +0100, Morten Winther wrote:

> Jeg er godt i gang med min socket bog samt hvad jegf kan finde på
> nettet.
>
> Jeg har nu læst om hvordan deadlock opstår, men ikke rigtig kunen finde
> en forklaring på hvordan man undgår dette. I min bog står der at man
> skal undgå at sende samtidigt i begge retninger, men det kan ligesom
> ikke lade sig gøre i praksis (f.eks. i en chat).
>
> Nogen har har en praktisk forklaring/læsning?

select()

mvh
socketd

Morten Winther (30-03-2003)
Kommentar
Fra : Morten Winther


Dato : 30-03-03 01:06


"Socketd" <db@traceroute.dk> skrev i en meddelelse
> > Nogen har har en praktisk forklaring/læsning?
>
> select()

Så vidt jeg kan læse mig frem til kan deadlock godt fremkomme selv om du
bruger select.

Tænker du ikke på at man kan undgå blocking med select?

/ morten




Socketd (30-03-2003)
Kommentar
Fra : Socketd


Dato : 30-03-03 01:17

On Sun, 30 Mar 2003 01:05:53 +0100, Morten Winther wrote:

> Så vidt jeg kan læse mig frem til kan deadlock godt fremkomme selv om du
> bruger select.
>
> Tænker du ikke på at man kan undgå blocking med select?

Som du skrev, har deadlock noget at gøre med at begge parter venter på
svar fra hinanden. Den bedste måde at løse dette er ved at aftale hvem der
siger noget hvornår. Du gav et eksempel med en chat, her skal du bruge
select(), så hvis forbindelsen er inaktiv i X antal minutter (fordi
ingen skriver), vil forbindelsen timeout (hvilket du også fanger med
select()).

mvh
socketd

Soren Davidsen (30-03-2003)
Kommentar
Fra : Soren Davidsen


Dato : 30-03-03 10:28

Socketd <db@traceroute.dk> writes:

[snip]
> > Tænker du ikke på at man kan undgå blocking med select?
>
> Som du skrev, har deadlock noget at gøre med at begge parter venter på
> svar fra hinanden. Den bedste måde at løse dette er ved at aftale hvem der
> siger noget hvornår. Du gav et eksempel med en chat, her skal du bruge
> select(), så hvis forbindelsen er inaktiv i X antal minutter (fordi
> ingen skriver), vil forbindelsen timeout (hvilket du også fanger med
> select()).

Dvs. du kan fortaelle select hvor laenge du vil vente paa at der
sker noget paa en af de registrerede handles. Hvis intet sker
lukker forbindelsen ikke, men du kan vaelge at haandtere det som
timeout.

Det er heller ingen der siger at du skal bruge select(), det er
kun et foreslag. Du kan ogsaa bruge traade eller fork() og have
en laeser og en skriver.

Der burde ikke vaere noget i 'sockets' som er kan give deadlocks,
naermere i protokollen du impl. ovenpaa - men giv gerne et eksempel
der viser det modsatte .


Mvh,

--
___
Soren Davidsen / o\
Math student, ICSMA (_____)
__ http://www.tanesha.net/ _________________________________(___)_______

Morten Winther (30-03-2003)
Kommentar
Fra : Morten Winther


Dato : 30-03-03 10:31


"Soren Davidsen" <soren200303@tanesha.net> skrev i en meddelelse
news:874r5lyzju.fsf@tanesha.net...

> Det er heller ingen der siger at du skal bruge select(), det er
> kun et foreslag. Du kan ogsaa bruge traade eller fork() og have
> en laeser og en skriver.
>
> Der burde ikke vaere noget i 'sockets' som er kan give deadlocks,
> naermere i protokollen du impl. ovenpaa - men giv gerne et eksempel
> der viser det modsatte .

I min bog beskrives det at hvis de 2 buffers SendQ og RecvQ størrelse er
mindre end størrelsen på det send() kaldes med, så vil send() ikke returnere
før der er plads nok i RecvQ hos modtageren. Dog kalder modtageren ikke recv
fordi den selv står og venter på en den anden buffer bliver ledig.

Hmm. Det er lidt svært at forklare. Men kan det så ikke blot løses ved at
lave en buffer der altid er stor nok?

/ morten




..



Socketd (30-03-2003)
Kommentar
Fra : Socketd


Dato : 30-03-03 10:45

On Sun, 30 Mar 2003 12:31:06 +0200, Morten Winther wrote:

> I min bog beskrives det at hvis de 2 buffers SendQ og RecvQ størrelse er
> mindre end størrelsen på det send() kaldes med, så vil send() ikke
> returnere før der er plads nok i RecvQ hos modtageren. Dog kalder
> modtageren ikke recv fordi den selv står og venter på en den anden
> buffer bliver ledig.
>
> Hmm. Det er lidt svært at forklare. Men kan det så ikke blot løses ved
> at lave en buffer der altid er stor nok?

Dette løses ved at lave non-blocking sockets (i samarbejde med select()).

br
socketd

Morten Winther (30-03-2003)
Kommentar
Fra : Morten Winther


Dato : 30-03-03 12:33

"Socketd" <db@traceroute.dk> skrev i en meddelelse

> > Hmm. Det er lidt svært at forklare. Men kan det så ikke blot løses ved
> > at lave en buffer der altid er stor nok?
>
> Dette løses ved at lave non-blocking sockets (i samarbejde med select()).

Ok, var blot ikke sikker på om man kunne bruge non-blocking sammen med
select.

/ morten




Byrial Jensen (30-03-2003)
Kommentar
Fra : Byrial Jensen


Dato : 30-03-03 20:19

Morten Winther <mail@is.invalid> skrev:

> Ok, var blot ikke sikker på om man kunne bruge non-blocking sammen med
> select.

Det kan man, men select vil netop fortælle hvilke sockets som kan
kaldes uden at blokere så det er ikke nødvendigt at bruge
ikke-blokerende sockets med select.

Se i øvrigt også på poll som kan circa det samme som select.

Socketd (30-03-2003)
Kommentar
Fra : Socketd


Dato : 30-03-03 20:28

On Sun, 30 Mar 2003 22:19:00 +0200, Byrial Jensen wrote:

> Det kan man, men select vil netop fortælle hvilke sockets som kan kaldes
> uden at blokere så det er ikke nødvendigt at bruge ikke-blokerende
> sockets med select.

Ikke helt korrekt. Hvis du med select() undersøger om en socket kan
skrives til vil du få et "ja" hvis modtagerens window-size er < 0 (det er
nok mere end 0 i praksis), men du ved ikke om modtagerens window-size er
mindre end det du ønsker at sende, og dermed kan du ikke vide om den vil
blokke.

mvh
socketd

Socketd (30-03-2003)
Kommentar
Fra : Socketd


Dato : 30-03-03 10:48

On Sun, 30 Mar 2003 12:27:33 +0200, Soren Davidsen wrote:

> Dvs. du kan fortaelle select hvor laenge du vil vente paa at der sker
> noget paa en af de registrerede handles. Hvis intet sker lukker
> forbindelsen ikke, men du kan vaelge at haandtere det som timeout.

Jep, men vil TCP ikke også selv timeout på et tidspunkt?

> Det er heller ingen der siger at du skal bruge select(), det er kun et
> foreslag. Du kan ogsaa bruge traade eller fork() og have en laeser og en
> skriver.

Ja, hvis man fork()'er en process til hver klient, så går en deadlock kun
ud over den enkelte bruger, men i exsemplet med en chat vil dette være
overhead (meget endda).

mvh
socketd

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408193
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste