プロセス作成とファイルコピーのための Node.js+COW テクノロジーに関する簡単な説明

青灯夜游
リリース: 2021-09-17 10:07:14
転載
1765 人が閲覧しました

この記事では、COW (Copy-On-Write) テクノロジを理解し、COW テクノロジのプロセス作成とファイル コピーのアプリケーション Node.js を紹介します。

プロセス作成とファイルコピーのための Node.js+COW テクノロジーに関する簡単な説明

COW は牛ではなく、Copy-On-Write の略で、コピーはするが完全にはコピーしない技術です。

一般的に、コピーとは 2 つの同一のコピーを作成することです。2 つのコピーは独立しています:

プロセス作成とファイルコピーのための Node.js+COW テクノロジーに関する簡単な説明

ただし、場合によっては、コピーが機能しないことがあります。 , 以前のものを再利用することができますが、このとき、内容を書く際には、以前のものを引用し、内容の該当部分をコピーするだけで大​​丈夫です。このように、コンテンツが読み取りに使用される場合にはコピーは不要ですが、書き込みが必要な場合には、実際にはコンテンツの一部がコピーされて変更されます。

プロセス作成とファイルコピーのための Node.js+COW テクノロジーに関する簡単な説明

これは「コピーオンライト」と呼ばれ、コピーオンライトとも呼ばれます。

原理は非常に単純ですが、オペレーティング システムのメモリ管理とファイル システムでは非常に一般的であり、Node.js もこのテクノロジのせいで「遅延」になっています。

この記事では、Node.js でのプロセス作成とファイルのコピーにおけるコピーオンライトの応用について見ていきます。 [推奨学習: "nodejs チュートリアル"]

ファイル コピー

ファイル コピーの最も一般的なアイデアは、完全に同一のコピー ファイルを作成することです。

  • まったく同じコンテンツを書き込む同じファイルを何百回もコピーすると、同じコンテンツが何百回も作成されることになります。 ?ハードディスク容量の無駄です。
  • 書き込み途中で電源が切れたらどうなりますか?上書きされたコンテンツを復元するにはどうすればよいですか? #########どうやってするの?この時点で、オペレーティング システムの設計者は COW テクノロジを思いつきました。
COW テクノロジを使用してファイルのコピーを実現すると、上記の 2 つの問題が完全に解決されます:

コピーすると、前のコンテンツへの参照が追加されるだけです。変更されなければ、実際にはコピーされません。コピーのみ コンテンツが初めて変更されるまで、対応するデータ ブロックは実際にはコピーされないため、大量のハードディスク領域の無駄が回避されます。

    ファイルを書き込むとき、最初に別の空きディスク ブロックに変更が行われ、変更が完了した後にターゲットの場所にコピーされるため、後でロールバックできないという問題は発生しません。停電
  • Node.js の fs.copyFile API でコピーオンライト モードを使用できます。
デフォルトでは、copyFile はターゲット ファイルに書き込み、上書きします。元のコンテンツ

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

(async function() {
  try {
    await fsPromises.copyFile('source.txt', 'destination.txt');
  } catch(e) {
    console.log(e.message);
  }
})();
ログイン後にコピー

ただし、3番目のパラメータを使用してコピー戦略を指定できます:

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);
  }
})();
ログイン後にコピー

サポートされているフラグは3つあります:

COPYFILE_EXCL: ターゲット ファイルの場合すでに存在する場合、エラーが報告されます (デフォルトは上書きです)

    COPYFILE_FICLONE: コピーオンライト モードでコピーします。オペレーティング システムがこれをサポートしていない場合は、実際のコピー (デフォルト) に切り替わります。は直接コピーです)
  • COPYFILE_FICLONE_FORCE: コピーオンライト モードでコピーします。オペレーティング システムがサポートしていない場合、エラーが報告されます。
  • これら 3 つの定数は 1
  • const flags = COPYFILE_FICLONE | COPYFILE_EXCL;
    fsPromises.copyFile('source.txt', 'destination.txt', flags);
    ログイン後にコピー
Node.js オペレーティング システムのコピーオンライト テクノロジをサポートしており、一部のシナリオでパフォーマンスを向上させることができます。 COPYFILE_FICLONE メソッドを使用することをお勧めします。これはデフォルトのメソッドよりも優れています。

プロセスの作成

フォークはプロセスを作成する一般的な方法であり、その実装はコピーオンライトテクノロジです。

プロセスはメモリ内でコード セグメント、データ セグメント、スタック セグメントの 3 つの部分に分割されていることがわかります。

コード セグメント: 実行されるコードを格納します

    データ セグメント: グローバル データを格納します。
  • スタック セグメント: 実行ステータスを格納します。
  • このプロセスに基づいて新しいプロセスが作成される場合、メモリのこれら 3 つの部分は、コピーされました。そして、メモリのこれら 3 つの部分が同じ内容を持つ場合、メモリ領域が無駄になります。
したがって、fork は実際にはメモリをコピーするのではなく、新しいプロセスを作成し、親プロセスのメモリを参照します。データが変更されると、メモリのこの部分が実際にコピーされます。

これが、プロセスの作成がフォークと呼ばれる理由です。これは、完全に独立しているわけではなく、特定の部分が 2 つの部分に分岐しているためです。しかし、そのほとんどはまだ同じです。 プロセス作成とファイルコピーのための Node.js+COW テクノロジーに関する簡単な説明

しかし、実行されるコードが異なる場合はどうなるでしょうか? この時点では、新しいコード セグメント、データ セグメント、スタック セグメントを作成し、新しいコードを実行する exec を使用する必要があります。

fork および exec API は 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 は Linux の基礎ですプロセスの作成 、これはコピーオンライトテクノロジがいかに重要であるかを示しています。

概要

同じコンテンツの複数のコピーをコピーすることは間違いなくスペースの無駄であるため、オペレーティング システムは、プロセス作成時にファイルをコピーしたりメモリをコピーしたりするときにコピーオンを使用します。テクノロジーは、実際に変更された場合にのみコピーされます。

Node.js は、fs.copyFile のフラグの設定をサポートしています。COPYFILE_FICLONE を指定すると、コピーオンライトを使用してファイルをコピーできます。また、ハード ディスクのスペースを節約し、パフォーマンスを向上させるために、この方法を使用することをお勧めします。ファイルコピーのパフォーマンス。

プロセスのフォークもコピーオンライトの実装です。プロセスのコード セグメント、データ セグメント、スタック セグメントを新しいコンテンツに直接コピーするのではなく、以前のコンテンツを参照します。実メモリのコピーを実行します。

さらに、コピーオンライトは、Immutable の実装や分散読み取り/書き込み分離などの分野で多くの用途があります。

COW は Node.js を「遅延」させますが、パフォーマンスは向上します。

元のアドレス: https://juejin.cn/post/6999497362255118366

作者: zxg_God は光があるに違いないと言いました

その他のプログラミング関連知識については、プログラミング入門をご覧ください。 !

以上がプロセス作成とファイルコピーのための Node.js+COW テクノロジーに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!