Jump to content 日本-日本語

製品 >  ソフトウェア >  HP- UX Developer Edge

HP-UXメモリ管理 ホワイト・ペーパー バージョン1.4

仮想メモリとexec()
HP-UX/Integrityサーバー お問い合せ
コンテンツに進む

仮想メモリとexec()


システムでexec()が実行されるとき、仮想メモリシステムでは、古いpregionまたはregionがクリーンアップされ、新しいpregionまたはregionがセットアップされます。

vfork()からのクリーンアップ


vfork()からのクリーンアップは簡単です。

  • 子プロセスが実行されるが、そのリソースは親プロセスから借りられる。
  • カーネルが新しいvasを取得して、子プロセス(p_vas)に付加する。
  • forkタイプがFORK_PROCESSの場合と同様に、親プロセスのuareaとスタックがコピーされ、子プロセスのuarea用にpregionとregionが作成される。また、親プロセスのカーネル・スタックを使用していたスレッドが新しい子プロセスのカーネル・スタックを使用するようになる。
  • 子プロセスが親プロセスのリソースを返す。
  • 次に、カーネルがテキストやデータなどを追加する。

古いpregionの処理:dispreg()


exec()がFORK_PROCESSタイプのforkの後で呼び出された場合、最初に複数の領域を処理する必要があります。通常は、まだ必要なPT_UAREA pregionを除くすべてのpregionが処理されます。ファイルがファイル自身に対してexec()を呼び出している場合、わずかのプロセスが保存され、PT_TEXT領域とPT_NULLDREF領域も維持されます。

  • deactivate_preg()を使用してアクティブなpregionリストから削除することで、pregionが非アクティブ化される。非アクティブ化されているpregionをagehandが指し示し、stealhandがアクティブなpregionリスト内の次の領域を指し示している場合、agehandの順序がstealhandを超えないように、agehandが1つのpregionだけ後方に移される。非アクティブ化されているpregionをagehandまたはstealhandが指し示している場合、両方の針が1つのpregionだけ前方に移される。
  • hdl_detach()が呼び出されて、プロセスのアドレス空間から領域を切り離す処理のハードウェアに依存する部分が処理される。特に、これがアドレス空間への最後の参照である場合、そのリソースを解放する必要がある。
    • hdl_detach()が、領域に対して保留中のI/O(つまり、r_poip = 0)の完了を待機するためにwait_for_io()を呼び出す。これにより、現在別の目的に割り当てられているページを変更するI/O要求は返されない。
    • hdl_detach()が、すべての仮想アドレス変換を削除するために、領域のB-treeの各チャンクに対してdo_deltransc()を呼び出す。有効なvfdそれぞれについて、do_deltransc()がhdl_deletetrans()を呼び出す。hdl_deletetrans()はpddpage()を呼び出して、以下の処理を行う。
      • キャッシュをフラッシュする。
      • hpdeを無効にする(スペースを-1に設定し、アドレス、pde_phys(pfn)、pde_ref、およびpde_osを0に設定する)。
      • hpdeがhtblエントリでない場合、hpdeがハッシュ・リストから空きリストに移される。 hpdeがHTBL hpdeであって未使用の場合、hpdeを変換先のリンク・リストで満たし、コピーされたhpdeを解放する試みがなされる。
      • pfn_to_virtテーブルから変換を削除する。
    • これが共有アドレスであった場合、アドレス空間アロケータに返される(つまり、別のregion用に仮想アドレスを再使用することが可能になる)。
  • pregionポインタがr_pregsリストから削除され、pregionで使用されていたメモリが解放される(つまり、カーネル・メモリ・アロケータに返される)。
  • 領域のr_incore要素とr_refcnt要素が減分される。r_refcntがゼロの場合、領域も解放される。
regionを解放する必要がある場合に呼び出されるルーチンfreereg()が、以下の処理を行います。

  • 以下の処理を行うために、pgfree()を呼び出す。
    • 領域に対して保留中のI/O(つまり、r_poip = 0)の完了を待機するためにwait_for_io()を(再び)呼び出す。これにより、現在別の目的に割り当てられているページを変更するI/O要求は返されない。
    • regionのB-treeに(再び)移り、regionの有効なページすべてを解放する(freepfd())ために、B-treeの各チャンクに対してdo_freepagesc()を呼び出す。
      • pfdatのpf_useフィールドが減分される。
      • 物理ページがエイリアス指定されていない場合、そのpf_useが0になる。つまり、別の用途のために物理ページを解放できる。そのP_FREEフラグが設定され、物理ページが物理メモリ・アロケータに返される。カーネルのグローバル・パラメータfreememが増分される。別のプロセスがメモリを待機している場合、最初のプロセスがページを獲得できるように、それらのプロセスがすべて起動される(この競争に負けたプロセスは再び休眠状態になる)。
    • これが共有アドレスであった場合、アドレス空間アロケータに返される(つまり、別のregion用に仮想アドレスを再使用することが可能になる)。
  • r_bstoreがswapdev_vpの場合、B-tree構造用に予約されたスワップ・ページ(ページ数はr_root->b_rpages)と同様に、予約済みのスワップ・ページ(r_swalloc)が解除される。
  • 領域要素r_rootとr_chunkがカーネル・メモリ・アロケータに返される。
  • activeregionsが減分される。regionが、アクティブなregionリストとそのvnodeに関連付けられたregionのリストから削除され、region struct自体がカーネル・メモリ・アロケータに返される。

新しいプロセスの生成


メモリ構造を作成中のプロセスが実行可能ファイルとしてファイルを最初に使用するプロセスである場合、その実行可能ファイルのvnodeのv_vasはヌルであり、pseudo-vas、pseudo-pregion、およびregionの作成が必要になります。そうでない場合は、pseudo-vasの参照カウントが更新されます。

  • PT_TEXT pregionが付加される領域は、実行可能ファイルの種類によって異なる。
    • 実行可能ファイルがEXEC_MAGICでない場合、PT_TEXT pregionはpseudo-vas regionに付加される。
    • 実行可能ファイルがEXEC_MAGICである場合、VA_WRTEXTがプロセスvasで設定され、pseudo-vasのregionがRT_PRIVATE regionとして複製される(RT_PRIVATE regionについて説明したすべての手順が実行される)。また、必要になる前にスワップが予約されないようにRF_SWLAZYWRTが新しいregionで設定され、PT_TEXT pregionがそのregionに付加される。
    • 両方のケースで、新しいスペースがpregionの仮想アドレスに付加される。
    • PT_NULLDREF pregionは、PT_TEXTと同じスペースを使用するグローバルregion(globalnullrp)に付加される。
    • 実行可能ファイルのデータ部分の最初を指し示すr_offを使用するRT_PRIVATE領域として、pseudo-vasの領域が複製される。PT_DATA pregionがこの領域に付加される。これがEXEC_MAGIC実行可能ファイルである場合はPT_TEXT pregionのスペースが使用され、そうでない場合は新しいスペースが割り当てられる。
  • DBD_DZERO dbdを使用するPT_DATA pregionがbss(初期化されていないデータ領域)のサイズだけ増分される。これにより、初期化されていないデータ領域の最後にb_protoidxが設定され、b_proto2がDBD_ZEROに設定される。より多くのスワップが予約される。
  • ユーザー・スタック用に3つのページの専用領域(SSIZE +1)が作成される。dbdプロトタイプ値がDBD_DZEROに設定され、PT_STACK pregionがUSRSTACKで付加される。PT_UAREA pregionのスペースが使用される。
  • 共有ライブラリがプロセスにリンクされる際、2つのPT_MMAP pregionが作成される。それは、KERNELSPACEのスペースを持つ第3クワドラントにマッピングされたテキストを含むRT_SHARED pregionと、PT_DATA pregionのスペースを持つ関連データ(ライブラリ・グローバル変数など)を含むRT_PRIVATE pregion。
  • VA_WRTEXTが設定されている場合、データpregionには、それを超えるとテキストが終了する(第1クワドラントと第2クワドラント内の)最初の使用可能アドレスが割り当てられる。そうでない場合は、第2クワドラント内の最初の使用可能アドレスが割り当てられる。

仮想メモリとexit()


仮想メモリの観点からすると、exit()はexec()の最初の部分に似ています。プロセスに割り当てられたすべての仮想メモリ・リソースが破棄されますが、新しい仮想メモリ・リソースは割り当てられません。

したがって、vforkの子がexec()を実行する前にexit()で終了した場合、親プロセスに返すリソースを除き、仮想メモリからクリーンアップすべきリソースはありません。vfork以外の子が終了した場合、dispreg()の呼び出しによって仮想メモリ・リソースが破棄されます。
最初のページへ 前のページへ  

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

HPEサポートセンター
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項