Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Simple client.c i server.c?

[es] :: C/C++ programiranje :: Simple client.c i server.c?

Strane: 1 2

[ Pregleda: 9574 | Odgovora: 27 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Simple client.c i server.c?03.09.2002. u 17:18 - pre 263 meseci
Citat:
Predrag Damnjanovic:
Code:

    while (1)
    {
        // accept connections
        newsock = sockaccept(pfs_sock);
        if (newsock < 0)
        {
            perror("sockaccept");
            exit(1);
        }
        pthread_create(&tid, NULL, (void*) &pfs_thread, (void*) newsock);
    }




Peco, ja se polomih da objasnim da ovaj pristup ne valja. Da budem precizniji, može lepo da radi sa malim brojem zahteva, ali kod većeg saobraćaja dolazi do naglog pada performansi.

Ono što ti predlažem (Linux varijanta) je:
1. Kreiraš socket koji "sluša" port 80
2. Kreiraš jedno 5 niti (ili forkuješ 5 procesa, kako ti je lakše) i svaki od njih zove accept () na isti onaj socket koji si kreirao pod 1). Dakle, pthread_create zoveš samo na početku programa. Svaka od ovih niti (procesa) obrađuje po jedan korisnikov zahtev, a onda opet zove accept() i to je baci u "usnulo stanje" dok ne stigne sledeći klijent.


 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Simple client.c i server.c?03.09.2002. u 17:55 - pre 263 meseci
Peco legendo, demantovanje je ovde sasvim DOBRODOSLO :) Ja volim ako mi neko ukaze na gresku. Ali takve sitne stvari... :)

Citat:

P.S. Leko, nisam hteo nista lose, izvini ako si pomislio da sam hteo da te demantujem.

 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.041net.co.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Simple client.c i server.c?03.09.2002. u 20:18 - pre 263 meseci
Citat:
Dragi Tata:
Citat:
Predrag Damnjanovic:
Code:

    while (1)
    {
        // accept connections
        newsock = sockaccept(pfs_sock);
        if (newsock < 0)
        {
            perror("sockaccept");
            exit(1);
        }
        pthread_create(&tid, NULL, (void*) &pfs_thread, (void*) newsock);
    }




Peco, ja se polomih da objasnim da ovaj pristup ne valja. Da budem precizniji, može lepo da radi sa malim brojem zahteva, ali kod većeg saobraćaja dolazi do naglog pada performansi.


Tata, naglasio sam 'i digne (ili probudi vec uspavani) thread".
Nebitno je za ovu diskusiju da li otvaram thread pri svakoj konekciji ili budim uspavani thread.
Zamisli da imam 5 threada koji spavaju, i da ih pri novoj konekciji samo budim - i prepustam im komunikaciju sa novim klijentom.
Kako onda f-ja accept moze da probudi sve procese?
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Simple client.c i server.c?03.09.2002. u 20:43 - pre 263 meseci
OK, Peco, nisam te razumeo najbolje. Ako radiš tako kako si ti napisao (glavna nit čeka na accept i po potrebi "budi" neku od niti koje spavaju), onda zaista nećeš imati problema sa thundering herd-om. Međutim, u praksi se ne radi tako (opet zbog performansi), već svaka od tih "uspavanih" niti direktno zove accept (odnosno, često select, pa tek posle accept, ali to je nebitno za ovu priču) za isti socket. Kada stigne klijent, kod nekih Unixoida (među njima je i Linux 2.2) će se desiti da se sve te niti "probude" u isto vreme, a ne samo jedna.

Pogledaj malo http://httpd.apache.org/docs/misc/perf-tuning.html#compiletime

ili još bolje fajl http_main.c iz Apache servera.
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.beograd-3.tehnicom.net

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: Simple client.c i server.c?03.09.2002. u 20:51 - pre 263 meseci
Citat:
Dragi Tata:
Međutim, ovo rešenje ne važi za sve Unixoide: kod nekih od njih bi se desilo da se probude sve niti (procesi) koji zovu accept i onda nastaje problem koji se popularno naziva thundering herd, a kod nekih verzija će aplikacija jednostavno da "pukne". Više detalja možete naći u knjizi koju sam gore pomenuo.


Pa nista, specijalno u principu radi se o jednoj kriticnoj sekciji(CS).

CS(nemoj neko da mi je pomislio da je rec o counter stike-u :) ) je deo programa u kojem sme da bude samo jedan proces, ukoliko se u tom delu programa nadju dva ili vise procesa kola krecu nizbrdo, ovim problemom bavili su se ljudi pocetkom 60 tih godina proslog veka. Unutar Sys V interprocesne komunikacije postoje semafore, koje regulisu pristup kriticnim sekcijama(man semop). S tim sto su semafore malo uopstenje kriticne sekcije jer dozvoljavaju da ogranicite broj procesa koji sme da udje istovremeno u kriticnu sekciju.

za detalje oko semafora pogledajte (man semop). Medjutim ukoliko vas UNIX ne podrzava semafore kao sistemski poziv uvek mozete umesto semafore da ekskluzivno kreitrate datoteke i na taj nacin kontorlisete ko moze da udje a ko mora da saceka. Uz primere koje sam na pocetku poslao pogledajte program shmchat.c jer se u tom primeru koriste semafore. (gde P; u programu oznacava ulazak u kriticnu sekciju a V; izlazak iz kriticne sekcije)

e pa da se vratimo na nas accpet, posto on na neki nacin moze da se smatra kriticnom sekcijom svesto bi trebalo uraditi jeste
P
accept
V

i stvar je resena, ukoliko neko pokusa da udje u kriticnu sekciju dok ona nije slobodna, taj proces se "zaspati" i probuiti se kada bude bio moguc ulazak u kriticnu sekciju.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Simple client.c i server.c?04.09.2002. u 12:35 - pre 263 meseci
Ima jedna stvar u prici o Apache web serveru koja nikome izgleda nije pala na pamet - Apache nije najbrzi web server ljudi. Postoje mnogo brzi od njega. Na stranu to sto je najpopularniji, ali najbrzi definitivno nije.

Drugo, na Apache 2.0.x su radili mnogo vise na optimizaciji za Windows platformu nego na optimizaciji za ostale sisteme, izgleda da im je namera da totalno dokrajce sve ostale web servere za Windows , specijalno IIS koji je smesan u poredjenju sa Apache web serverom.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.rcub.bg.ac.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Simple client.c i server.c?04.09.2002. u 13:09 - pre 263 meseci
Citat:
Dragi Tata:
već svaka od tih "uspavanih" niti direktno zove accept (odnosno, često select, pa tek posle accept, ali to je nebitno za ovu priču) za isti socket. Kada stigne klijent, kod nekih Unixoida (među njima je i Linux 2.2) će se desiti da se sve te niti "probude" u isto vreme, a ne samo jedna.

E sad je jasno Tata
Zahvaljujem na odgovoru.
Zahvaljujem i NULL-u za objasnjenje kako organizovati semafore u multi-thread aplikacijama.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Simple client.c i server.c?04.09.2002. u 17:23 - pre 263 meseci
Citat:
Dejan Lozanovic:

e pa da se vratimo na nas accpet, posto on na neki nacin moze da se smatra kriticnom sekcijom svesto bi trebalo uraditi jeste
P
accept
V


Tako je. Upravo to rešenje koristi Apache kod sistema koji "pate" od thundering herd problema. Međutim, ako pogledaš onaj link koji sam ostavio na tekst o thundering herd-u pod Linux-om, videćeš kolika je razlika u performansama kad se radi na način koji si opisao u poređenju sa rešenjem ugrađenim u kernel koje omogućava da se accept zove neserijalizovano.

 
Odgovor na temu

[es] :: C/C++ programiranje :: Simple client.c i server.c?

Strane: 1 2

[ Pregleda: 9574 | Odgovora: 27 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.