差分

移動先: 案内検索

記憶管理

88 バイト追加, 2020年11月5日 (木) 18:25
/* mmap */
#include <sys/stat.h>
#include <sys/mman.h>
int main(void)
{
int fd;
fstat(fd, &st);
p=mmap(0,st.st_size,(PROT_READ|PROT_WRITE),MAP_PRIVATE,fd,0);
for(i=0; i < st.st_size -1 ; i++) {
printf("[%c]",p[i]);
}
* 実行
<pre class="bash">
$ echo -n 'abcdefg' > dat
$ cc mmap.c
$ ./a.out
ファイルもメモリも、さらにデバイスすらも単純な1つの記憶空間として扱おうというコンセプトが単一レベル記憶です。
現在、オペレーティングシステムレベルでサポートしているのはIBM社のSystem iシリーズ<ref>
IBMのサイトにあるIBM System iの単一レベル記憶の解説 : http://www-06.ibm.com/systems/jp/i/seminar/reconf/reconf1.shtml
</ref>
ぐらいしかないので、
インターネット上で説明を探すとIBM System iの機能=単一レベル記憶の定義みたいな説明しかありませんが、
実は、その歴史は古く1960年代に作られたMultics上に既に実装されています。実は、その歴史は古く1960年代に作られたMultics上に既に実装<ref>Multics and More VMhttps://users.cs.duke.edu/~chase/cps210-archive/slides/multics-vm.pdf</ref>されています。
UNIXは単一レベル記憶を前提としているデザインはありませんが、UNIXは単一レベル記憶を前提としているデザインはありませんが、現在のUNIX系のオペレーティングシステムはmmapを実装することによってファイルもメモリも、そしてデバイスも同様に扱うことができる利益を得ています。現在のUNIX系のオペレーティングシステムはmmapを実装することによってファイルもメモリも、例としては今時のLinuxやその他UNIX系のオペレーティングシステムでは実行バイナリやライブラリを動かすとき、一々ファイルの中身を読み込む動作をせず、実行するバイナリデータを内部でマップしてしまいます。そしてデバイスも同様に扱うことができる利益を得ています。ですから古典的なUNIXで言われるような、「実行バイナリファイルをメモリに読み込み実行する」という表現は、少なくとも現在のLinuxの実行時の表現としては適切ではないという状況になっています。あとデバイスの利用例としては、malloc()のいくつかの実装例としては今時のLinuxやその他UNIX系のオペレーティングシステムでは実行バイナリやライブラリを動かすとき、<ref>一々ファイルの中身を読み込む動作をせず、The GNU Allocator実行するバイナリデータを内部でマップしてしまいます。https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.htmlですから古典的なUNIXで言われるような、「実行バイナリファイルをメモリに読み込み実行する」という表現は、</ref>少なくとも現在のLinuxの実行時の表現としては適切ではないという状況になっています。あとデバイスの利用例としては、malloc()のいくつかの実装では内部で記憶領域を確保するときでは内部で記憶領域を確保するとき/dev/zeroをmmapでオープンして使っています。mmapの機能の背景にある単一レベル記憶というキーワードは知っていて損はないでしょう。
== 脚注 ==