[kansaipm] use & fork

SUGITA Toshinori sugita at d-pad.co.jp
Sun Oct 5 21:09:50 CDT 2003


# From: Yasushi Nakajima <nakajima at netstock.co.jp>
# Subject: Re: [kansaipm] use & fork 
# Date: Sun, 05 Oct 2003 18:29:43 +0900

>  その理解で正しいと思います。そして、複数待機しているどの子プロセスにリ
> クエストがわたるかはApacheの親プロセス任せになります。ですので、杉田さん
> の用途のように毎回いろんなスクリプトをevalしてその中でどんなモジュールが
> useされるかもあらかじめ決められないとなると、ちょっと最後の一押しが足り
> ない感じになりますね。つまり、Foo.pmを読み込み済みの子プロセスがあったと
> して、次にuse Foo;するスクリプトをevalするようなリクエストがあっても、そ
> のリクエストが他の(Foo.pmはまだ読み込んでいない)子プロセスに回されてし
> まうかもしれない…。

ありがとうございます。
自分の理解の範囲内で済んでいて安心しました。(^^;

>  これを完璧にやりたいとなると、やはり自前で子プロセスを管理するしかない
> でしょう。

やはりそうなるのですね。

> ・各子プロセスは、リクエストされたコードをevalして結果を返したら、終了せ
>   ずに待機状態になるように作っておく
> ・親プロセスは、リクエストされたコードの中でuseしているモジュールを調べ
>   て、どの子プロセスでどのモジュールをuseしたかのリストを保持し、そして
>   そのモジュールを過去にuseしている待機中の子プロセスにリクエストを渡す

>  子プロセスの状態をきちんと管理するプログラムを書くのは結構ホネかもしれ
> ません。親子間のコミュニケーションも(現実世界と同様)いろいろ工夫のしど
> ころがありそうです。まぁ、古典的な問題とも言えますが。

やはり、子プロセスでどういう内容がコンパイルされたか管理するのは
結構ホネと言うよりもかなり破壊的な状況になってしまいそうなので、
前回のメールのやり取りで思いついたのですが、以下のようにしてみるのは
どんなもんでしょうか? fork自体がどれくらいの処理になるのか、ちゃんと
チェックしてみないといけないと思いますが、自分自身の希望は満たせているように
思えています。

1. リクエストが来たら、それに必要なスクリプトを含むファイルをparseする。
  (この部分は、独自の仕様なので、parseも独自仕様になります)
2. parseの結果、コンパイルしなければならないスクリプトが複数切り取れるので
   これをすべて、親プロセスでコンパイルする。
   コンパイルした時点で eval "use hoge;";などとなっていない限りはモジュールも
   親プロセスでコンパイルされる (*1)
   コンパイル結果はコードリファレンスとして、あとから実行可能な形にしておく。
3. コンパイルがすべて終了した時点で子プロセスをforkする。
   子プロセスはparse結果およびコンパイル結果をすべて持っているはずなので、
   そのままコンパイルされた結果を呼び出すことができる。

上の1.の部分はこれだけ専用のプロセスを一番最初に子プロセスとして立ち上げておいて
parseした結果をシリアライズしてファイルにキャッシング、そのあとメインプロセスが
シグナルを受取って(別の方法でもいいですが)、ファイルを読み込んで再構成して
2の処理に移行する、というのがいいのではないかと思っています。
こうしておけば、サーバーを再起動したときにはparseの作業はすっ飛ばして、コンパイル
するところからはじめられます。

前に書いた perlcc -B 相当の操作をしてバイトコードを無理やりとってくるっていうのも
技術的にはなかなか面白そうなのですが、そもそもが実験的な機能なので、またの機会に
回そうかと思っています。

>  なお、ちょっと別の話になりますが、どんなコードがリクエストされるかわか
> らないとなると、Safe環境の中で使える機能を制限した状態でevalした方がいい
> と思います。でないとサーバーの中を好きにいじられてしまう危険があるでしょ
> う。

はい。これは、前回のfastcgi版を作ったあとにこういうものがあることを知ったので
今回は使ってみようと思います。
少し実験してみたのですが、デフォルト状態で use や require は使用制限に
引っ掛かってしまうので、この制限をはずして使用しようと思っていますが、
セキュリティ上の問題以外に(どちらかというと不注意レベルの)問題が発生する
可能性はあるでしょうか?この部分だけが少し気になっています。
ほんとは、Safe 環境用の require みたいなものがあると、更に安全でいいな
と思ってはいるのですが、そんなのはないですよね?(普通に考えると
名前空間をどうすんだ?って事になってしまいそう)

どの程度の使用制限をかけるのがいいのかは、実際にこのシステムで使用する
スクリプトを作成しながら試行錯誤するしかないと思っています。

///////////////////////////////
 SUGITA Toshinori 杉田 敏典      Digital Pad Inc.    .・.         
   E-MAIL  : sugita at d-pad.co.jp                       ●・
   WebPage : http://www.d-pad.co.jp/
   メール・スクランブル http://www.d-pad.co.jp/mail/scramble/
   アンケートしよう!   http://www.d-pad.co.jp/enquete/make/
   有名人にメールしよう http://www.d-pad.co.jp/mail/fame/
   アクセス解析サービス http://www.d-pad.co.jp/inspect/



More information about the Kansai-pm mailing list