Maison > interface Web > js tutoriel > Une brève discussion sur la technologie Node.js+COW pour la création de processus et la copie de fichiers

Une brève discussion sur la technologie Node.js+COW pour la création de processus et la copie de fichiers

青灯夜游
Libérer: 2021-09-17 10:07:14
avant
1858 Les gens l'ont consulté

Cet article vous fera découvrir la technologie COW (Copy-On-Write) et présentera l'application de création de processus et de copie de fichiers de la technologie COW + Node.js J'espère que cela sera utile à tout le monde !

Une brève discussion sur la technologie Node.js+COW pour la création de processus et la copie de fichiers

COW n'est pas une vache, c'est l'abréviation de Copy-On-Write, qui est une technologie qui copie mais pas exactement copie.

D'une manière générale, copier consiste à créer deux copies identiques. Les deux copies sont indépendantes :

Une brève discussion sur la technologie Node.js+COW pour la création de processus et la copie de fichiers

Cependant, parfois la copie n'est pas nécessaire et vous pouvez réutiliser complètement la précédente. Dans ce cas, vous pouvez simplement citer la précédente. une seule et unique copie de la partie correspondante lors de la rédaction du contenu. De cette manière, si le contenu est utilisé pour la lecture, la copie est éliminée, mais si l'écriture est requise, une partie du contenu sera effectivement copiée pour modification.

Une brève discussion sur la technologie Node.js+COW pour la création de processus et la copie de fichiers

C'est ce qu'on appelle "Copy-On-Write", également connu sous le nom de Copy-On-Write.

Le principe est très simple, mais il est très courant dans la gestion de la mémoire et le système de fichiers du système d'exploitation est également devenu « paresseux » à cause de cette technologie.

Dans cet article, nous explorerons l'application de Copy-On-Write dans la création de processus et la copie de fichiers dans Node.js. [Apprentissage recommandé : "Tutoriel Nodejs"]

Copie de fichier

L'idée la plus courante pour la copie de fichier est d'écrire complètement le même contenu de fichier dans un autre emplacement, mais cela pose deux problèmes :

  • Écrire exactement le même contenu Si le même fichier est copié des centaines de fois, le même contenu sera-t-il créé des centaines de fois ? Quel gaspillage d'espace sur le disque dur
  • Et si l'alimentation est coupée pendant l'écriture ? Comment restaurer le contenu écrasé ?

Que dois-je faire ? À cette époque, les concepteurs de systèmes d’exploitation pensaient à la technologie COW.

L'utilisation de la technologie COW pour réaliser la copie de fichiers résout parfaitement les deux problèmes ci-dessus :

  • La copie ajoute simplement une référence au contenu précédent. S'il n'est pas modifié, il ne sera pas réellement copié. Il ne sera effectué que lorsque le contenu. est modifié pour la première fois. Les blocs de données correspondants sont effectivement copiés, évitant ainsi le gaspillage d'une grande quantité d'espace disque.
  • Lors de l'écriture d'un fichier, les modifications seront d'abord apportées à un autre bloc de disque libre, puis copiées à l'emplacement cible une fois les modifications terminées, de sorte qu'il n'y aura aucun problème d'impossibilité de revenir en arrière après une panne de courant

Dans l'API fs.copyFile de Node.js, vous pouvez utiliser le mode Copie sur écriture :

Par défaut, copyFile écrira dans le fichier cible, écrasant le contenu original

const fsPromises = require('fs').promises;

(async function() {
  try {
    await fsPromises.copyFile('source.txt', 'destination.txt');
  } catch(e) {
    console.log(e.message);
  }
})();
Copier après la connexion

Mais vous pouvez spécifier la stratégie de copie via le troisième paramètre :

const fs = require('fs');
const fsPromises = fs.promises;
const { COPYFILE_EXCL, COPYFILE_FICLONE, COPYFILE_FICLONE_FORCE} = fs.constants;

(async function() {
  try {
    await fsPromises.copyFile('source.txt', 'destination.txt', COPYFILE_FICLONE);
  } catch(e) {
    console.log(e.message);
  }
})();
Copier après la connexion

Les indicateurs pris en charge sont 3 :

  • COPYFILE_EXCL : Si le fichier cible existe déjà, une erreur sera signalée (la valeur par défaut est d'écraser)
  • COPYFILE_FICLONE : Copie en mode copie sur écriture, si le fonctionnement le système ne le prend pas en charge, il passera en copie réelle (la copie par défaut est la copie directe) )
  • COPYFILE_FICLONE_FORCE : Copie en mode copie sur écriture si le système d'exploitation ne le prend pas en charge, une erreur sera signalée.
  • Ces trois constantes sont 1, 2 et 4. Elles peuvent être combinées par OU au niveau du bit et transmises :
const flags = COPYFILE_FICLONE | COPYFILE_EXCL;
fsPromises.copyFile('source.txt', 'destination.txt', flags);
Copier après la connexion

Node.js prend en charge la technologie de copie sur écriture du système d'exploitation, ce qui peut améliorer les performances dans certains scénarios. Il est recommandé d'utiliser la méthode COPYFILE_FICLONE, meilleure que la méthode par défaut.

Création de processus

fork est un moyen courant de créer un processus, et sa mise en œuvre est une technologie de copie sur écriture.

Nous savons que le processus est divisé en trois parties dans la mémoire : segment de code, segment de données et segment de pile :

segment de code : stocke le code à exécuter
  • segment de données : stocke des données globales
  • pile segment : stocke l'exécution Le statut
  • Si un nouveau processus est créé sur la base de ce processus, ces 3 parties de mémoire doivent être copiées. Et si ces trois parties de la mémoire ont le même contenu, alors l’espace mémoire est gaspillé.

Donc, fork ne copie pas réellement la mémoire, mais crée un nouveau processus et référence la mémoire du processus parent. Lorsque les données sont modifiées, cette partie de la mémoire sera réellement copiée.

Une brève discussion sur la technologie Node.js+COW pour la création de processus et la copie de fichiersC'est pourquoi la création de processus est appelée fork, c'est-à-dire fork, car elle n'est pas complètement indépendante, mais certaines parties sont divisées en deux parties, mais la plupart d'entre elles sont toujours les mêmes.

Mais que se passe-t-il si le code à exécuter est différent ? À ce stade, vous devez utiliser exec, qui créera un nouveau segment de code, un segment de données, un segment de pile et exécutera un nouveau code.

Vous pouvez également utiliser les API fork et exec dans Node.js :

fork:

const cluster = require('cluster');

if (cluster.isMaster) {
  console.log('I am master');
  cluster.fork();
  cluster.fork();
} else if (cluster.isWorker) {
  console.log(`I am worker #${cluster.worker.id}`);
}
Copier après la connexion

exec:

const { exec } = require('child_process');
exec('my.bat', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});
Copier après la connexion

fork est la base de la création de processus Linux, ce qui montre à quel point la technologie de copie sur écriture est importante.

Résumé

Copier plusieurs copies du même contenu est sans aucun doute une perte d'espace. Par conséquent, le système d'exploitation utilise la technologie Copy-On-Write lors de la copie de fichiers et de la mémoire lors de la création du processus. sont faits. Allez en faire une copie.

Node.js prend en charge la définition des indicateurs de fs.copyFile. Vous pouvez spécifier COPYFILE_FICLONE pour utiliser la méthode Copy-On-Write pour copier des fichiers. Il est également recommandé d'utiliser cette méthode pour économiser de l'espace sur le disque dur et améliorer les performances. de copie de fichiers.

Le fork d'un processus est également une implémentation de Copy-On-Write. Il ne copie pas directement le segment de code, le segment de données et le segment de pile du processus vers le nouveau contenu, mais fait référence au précédent uniquement lors de la modification. ce sera la vraie copie de la mémoire.

De plus, Copy-On-Write a de nombreuses applications dans la mise en œuvre d'Immutable et dans la séparation distribuée en lecture-écriture et dans d'autres domaines.

COW rend Node.js "paresseux", mais fonctionne mieux.

Adresse originale : https://juejin.cn/post/6999497362255118366

Auteur : zxg_God a dit qu'il devait y avoir de la lumière

Pour plus de connaissances liées à la programmation, veuillez visiter : Introduction à la programmation ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:juejin.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal