2009-07-24 8 views
0

Quelles sont les constructions sous-jacentes du concept connu sous le nom de «flux»? Comment travaillent-ils en interne?Constructions sous-jacentes de «flux»

Comment fonctionne un flux de mémoire?

Comment fonctionne un flux de fichiers? - D'après les réponses, j'imagine que chaque type de flux est implémenté différemment, mais le concept de base est une séquence d'octets contrôlée et modélisée par une classe ou un ensemble de fonctions. Est-ce exact?

+1

La question est trop large. Puisque "flux" est un concept, il peut avoir de nombreuses représentations et implémentations, il est donc impossible de dire en général comment ils "travaillent en interne". –

+0

@Pavel - Il n'y a donc pas de concepts généraux sur lesquels les «flux» sont construits? –

+1

Je ne comprends vraiment pas la question. Un "flux", dans la définition la plus large, est une séquence d'éléments de données (souvent, mais pas nécessairement, octets) - c'est tout ce qu'il y a à faire. Quels genres de constructions avez-vous en tête? –

Répondre

0

Le concept de «flux» est simplement une séquence d'octets encapsulés par une classe qui suit la longueur, la position actuelle, le nombre d'objets ou d'octets sur le flux, etc. Dans le flot d'objets (ou octets, etc ...)

Donc la "construction" sous-jacente, comme vous l'avez dit, est simplement un tableau d'octets (ou un fichier sur le disque ou des pointeurs vers des classes, des structures ou même des entiers types) qui "sert" les objets dessus en fonction de l'encapsulation des flux. Imaginez que j'ai 10 canards en caoutchouc et que je suis à côté d'un vrai courant d'eau. Je place un canard dans le ruisseau et il commence à flotter en aval. J'ai maintenant 1 canard sur le courant. Je place un autre canard dans le ruisseau et il commence à flotter en aval. J'ai maintenant 2 canards dans le courant. Cela continue jusqu'à ce que ... vous manquez de mémoire. Maintenant, je cours en aval et attrape les deuxièmes canards de l'eau (cherchant). Il y a maintenant 9 canards dans le flux et je suis à la position 2 ...

Ainsi, la diffusion d'un objet diffère de la placer dans un tableau ou une liste en ce sens qu'il peut être "exploité" par la classe de flux d'encapsulation . Ce qui est sûr à propos de la diffusion en continu, c'est que vous pouvez créer différents flux au-dessus d'autres flux permettant un certain niveau d'abstraction. Par exemple, dans .NET, je peux créer un StreamWriter au-dessus d'un FileStream qui me permet d'écrire des chaînes dans le flux de fichiers sans avoir à les convertir manuellement en tableaux d'octets.

Espérons que cela aide. N'hésitez pas à corriger ou ajouter ce qui est nécessaire. Je ne prétends pas être un expert.

(BTW, il n'y a pas besoin d'être obtus et prétendre "trop ​​général", "je ne comprends pas" etc ... Soyons un peu plus compréhensifs et courtois, descendez de nos chaires et expliquer les choses dans de façon raisonnable)

+0

Vous décrivez ici une signification très étroite des flux. Les flux n'ont pas besoin d'être des octets seulement, ils peuvent ne pas avoir une longueur définie (même les flux .NET - pensez 'NetworkStream'!), Ils ne peuvent pas être recherchés, etc. Certainement, le concept sous-jacent n'est pas un tableau d'octets. - montrez-en un dans 'FileStream' ou, encore une fois,' NetworkStream'. –

+0

@Pavel - Puisque vous semblez être l'expert, pourquoi ne pas répondre à la question avec votre expertise au lieu de simplement commenter. –

+1

@Pavel - BTW, vous rencontrez comme très sournois et impoli. –

1

que diriez-vous cette définition de Wikipedia:. http://en.wikipedia.org/wiki/Stream_(computing)

+0

Particulièrement intéressant sont la première définition, qui décrit un flux comme une série d'octets (ou d'autres objets), et la troisième, de Scheme, qui définit un flux comme étant une séquence logique sans longueur définie. (Pensez à cela en dernier, c'est une très belle abstraction, et la plus haute définition de niveau que je peux penser.) – quark

+0

Une bonne réponse à la question telle qu'elle était à l'origine, mais elle a été éditée pour être un peu plus spécifique maintenant. –

0

Je suppose que vous êtes intéressé par C# FileStream et MemoryStream (ou leurs analogues en Java, et d'autres langues/cadres similaires). Un flux de mémoire expose un bloc de mémoire contigu via une interface de flux. Ceci est typiquement implémenté comme un tableau et un index (ou pointeur) indiquant l'octet courant. Les flux de mémoire peuvent être non croissants, auquel cas la taille de la matrice est définie à l'avance et ne peut pas changer, et dans ce cas, un nouveau tableau est alloué, et la mémoire est copiée si le tableau existant ne correspond pas aux données. En tant qu'optimisation, pour les réseaux de plus en plus gros, la taille est généralement supérieure à ce qui est nécessaire pour conserver toutes les données présentes dans le flux - de sorte que lorsque vous écrivez plus de données, cet espace inutilisé peut être utilisé rapidement sans besoin pour la réallocation de tableau sur chaque écriture. Avec cette optimisation, le flux devra garder une trace de la quantité d'espace inutilisée dans le tableau, en plus de sa taille.

Les flux de fichiers sont généralement beaucoup plus simples, car l'OS lui-même expose déjà les fichiers en tant que flux (c'est-à-dire que vous obtenez des API OS à lire/écrire/chercher dans les fichiers). Ainsi, les flux de fichiers enveloppent généralement un descripteur de fichier du système d'exploitation et fournissent des méthodes qui délèguent à ces API du système d'exploitation. Parfois, ils fournissent une mise en mémoire tampon supplémentaire pour des raisons de performances - c'est-à-dire que les données fournies à FileStream.Write ne sont pas immédiatement transmises à l'API «write block to file» du SE, mais sont mises en cache dans un tampon (généralement array). Lorsque suffisamment d'écritures se produisent que le tampon est plein, l'API du système d'exploitation est appelée. La manière dont l'OS implémente lui-même ces opérations de primitive de flux sur ses fichiers est très spécifique au système d'exploitation.

Questions connexes