差分

移動先: 案内検索

記憶管理

241 バイト追加, 2018年1月16日 (火) 10:07
/* Linuxのスワップ */
<pre>
/dev/hda3 none swap sw ,pri=0 0 0
</pre>
* プログラム: malloctest.c<syntaxhighlight lang='C' line="1" >
#include <stdlib.h>
main() { char *p; size_t areasize=1024*1024*512; if ((p=(char *)malloc(areasize)) == NULL) { perror("malloc"); } sleep(10); free(p); }</syntaxhighlight> * 実行例:  <pre class="bash">
$ cc malloctest.c
$ ./a.out &
---この並びは下の様になっています---
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
</pre>
次の ps コマンドを実行してみましょう。するとRSSでソートされて、USER / COMMAND / RSS / VSZの順で表示されます。
<pre class="bash">
$ ps -Ao user,args,rss,vsize --sort rss
USER COMMAND RSS VSZ
hironobu gedit 23204 173232
hironobu /opt/google/chrome/chrome - 107380 359600
</pre>
;調べてみよう: vmstatで観察してみましょう。vmstatは仮想記憶のステータス観察するためのツールです。1秒毎に表示するオプションで動作させながら、先程のプログラムを改造し徐々に記憶を取るようなプログラムにして動かし、観察してみましょう。
<pre class="bash">
% vmstat 1 <- 1秒毎に表示
procs memory swap io system cpu
2 1 0 29964 1140 368 2128 316 124 79 310 485 817 37 9 54
...
 </pre>
== コピーオンライトとその実際 ==
つまり、子プロセス側となったdashのメモリは、この時点ではシェアしているものを使っていることがわかります。
<pre class="bash">
$ dash
$ cat /proc/$$/smaps | head -9
Private_Dirty: 0 kB
Referenced: 76 kB
</pre>
== mmap ==
* プログラムmmap.c <syntaxhighlight lang='C' line="1" >#include <stdio.h>#include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> main() { int fd; struct stat st; char *p; int i; fd=open("dat",O_RDWR); 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]); } close(fd); }</syntaxhighlight> * 実行<pre class="bash">
$ echo 'abcdefg' > dat
$ cc mmap.c
$ ./a.out
[a][b][c][d][e][f][g]$
</pre>