差分

移動先: 案内検索

記憶管理

1,544 バイト追加, 2022年11月17日 (木) 15:17
/* 動的なメモリ領域確保 */
これらはCPUのアーキテクチャーに依存するので異なる場合があります。例えばIBM POWER5+ や POWER6 プロセッサーは64KBのページサイズも利用することが出来ます。
([https://www.ibm.com/support/knowledgecenter/ssw_aix_72/performance/multiple_page_size_support.html Multiple page size support])</ref><ref>
x86-64(Intel 64)アーキテクチャーの場合2MBと1GBの拡大したページサイズが使えます。
 ([https://software.intel.com/sites/default/files/managed/a4/60/325384-sdm-vol-3abcd.pdf Intel 64 and IA-32 ArchitecturesSoftware Developer’s Manual])
</ref>
ですが、多くのCPUの最小ページサイズが4KBなのでLinuxのページサイズはデフォルトで4KBとなっています。
;補足: Linux 2.6.32でスワップについて試したことのメモランダム [[linuxのswapについて私が知っている二、三の事柄]]
 
 
==== zswap ====
 
zswap[https://www.kernel.org/doc/Documentation/vm/zswap.txt]は、 Linux kernel version 3.15 から入った仮想メモリ圧縮 (Virtual Memory Compression)を利用したスワップで、外部記憶装置にページをスワップするのではなく、実メモリ上に作った圧縮ブロックデバイスにページをスワップする機能でです。実メモリ上にスワップできなくなった時に、これまでのスワップ機能で用意しているスワップ領域にスワップを始めます。
 
 
 
ディスクなどメモリから比較すると低速なストレージへのI/Oが少なくなるため、頻繁にページアウトが発生しスワップファイルへのI/Oがボトルネックになるようなケースでは有用な機能です。フラッシュメモリを使ったSSDのような書き換え上限があるような外部記憶装置上にスワップファイルを作ると頻繁なスワップはメディアの劣化が進むためzswapが有効であるという議論もあります。圧縮処理が行われるため、その分、CPUに負荷がかかります。ただし、それがI/Oのオーバーヘッドによる処理の低下と比較し、相対的にどちらに利益があるかは、個々のシステム構成によって変化する議論であることは注意してください。
== 局所参照性 ==
* プログラム: malloctest.c
<syntaxhighlight lang='C' line="1" >
#include <stdlib.h>#include <errno.h>#include <unistd.h>#include <stdio.h>int main()
{
char *p;
free(p);
}
 
</syntaxhighlight>
<pre class="bash">
$ cc malloctest.c $ ./a.out & [1] 93627$ ps axu | grep a.out-o user,pid,vsize,rss,cmd USER PID VSZ RSS CMD hironobu 29813 87439 0.0 10752 0.0 525528 284 pts/8 S 17:32 6392 bashhironobu 93627 526788 0:00 580 ./a.outhironobu 93628 9928 3440 ps ---この並びは下の様になっています---o user,pid,vsize,rss,cmd USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
</pre>
このプログラムは512MBメモリ領域をmalloc(3)を使いアロケーションしています。実行時の状況をpsで見てみると、VSZが525528、RSSが284となっています。VSZはVirtual を使いアロケーションしています。実行時の状況をpsで見てみると、VSZが526788、RSSが580となっています。VSZはVirtual memory Sizeのことで仮想記憶もふくめて全部のメモリサイズです。RSSはReal Set Sizeのことで、実メモリ(物理的なメモリ)で専有しているメモリサイズです。つまり、このプログラムは約523.5MBもの記憶領域を取っているにもかかわらず、実際の実メモリ上では284KBしか取られていません。 で専有しているメモリサイズです。つまり、このプログラムは約527MBもの記憶領域を取っているにもかかわらず、実際の実メモリ上では580KBしか取られていません。
#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の機能の背景にある単一レベル記憶というキーワードは知っていて損はないでしょう。
== 脚注 ==