ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    PHPのコピーオンライト

    このエントリーを含むはてなブックマーク はてなブックマーク - PHPのコピーオンライト あとで読む
    PHPの変数って、コピーオンライト方式でメモリ管理しているそうです。
    むやみやたらに、参照渡しをする必要はないそうです。

    [PHP] 高速化Tipsのオカルト(1) 関数への参照渡し | Screw-Axis

    大きな配列はポインタで渡す?
    PHPには厳密な意味でのポインタは無く、zvalのリファレンスということになりますが。
    関数内で元の変数を参照するだけの場合でも、変数のコピーが行われないように参照渡しにする開発者を見かけます。しかし、少しPHPの内部構造を学べば、copy-on-writeの仕組みによってその必要が無いということを知っていると思います。



    ●コピーオンライト方式
    コピーオンライトって、なんだろ!?

    コピーオンライト - Wikipedia

    コピーオンライト (Copy-On-Write) とは、コンピュータプログラミングにおける最適化戦略の一種である。COWと略記することもある。

    コンピュータ内部で、ある程度大きなデータを複製する必要が生じたとき、愚直な設計では、直ちに新たな空き領域を探して割り当て、コピーを実行する。 ところが、もし複製したデータに対する書き換えがなければその複製は無駄だったことになる。

    そこで、複製を要求されても、コピーをした振りをして、とりあえず原本をそのまま参照させるが、ただし、そのままで本当に書き換えてはまずい。原本またはコピーのどちらかを書き換えようとしたときに、それを検出し、その時点ではじめて新たな空き領域を探して割り当て、コピーを実行する。これが「書き換え時にコピーする」、すなわちコピーオンライト (Copy-On-Write) の基本的な形態である。




    ●PHPのコピーオンライトの仕組み
    PHPの内部では、「zval」というコンテナで、変数を保管しているそうです。

    PHP: 参照カウント法の原理 - Manual

    PHP変数は「zval」と呼ばれるコンテナに保管されます。
    zvalコンテナには、変数の型と値の他に、情報の追加ビットを2つ含みます。

    1つ目は「is_ref」と呼ばれ、変数が「参照集合」の一部かどうかを示すブール値です。
    このビットによって、通常の変数と参照を区別する方法を PHP エンジンが知ります。
    &演算子によって作成されるように、PHPではユーザーランドを参照できるので、zvalコンテナもメモリー使用状況を最適化するための内部的な参照カウント機構を持ちます。

    追加情報の2つ目は「refcount」と呼ばれ、この1つの zval コンテナをどれだけ多くの 変数名(シンボルとも呼ばれます)が指すかを含みます。
    シンボルは全てシンボルテーブルに保管され、スコープごとにシンボルテーブルの 1つがあります。
    関数やメソッドごとのスコープばかりではなく、メインスクリプト用のスコープ (すなわち、ブラウザによってリクエストされたスクリプト)があります。

    もしXdebugをインストール済みなら、xdebug_debug_zval()を呼ぶと、この情報を表示できます。



    PHP5 のオブジェクトに関するよくある間違いとメモリ管理 (コピーオンライト) とオブジェクトの取り扱い - Web/DB プログラミング徹底解説

    変数の実際の中身は zval と呼ばれているのですが、これは4つの部分から構成されています。

    ひとつは、type (型) (例えば NULL とか Integer だとか String だとか、です)
    二つ目は value (値)、
    三つ目は is_ref フラグ (これはこの値が参照かそうでないかを示すフラグ)、
    四つ目は refcount (参照カウント) で、これはこの値が何度共有されているか示します。



    PHPは、zvalコンテナによって、コピーオンライト方式の変数管理をしてるんですね!
    一つ勉強になりました。
    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/836-89e13c6a

    FC2Ad