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 ;)