Citation:
Envoy� par
Neckara
Le thread d'administration �coute sur un port diff�rent de celui utilis� pour les connexions normales, ceci permet d'ajouter un l�ger plus en mati�re de s�curit�. En plus comme il est prioritaire sur celui de connexion, cela permet de se connecter en admin plus facilement si le serveur commence d�j� � saturer.
Je ne suis pas s�re que la priorit� changera grand chose si ton serveur sature ^^. Mais c'est vrai que c'est une id�e int�ressante.
Citation:
J'utilise la SFML 2.0 avec les selecteurs donc les selects sont d�j� pris en compte dedans. Par contre pour ne pas utiliser d'op�rations bloquantes, est-ce que tu inclus aussi les mutex ? Dans un contexte multithreads je serais bien oblig� d'en utiliser.
Ce que j'inclus, ce sont toutes les op�rations bloquantes d�pendantes des clients (pour ne pas qu'un client monopolise un thread par une quelconque action). Donc, � priori, les mutex n'en font pas partie vu que c'est de la gestion interne.
Citation:
Mon serveur de test est mono-coeur il me semble (je n'ai pas envie de payer un vrai serveur pour le moment). Quand je devrais aller vers des performances plus �lev�es, je suppose que le serveur aura entre 4 et 8 coeurs, je pense donc que 8 threads actifs est corrects (au pire je d�fini une variable de param�tre "nombre de thread").
Oui g�n�ralement on passe le nombre de thread en param�tre au serveur.
Citation:
En effet, c'est bien les priorit�. Qu'est-ce que l'inversion des priorit�? Je dois avouer que j'en ai jamais entendu parler.
L'inversion de priorit� n'est qu'un probl�me, �a arrive dans la situation o� on a 3 threads � 3 niveaux (niveau 1 le plus bas disons):
* Le thread de niveau 1 prend un mutex ;
* Le thread de niveau 3 demande le mutex (ne peut pas car d�j� pris) ;
* Le thread de niveau 2 s'ex�cute pendant un temps plus ou moins long --> le thread de niveau 1 ne peut plus s'ex�cuter car il est de niveau trop bas et celui de niveau 3 ne s'ex�cute pas non plus car il n'a pas le mutex et pourtant il est de plus haute priorit� !
Comme tu vois c'est sp�cifique � un cas. Je ne suis pas s�r que jouer avec les priorit�s soient une bonne id�e d�s le d�part, mais pourquoi pas.
Citation:
Je pensais plut�t �tablir deux sockets par client, un pour le jeux et un pour le tchat par exemple. Avec un thread pour g�rer x clients au niveau du jeux et un thread pour g�rer x clients au niveau du tchat. Mais avec ta solution des r�dacteur/consommateur, cette question n'a plus lieu d'�tre^^
Oui, en fait l'id�e c'est d'organiser le serveur par t�che � effectuer et non par client.
Citation:
Mais les autres qui ne font rien risquent � tout moment de faire quelque chose et ainsi saturer le serveur.
Ils ne satureront pas plus le serveur qu'un nouvel arrivant ! Le serveur "sature" lorsque le pool de thread ne travaille pas assez vite et que la file P/C grandit.
Citation:
La solution serait de g�rer une "pile" de connexions, si le serveur sature, on d�connecte le dernier connect�. On peut ainsi avertir d�s la connexion les joueurs qu'ils sont sur une connexion "instable" si il y a d�j� plus de X joueurs connect�s.
Par contre comment d�tecter le moment de saturation?
Je ne suis pas s�r que d�connecter le dernier soit une bonne id�e, je pense que le mieux serait de refuser les nouvelles connections.
Pour savoir si on sature, tu peux par exemple regarder � quelle vitesse la file se remplit et � quelle vitesse elle se vide, avec sa taille actuel tu devrais �tre capable d'imposer des limites. La limite pourrait simplement �tre un malloc qui �choue.
Citation:
Merci pour ta r�ponse et tes pr�cieux conseils, je commence � y voir un peu plus clair maintenant :ccool:
EDIT : tu parles de pool de threads, j'aimerais �tre s�r d'avoir bien compris ce que tu me dit :
1 producteurs : un thread lisant les sockets.
X consommateurs : threads bloqu�s par un s�maphore dans qu'il n'y a rien � consommer.
Lisant et acceptant les connexions + �ventuellement autres t�ches bloquantes.
Pour les consommateurs, un s�maphore � 1 jeton suffit, donc un mutex, plus les conditions qui vont bien.
Je viens de penser que tu peux �ventuellement lire ou faire d'autres choses "bloquantes" dans le pool de thread en mettant un timeout de 0 (donc �a ne sera pas bloquant, mais le thread risque de ne pas avoir toutes les informations n�cessaires et il faudra alors remettre le buffer dans la file, ce qui peut provoquer indirectement une boucle active : imaginons qu'il n'y ait que une t�che qui ne se compl�te pas car le client ne r�pond pas (par exemple) : les threads du pool prendront et remettrons sans arr�t). --> Ce n'est donc pas une bonne id�e ;)