パート VI. mmap

目次

73. mmap の使い方
74. マルチタスクで使えると共有メモリーオブジェクト
75. fork()
75.1. fork() を 2 回コールする
75.2. fork() を 3 回コールする
75.3. fork() を 4 回コールする
76. fstat 関数を使ってファイルサイズを指定する場合
77. MAP_PRIVATE の Copy-On-Write
77.1. fork() で MAP_PRIVATE の Copy-On-Write を検証
78. MAP_ANONYMOUS
79. アノニマスマッピング
80. fork() でプライベートファイルマッピングのチェック
81. fork() でプライベートアノニマスマッピングをチェック
82. fork() で共有ファイルマッピングをチェック
83. fork() で共有アノニマスマッピングをチェック
84. /dev/zero

本書は Linux 開発環境上で C++ のメモリーアロケーターを実装するために必要な技術の説明を行うことを主眼としました。

ただメモリーはメモリーでも、どのメモリー領域のアドレスのメモリーかで性質や取扱が異なります。

例えば単にヒープ領域やスタック領域だけでなく、ファイルマッピング(メモリーとファイルをマッピング)までも取り扱うとメモリーアロケーターがカバーする範囲はかなり複雑化します。

Linux ではファイルマッピング、つまりメモリーとファイルをマッピング(紐付け)するシステムコール mmap があります。

mmap は POSIX 規格に準拠したシステムコールなので Unix 系 OS に共通した関数です。

Linux と Unix という比較だとおかしくなるのですが、Linux/Unix に対して Windows を比較すると CreateFileMapping() という別のファイルマッピング関数があります。

なので Linux / Unix系 / Windows のどの環境でもファイルとメモリーをマップする機能が組み込まれています。

Linux をメインに活動するプログラマーであれば mmap は良いイメージと悪いイメージがついてまわると思います。

特に 32 ビットの Linux だとアドレス空間がそもそも大きくないのでファイルマッピングをするとアドレスが足りないという状況が起きます。

ですがアドレス空間が潤沢にある64 ビット Linux ならば mmap を使えないという言い訳もできないです。

てなことで mmap がどんな関数かを次の項目以降に説明していきます。

Copyright 2018-2019, by Masaki Komatsu