コピーオンライトとは何ですか?
回答: オブジェクトをコピーする場合、実際には元のオブジェクトをメモリ内の別の場所にコピーするのではなく、新しいオブジェクトのメモリ マッピング テーブルにソース オブジェクトの場所を指すポインタを設定してコピーします。元のオブジェクトをメモリ内の別の場所にコピーすると、メモリの Copy-On-Write ビットが 1 に設定されます。このようにして、新しいオブジェクトに対して読み取り操作が実行されるとき、メモリ データは変更されず、読み取り操作は行われません。新しいオブジェクトに対して書き込み操作が実行されると、実際のオブジェクトが新しいメモリ アドレスにコピーされ、新しいオブジェクトのメモリ マッピング テーブルがこの新しい場所を指すように変更され、書き込み操作が実行されます。新しいメモリ位置で実行されます。
このテクノロジは、仮想メモリおよびページングと併用する必要があります。利点は、コピー操作を実行するときに、実際のメモリのコピーではなく、ポインタのみが作成されるため、効率が大幅に向上することです。しかし、これは常に当てはまるわけではありません。新しいオブジェクトをコピーした後も、ほとんどのオブジェクトが書き込み操作を続行する必要がある場合、大量のページング フォールトが発生するため、メリットは得られません。したがって、COW は、新しいオブジェクトをコピーし、メモリ ページのごく一部で書き込み操作を実行した後でのみ効率的になります。
コピーオンライトメカニズムは、割り当て中のメモリの増加を避けるために PHP カーネルでも使用されています。たとえば、foreach ループ本体を使用すると、その秘密を見つけることができます。サンプルコード:
コードをコピーします コードは次のとおりです:
$m1 =memory_get_usage();
$str=<<aaaaaaaaaaaa
aaaaaaaaaa
EOF;
$arr = explode("n" , $str);
$count=0;
foreach($arr as $v){
$count++;
//$v='aaaaaaaaaaaaaa';
}
$m2 =memory_get_usage();
エコー $m2- $m1;
このコードを実行すると、メモリ フットプリント: 788 が取得されます
コードをコピーします コードは次のとおりです:
$m1 =memory_get_usage();
$str=<<aaaaaaaaaaaa
aaaaaaaaaa
EOF;
$arr = explode("n" , $str);
$count=0;
foreach($arr as $v){
$count++;
$v='aaaaaaaaaaaaaa';
}
$m2 =memory_get_usage();
echo $m2-$m1 ;
コメント //$v='aaaaaaaaaaaaaa'; をキャンセルすると、メモリ使用量の値は 840 になります。メモリが増加していることに注意してください。
コードをコピーします コードは次のとおりです:
$m1 =memory_get_usage();
$str=<<aaaaaaaaaaaa
aaaaaaaaaa
EOF;
$arr = explode("n" , $str);
$count=0;
foreach($arr as &$v){
$count++;
//$v='aaaaaaaaaaaaaa';
}
$m2 =memory_get_usage() ;
エコー $m2 -$m1;
foreach の $v を &$v に書き換えると、ループ本体の $v のコメントがコメントされているかどうかに関係なく、メモリ フットプリントは 788 として取得できます
これは、COW メカニズムの介入を示しています。foreach ループで $v の読み取り操作のみを使用する場合、PHP カーネルは変数 $v のメモリ アドレスを $arr の配列のインデックスにポイントします。 address は配列内のデータを変数 $v にコピーしません。このときのメモリ使用量は &$v を使用した場合と同じです。ただし、ループ本体で $v に書き込むと、コピーオンライト メカニズムがアクティブになり、この時点で、PHP はメモリ空間のセクションを $v 変数に再度開き、配列のメモリ アドレスを破壊します。これをオンにすると、必然的にメモリが増加します。
ここで別の結論を導き出すことができます。ビッグデータを読み取るときは、COW メカニズムによってもたらされるメモリ増加の影響に注意を払う必要があります。また、変数への不要な書き込みを回避すると、コードの実行パフォーマンスが向上します。
http://www.bkjia.com/PHPjc/769674.html
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/769674.html技術記事コピーオンライトとは何ですか? 回答: オブジェクトをコピーするとき、元のオブジェクトは実際にはメモリ内の別の場所にコピーされるのではなく、新しいオブジェクト内にコピーされます...