@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/windows-memory-internals-section-copy-on-write/#article>
    schema:about <https://comcomponent.com/knowledge/section-object/>, <https://comcomponent.com/knowledge/copy-on-write/> ;
    schema:mentions <https://comcomponent.com/knowledge/section-view/>, <https://comcomponent.com/knowledge/file-backed-section/>, <https://comcomponent.com/knowledge/pagefile-backed-section/>, <https://comcomponent.com/knowledge/image-section/>, <https://comcomponent.com/knowledge/data-section/>, <https://comcomponent.com/knowledge/file-map-write/>, <https://comcomponent.com/knowledge/page-fault/>, <https://comcomponent.com/knowledge/page-table-entry/>, <https://comcomponent.com/knowledge/standby-page-list/>, <https://comcomponent.com/knowledge/memory-commit/>, <https://comcomponent.com/knowledge/queryworkingsetex-shared/>, <https://comcomponent.com/knowledge/section-object-pointers/>, <https://comcomponent.com/knowledge/cache-manager/>, <https://comcomponent.com/knowledge/vmmap/>, <https://comcomponent.com/knowledge/process-explorer/>, <https://comcomponent.com/knowledge/shared-mutable-state/>, <https://comcomponent.com/knowledge/raw-pointer-sharing/> .

<https://comcomponent.com/knowledge/section-object/> a skos:Concept ;
    skos:prefLabel "セクションオブジェクト"@ja ;
    skos:definition "共有できるメモリの区画を表し、ファイルをプロセスのアドレス空間へマップする機構でもあるカーネルオブジェクト。"@ja ;
    ks:uses <https://comcomponent.com/knowledge/section-view/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/process-explorer/> .

<https://comcomponent.com/knowledge/copy-on-write/> a skos:Concept ;
    skos:prefLabel "コピーオンライト(CoW)"@ja ;
    skos:definition "複数プロセスが同じ物理ページを共有し、書き込みが起きたページだけを新しい物理ページへコピーして書き手のPTEを差し替える仕組み。"@ja ;
    skos:altLabel "Copy-on-Write" ;
    skos:altLabel "FILE_MAP_COPY" ;
    ks:mayCause <https://comcomponent.com/knowledge/page-fault/> ;
    ks:uses <https://comcomponent.com/knowledge/page-table-entry/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/queryworkingsetex-shared/> ;
    ks:requires <https://comcomponent.com/knowledge/memory-commit/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/vmmap/> .

<https://comcomponent.com/knowledge/section-view/> a skos:Concept ;
    skos:prefLabel "ビュー(セクションのマップ)"@ja ;
    skos:definition "セクションの一部を、あるプロセスの仮想アドレス範囲へ見せたもの。開始アドレスはプロセスごとに異なり得る。"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/page-fault/> .

<https://comcomponent.com/knowledge/page-fault/> a skos:Concept ;
    skos:prefLabel "ページフォールト"@ja ;
    skos:definition "必要なページがメモリになく取りに行くことになる現象。ホットパスで起きると遅延が一気に大きくなる。VirtualLockでロックした領域はページアウトされずページフォールトを避けられる。"@ja ;
    skos:altLabel "page fault" .

<https://comcomponent.com/knowledge/raw-pointer-sharing/> a skos:Concept ;
    skos:prefLabel "生ポインターの共有"@ja ;
    skos:definition "共有メモリ上の構造体にプロセス内の仮想アドレスをそのまま保存して他プロセスに使わせること。ビューのマップ先アドレスは一致する保証がないため壊れる。"@ja ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/section-view/> .

<https://comcomponent.com/knowledge/file-backed-section/> a skos:Concept ;
    skos:prefLabel "ファイルバックセクション"@ja ;
    skos:definition "実ファイルを内容の復元元とするセクション。cleanなページは物理ページを捨てても元ファイルから再読込できる。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/section-object/> ;
    ks:mayCause <https://comcomponent.com/knowledge/standby-page-list/> .

<https://comcomponent.com/knowledge/standby-page-list/> a skos:Concept ;
    skos:prefLabel "Standbyリスト"@ja ;
    skos:definition "以前の内容との対応関係を保ったまま、必要になれば奪える再利用候補として置かれた物理ページの集合。"@ja .

<https://comcomponent.com/knowledge/pagefile-backed-section/> a skos:Concept ;
    skos:prefLabel "ページファイルバックセクション"@ja ;
    skos:definition "明示的なデータファイルを持たず、ページファイルで支えられるセクション。CreateFileMappingのhFileにINVALID_HANDLE_VALUEを渡して作る。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/section-object/> .

<https://comcomponent.com/knowledge/shared-mutable-state/> a skos:Concept ;
    skos:prefLabel "共有可変状態"@ja ;
    skos:definition "複数のスレッドから読み書きされる、書き換え可能なデータ。競合はこれと複数スレッドが揃ったときにだけ起きる。"@ja .

<https://comcomponent.com/knowledge/image-section/> a skos:Concept ;
    skos:prefLabel "イメージマッピング(SEC_IMAGE)"@ja ;
    skos:definition "EXEやDLLをロードするためのセクション。ページ保護はPEイメージ自身のセクション属性が決め、VirtualQueryのTypeはMEM_IMAGEになる。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/section-object/> .

<https://comcomponent.com/knowledge/data-section/> a skos:Concept ;
    skos:prefLabel "データマッピング"@ja ;
    skos:definition "通常ファイルや共有データのためのセクション。ページ保護はマッピングとビューの指定が決め、VirtualQueryのTypeはMEM_MAPPEDになる。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/section-object/> .

<https://comcomponent.com/knowledge/page-table-entry/> a skos:Concept ;
    skos:prefLabel "ページテーブルとPTE"@ja ;
    skos:definition "仮想ページ番号を物理ページ番号へ変換する階層表と、その末端エントリー。無効なPTEもソフトウェア状態として意味を持つ。"@ja ;
    skos:altLabel "PTE" .

<https://comcomponent.com/knowledge/file-map-write/> a skos:Concept ;
    skos:prefLabel "FILE_MAP_WRITE(共有書き込み)"@ja ;
    skos:definition "同じファイルマッピングを使う別のビューからも変更が見える、共有書き込みのビュー種別。"@ja ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/copy-on-write/> .

<https://comcomponent.com/knowledge/queryworkingsetex-shared/> a skos:Concept ;
    skos:prefLabel "QueryWorkingSetExのSharedビット"@ja ;
    skos:definition "常駐ページが共有されているか私有化されているかを、ページ単位で示すWorking Set情報のビット。"@ja .

<https://comcomponent.com/knowledge/memory-commit/> a skos:Concept ;
    skos:prefLabel "Commit(MEM_COMMIT)"@ja ;
    skos:definition "システム全体のメモリとページファイルに対するコミット料金を課し、将来その内容をRAMまたはバックストアで保持できると約束する操作。"@ja .

<https://comcomponent.com/knowledge/vmmap/> a skos:Concept ;
    skos:prefLabel "VMMap"@ja ;
    skos:definition "プロセスの仮想・物理メモリを、コミット済み仮想メモリの種類別内訳として分析できるSysinternalsのツールである。"@ja ;
    skos:altLabel "VMMap.exe" .

<https://comcomponent.com/knowledge/process-explorer/> a skos:Concept ;
    skos:prefLabel "Process Explorer"@ja ;
    skos:definition "プロセスに読み込まれているDLLだけでなく、ハンドル・スレッドスタック・GDI/USERオブジェクト数なども確認できるSysinternalsのプロセス監視ツール。管理者として実行すると他ユーザーやサービスのプロセスも参照できる。"@ja .

<https://comcomponent.com/knowledge/section-object-pointers/> a skos:Concept ;
    skos:prefLabel "SECTION_OBJECT_POINTERS"@ja ;
    skos:definition "ファイルオブジェクトをファイルストリームのセクションへ結び、DataSectionObject・SharedCacheMap・ImageSectionObjectでメモリ上の内容とキャッシュ情報を追う構造。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/section-object/> .

<https://comcomponent.com/knowledge/cache-manager/> a skos:Concept ;
    skos:prefLabel "キャッシュマネージャー"@ja ;
    skos:definition "ファイルデータをメモリ上のシステムキャッシュに保持し、読み書きの多くをディスクI/Oなしで処理させるWindowsカーネルのコンポーネント。ファストI/Oの近道もこのキャッシュを直接利用する。"@ja ;
    skos:altLabel "Cache Manager" ;
    ks:uses <https://comcomponent.com/knowledge/section-object-pointers/> .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/section-object/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/section-view/> ;
    schema:description "セクションオブジェクトは共有する内容・サイズ・バックストア・保護の上限を表し、ビューはその一部をあるプロセスの仮想アドレス範囲へ見せる。CreateFileMappingを呼んだだけでは、まだプロセスから読めるアドレスは得られない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-hardware/drivers/kernel/section-objects-and-views>, <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/section-view/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/page-fault/> ;
    schema:description "ビューを作っても全ページが直ちにRAMへ入るわけではなく、最初に触れたページからページフォルトでファイル内容を読み込んでPTEへ物理ページを結んでいく。デマンドページングはセクションビューにもそのまま適用される。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-hardware/drivers/kernel/managing-memory-sections> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/raw-pointer-sharing/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/section-view/> ;
    schema:description "プロセスAとBが同じセクションの同じオフセットをマップしてもビューの開始アドレスは異なり得るため、共有構造に生ポインターを保存してはいけない。同じアドレスが将来も利用できる保証はないので、ポインターではなくベースからのオフセットを保存する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-hardware/drivers/kernel/file-backed-and-page-file-backed-sections>, <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffileex> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-backed-section/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/section-object/> ;
    schema:description "実ファイルをCreateFileMappingへ渡すとファイルバックセクションになる。読み取り専用ビューは必要なページをファイルから読み、読み書きビューの変更はそのファイルのデータとして扱われる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-hardware/drivers/kernel/file-backed-and-page-file-backed-sections> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-backed-section/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/standby-page-list/> ;
    schema:description "ファイルバックページがcleanなら、物理ページを捨てても元ファイルから再読込できる。この性質がStandbyとファイルキャッシュの効率を支えている。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-hardware/drivers/kernel/file-backed-and-page-file-backed-sections> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/pagefile-backed-section/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/section-object/> ;
    schema:description "CreateFileMappingのhFileにINVALID_HANDLE_VALUEを渡してサイズを指定すると、明示的なデータファイルを持たずページファイルで支えられるセクションになる。初期内容はゼロで、名前・ハンドル継承・DuplicateHandleを通じて複数プロセスが同じオブジェクトを開ける。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/memory/sharing-files-and-memory>, <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/pagefile-backed-section/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/shared-mutable-state/> ;
    schema:description "セクションを複数プロセスで書き込み可能に共有すると共有可変状態が生まれるが、排他制御が自動で付くわけではなく、mutex・semaphore・event・lock-freeプロトコルなどを別途設計する必要がある。セクションオブジェクトが破棄されれば内容も残らないため、永続ファイルとして残す用途にも向かない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/memory/sharing-files-and-memory>, <https://learn.microsoft.com/windows-hardware/drivers/kernel/file-backed-and-page-file-backed-sections> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/image-section/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/section-object/> ;
    schema:description "SEC_IMAGEでは、CreateFileMappingへ渡した通常の保護値よりも実行イメージ自身のセクション属性がビューのページ保護を決める。VirtualQueryのTypeはMEM_IMAGEになる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/data-section/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/section-object/> ;
    schema:description "通常ファイルや共有データのマッピングでは、ページ保護はマッピングとビューの指定が決め、VirtualQueryのTypeはMEM_MAPPEDになる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/image-section/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/copy-on-write/> ;
    schema:description "コードのような変更されないページは多数のプロセスで同じ物理ページを共有でき、プロセス固有の変更が必要なページだけがCoWで分岐する。ただしASLRによる再配置やローダーの修正、実際のPEセクション属性により、すべてのDLLページが必ず共有されるわけではない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/memory/memory-protection>, <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/copy-on-write/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/page-fault/> ;
    schema:description "CoWページは通常の共有書き込み可能ページにはなっていないため、書き込もうとするとCPUが保護フォルトを発生させる。メモリマネージャーはこれを違法な書き込みではなくCoW属性への書き込みだと判定する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/memory/memory-protection> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/copy-on-write/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/page-table-entry/> ;
    schema:description "判定を受けて、書き手用の物理ページを1枚得て元ページの内容をコピーし、書き手のPTEを新しい物理ページへ差し替えて保護を通常の読み書きへ変え、失敗した命令を再実行させる。もう一方のプロセスは元の内容を読み続ける。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/memory/memory-protection> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-map-write/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/copy-on-write/> ;
    schema:description "FILE_MAP_WRITEの共有書き込みは片方の変更が同じファイルマッピングを使う別ビューからも見える設計で、FILE_MAP_COPYでは書いたページだけがプロセス固有になり、変更は元ファイルへ戻らずビューを外すと失われる。目的によって選択が正反対になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffileex> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/copy-on-write/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/queryworkingsetex-shared/> ;
    schema:description "CoW後もVirtualQueryのTypeはデータビューならMEM_MAPPED、実行イメージならMEM_IMAGEのままで、その領域がどの初期割り当てに由来するかを報告する。ページ単位の私有化はQueryWorkingSetExのSharedビットが0かどうかで確認する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-virtualquery> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/copy-on-write/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/memory-commit/> ;
    schema:description "FILE_MAP_COPYでは将来ビュー内の全ページへ書く可能性があるため、マップした時点でビュー全体に相当するCommit chargeを取る。最初の1ページへ書いた瞬間にPrivate Bytesが増えるとは限らないので、Private Bytesだけを合否判定にすると正しく動いているCoWを見落とす。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffileex> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/copy-on-write/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/vmmap/> ;
    schema:description "VMMapはプロセスの仮想メモリをImage・Mapped File・Privateなどに分解し、Working SetのPrivate/Shareable内訳を表示する。領域のTypeだけでなくこの内訳を見る。"@ja ;
    ks:evidence <https://learn.microsoft.com/sysinternals/downloads/vmmap> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/section-object/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/process-explorer/> ;
    schema:description "Process Explorerはプロセスのハンドルやロード済みDLL・メモリマップトファイルを表示できるため、同じセクションを複数プロセスが開いている状態を確認できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/sysinternals/downloads/process-explorer> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/section-object-pointers/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/section-object/> ;
    schema:description "ファイルストリームのSECTION_OBJECT_POINTERSは、DataSectionObjectがデータファイルのセクション状態、SharedCacheMapがCache Managerの追うキャッシュビュー、ImageSectionObjectが実行イメージのセクション状態を指し、ファイルオブジェクトをファイルストリームのセクションへ結ぶ。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-hardware/drivers/ddi/wdm/ns-wdm-_section_object_pointers> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cache-manager/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/section-object-pointers/> ;
    schema:description "SECTION_OBJECT_POINTERSのうちSharedCacheMapが、Cache Managerの追うキャッシュビューを指す。3つのポインターは同じファイルストリームに結び付くが経路は分かれており、ImageSectionObjectが表すイメージフォルトの経路はCache Managerを通らない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-hardware/drivers/ddi/wdm/ns-wdm-_section_object_pointers> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .
