Re: 64bit mmap (Re: Rosetta)
In article <3991976news.pl@rananim.ie.u-ryukyu.ac.jp>,
kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球大学情報工学です。
>
> In article <d89jfu$270q@utogw.gssm.otsuka.tsukuba.ac.jp>, kuno@gssm.otsuka.tsukuba.ac.jp writes
> > そもそもmmapしただけで書いていない範囲はファイルとして保存され
> > ないという風にできてるんでんでは?
>
> そうなんだけど、最初に mmap(file,length,protocol,flag,fd,offset)
> ってな感じで length を指定してしまいますよね。その length を
> 変えるのどうやるのかなってわけです。
もちろん、普通にシングルスレッドだとmunmapしてmmapしてもいいんだけど、
マルチスレッドで動いている場合には以下のような事をします。
一回目のmmapが
base = mmap(base,length,protocol,flag,fd,0);
で、その後、それより大きなエリアが欲しい時に
fseek(fd,new-1,SEEK_END);
write(fd,"",1);
で
mmap(base+length,new,protocol,flag,fd,length);
(lengthはとページサイズの倍数)
複数mmapする時にbaseを、mapするメモリエリアが重ならないように余裕を持っ
て確保しておく時に64bitが便利なんですね。
> やっぱり常識的なファイルの大きさで制限する方が普通だろうなぁ。
> 重なったときは、再mmapするということなんだろうな。だとすると、
> やっぱり伸長するときは、munmap/mmap なんでしょうね。
つーわけでmunmapしないんです。
--
___ わしは、山吹色のかすてーらが大好きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735