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 !
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 :
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.
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"]
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 :
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 :
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); } })();
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); } })();
Les indicateurs pris en charge sont 3 :
const flags = COPYFILE_FICLONE | COPYFILE_EXCL; fsPromises.copyFile('source.txt', 'destination.txt', flags);
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 processusNous 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écuterDonc, 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.
C'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}`); }
exec:
const { exec } = require('child_process'); exec('my.bat', (err, stdout, stderr) => { if (err) { console.error(err); return; } console.log(stdout); });
fork est la base de la création de processus Linux, ce qui montre à quel point la technologie de copie sur écriture est importante.
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!