共有メモリ

Euslispは、System5のshmemではなく、SunOSのmmapによって共有メモリを提供する。 共有メモリは、map-file関数によって配置される。 map-fileは、EusLispのプロセスメモリ空間内にファイルを配置し、 foreign-stringのインスタンスを返す。 データはこのforeign-stringに対する文字列関数を用いることにより 書き込みと読みだしができる。 共有メモリは、システム依存のページ境界に配置されるので、 配置アドレスを指定すべきではない。 :shareのキーパラメータがNILに設定されているかまたは :privateがTに設定されているファイルを配置することは、 ファイルをプライベート(排他的)にアクセスすべきであることを意味する。 しかし、メモリの共有化の目的から外れるため、 :shareのデフォルト値はTである。 2人のユーザーでファイルが共有されるとき、読み書きの許可は 両方のユーザーに正確に設定されなければならない。 残念なことにSunOSは、ネットワークを通して異なったワークステーション間の ファイルの共有ををサポートしていない。

64バイト長のファイルを2つのEusLispで共有するプログラム例を下に示す。

;; 64バイトのファイルを作る
(with-open-file (f "afile" :direction :output)  (princ (make-string 64) f))
;; 配置する
(setq shared-string1 (map-file "afile" :direction :io))
;;
;; 他のプロセスの中で
(setq shared-string2 (map-file "afile" :direction :io))

その後、shared-string1に書かれたデータは すぐにshared-string2へ現れる。 foreign stringへの書き込みは、 replacesetfarefを組み合せることにより可能である。



map-file filename &key (:direction :input) :length (:offset 0) (:share t) (:address 0) [関数]

filenameという名のファイルをメモリ空間に配置する。 filenameは、ローカルファイル、NFSでマウントされたリモートファイル、 または/devの中のメモリデバイスのどれでも可能である。 この関数の結果としてforeign-stringが返される。その要素は、arefによってアクセス可能である。map-fileによって:direction=:inputという条件で 配置されたforeign-stringにデータを書き込むことは、segmentation faultの原因となる。




2016-04-05