7
votes

Écriture de fichier avec écriture de fichier io vs chevauché dans un fil séparé

Y a-t-il un avantage à l'aide de l'écriture de fichier avec io chevauchée dans Windows, vs juste faire l'écriture de fichier dans un fil séparé que je crée?

[Modifier - Veuillez noter que je fais que je fais que le fichier écrit sans mise en cache système, c'est-à-dire que j'utilise le drapeau File_Flag_No_Buffering dans Creeefile)


0 commentaires

3 Réponses :


1
votes

éventuellement parce que les E / S chevauchés dans Windows diront que Windows d'écrire le fichier à sa propre heure à l'arrière-plan, par opposition à la reproduction d'un nouveau fil et d'engagement dans une opération de blocage?


1 commentaires

Voir ma réponse - Windows écrit déjà aux fichiers de sa propre heure, à l'arrière-plan, tant que vous ne plaisantez pas avec les paramètres par défaut et essayez de faire quelque chose de fou. WritefileEex et les E / S chevauchés ne sont pas nécessaires.



2
votes

Un avantage avec des E / S chevauchement est qu'il laisse un seul fil (ou plus généralement un pool de filets) pour gérer un nombre arbitraire de demandes d'E / S simultanément. Cela pourrait ne pas être un avantage pour une application de bureau unique, mais pour une application de serveur pouvant obtenir des demandes d'E / S à de nombreux clients différents, il peut s'agir d'une victoire majeure.


0 commentaires

5
votes

Étant donné que toutes les écrivies sont mises en cache dans le cache système par défaut, il y a peu d'avantages à faire des E / S chevauchés ou à créer un thread séparé pour écrit du tout. La plupart des appels de file d'accélérateurs ne sont que des memcpys à leur cœur, qui sont paresseusement écrits sur le disque par le système d'exploitation de manière optimale avec d'autres écrivies.

Vous pouvez bien sûr éteindre les E / S tamponnés via des drapeaux sur Createfile, puis il y a des avantages à faire une sorte d'ASYNC E / S - mais vous n'avez probablement pas / ne devrait pas le faire.

Modifier

L'OP a clarifié, ils utilisent en fait des E / S ignorés. Dans ce cas, les deux solutions suggérées sont presque identiques; Windows interne utilise un piscine de fil pour servir des demandes d'E / S ASYNC. Mais hypothétiquement Windows peut être plus efficace car leur moitié est implémentée dans le noyau, a moins de commutateurs contextuels, etc.


3 commentaires

Merci. Je fais déjà des E / S ignorés pour l'avantage rapide - j'aurais probablement dû mentionner (je vais modifier ma question à ce sujet)


Corrigez-moi si je me trompe, mais si vous écrivez dans un système de fichiers réseau, les écrires peuvent être tamponnés différemment et vous risquez de verrouiller votre fil si vous utilisez le blocage IO.


-1 - Les écrivies superposées sur un environnement multicore présentent une performance accrue. Vous pouvez également combiner des écritures superposées à partir de plusieurs threads à la même poignée de fichier. Pour que vous puissiez, sans l'indicateur recouvert, vous aurez besoin de verrous qui dégraderont encore les performances. Pour plusieurs parallèles IO sur le même fichier sous Windows, vous devez toujours utiliser le drapeau superposé et utiliser plusieurs threads ou ports d'achèvement. C'est un choix de conception.