2010-10-10 12 views
0

J'ai découvert que l'accès aux fichiers natifs n'a pas d'état "non bloquant". (Je suis correct?)Accès aux fichiers natifs non bloquants - démon à un seul thread dans C?

J'ai été googling pour les démons qui sont "non-bloquants", et j'ai trouvé un qui a réalisé ce comportement en enfilant des opérations d'accès aux fichiers, de sorte que le démon ne bloque pas .

Ma question est, ne pas threading et IPC de telles opérations être plutôt coûteux? cela ne serait-il pas plus logique de: A) Pool de pré-thread, il suffit à chaque client d'avoir un thread et de le laisser bloquer pour les opérations dont il pourrait avoir besoin. B) En cas de blocage d'accès au fichier, utilisez un tampon relativement petit, de cette façon il bloque toujours - mais on supposera qu'un tampon minuscule pour plusieurs opérations aurait plus de sens que de payer le prix de l'enfilage de chaque opération et IPC-il?

+0

On utilise généralement les bibliothèques C disponibles sur le système utilisé. Pour l'accès au fichier 'non-bloquant', ceci est normalement fait avec 'select',' poll', 'epoll', etc. Les ressources disponibles dépendent du système/de l'exécution C. –

+0

Etes-vous sûr que c'est une option pour les fichiers natifs? (pas FIFO, ni Sockets). Malheureusement, je ne trouve rien de lié, si vous pouvez partager une référence spécifique, serait très apprécié! –

+0

Ce n'est pas une option pour les fichiers ordinaires, sélectionner/interroger signale toujours que ces fichiers sont toujours lisibles/toujours accessibles en écriture. – nos

Répondre

0

Si vous utilisez l'enfilage, un petit en-tête IPC est nécessaire. Vous avez le même espace mémoire pour tous vos threads, donc un simple mutex ou sémaphore peut être tout ce dont vous avez besoin. Maintenant, si vous bloquez un mutex ou un sémaphore trop longtemps ou trop souvent, pourquoi utiliser des E/S asynchrones en premier lieu? En ce qui concerne le calcul effectué par les threads faisant des E/S, ils attendent que le noyau les réveille la plupart du temps, donc je ne m'inquiéterais pas.

Si votre application doit tourner autour de la lecture de fichiers et d'autres sources d'E/S, vous pouvez lire les modèles de Reactor et la programmation événementielle.

En outre, vous avez mentionné un démon et le service des clients. Si le service que vous fournissez lit des fichiers, le coût de calcul d'un nouveau thread pour servir chaque client est minime, puisque chaque thread prendra "long" pour compléter les requêtes, et bloquer la plupart du temps quand même. Il y a peut-être un problème de mémoire si le nombre de vos clients est de plusieurs milliers, mais sinon, je pense que vous vous débrouillerez bien. Donnez-nous un peu plus de détails sur ce que vous voulez faire, peut-être qu'il y a des façons plus simples.

+0

http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf - cette référence a un contexte à ma question. Je suppose que l'exécution d'un démon HTTP monothread aurait du sens, mais si vous payez un thread pour chaque opération d'accès au fichier - alors je ne vois pas le point. Qu'est-ce que je rate? Pourquoi ont-ils choisi ce chemin? –