議論/プロセス間通信/2003_11_09 の変更点



 * メモ
 #topicpath
 
 * メモ [#b7d1c88b]
 - pidToProcessName()
 - processNameToPid()
 
 * 現段階での実装の現実解をさぐる(2003/11/09 [[ひげぽん]])
 * 現段階での実装の現実解をさぐる(2003/11/09 [[ひげぽん]]) [#g6255198]
 
 *** Monaでメッセージに使えそうなもの
 *** Monaでメッセージに使えそうなもの [#mbcbaa9d]
 - システムコール(int 0x80)
 - 共有ページ(SharedMemorySegment)
 - コールゲート(IA32)
 
 --IA32ならコールゲートって手も無い? (2003/11/24 [[もなか]])
 --なるほどすっかり忘れてました。きちんとコールゲートを使ったことがないのがばればれですね。--[[ひげぽん]]2003/11/24
 *** 目指すべきもの
 *** 目指すべきもの [#n0a6d0f1]
 - 水平なメッセージング
 
 *** 直近でメッセージング機構を必要とするもの
 *** 直近でメッセージング機構を必要とするもの [#j6e24007]
 - キーボード入力処理(実験実装)
 ~
 ~
 ----
 *** 実験実装検討
 *** 実験実装検討 [#ueaf8f0b]
 - メッセージの送信を行うプロセス
 -- カーネル(正確にはキーボードハンドラ)
 - メッセージの受信を行うプロセス
 -- 不特定多数のカーネルプロセスまたは、ユーザープロセス
 -- ※メッセージの送受信は送信プロセス:受信プロセス=1:1を想定、複数のプロセスを対象としてメッセージを送信したい場合は、送信処理をプロセス数分別々に実行する必要がある。
 - メッセージ受信プロセスの前提事項
 -- メッセージの受信だけであればどのプロセスもデフォルトで可能としたい。
 -- メッセージの受信は受信プロセスが能動的に行う(PULL型?)
 --- recieve(メッセージのタイプ) return ヘッダとバイナリ
 --- recieve(メッセージのタイプ, 特定の相手から) return ヘッダとバイナリ
 --- recieve(特定の相手から) return ヘッダとバイナリ
 --- 果たして上3つのどれが適当であろうか?
 - メッセージ送信プロセスの前提事項
 -- 今のところ思いつかない
 - 受信プロセスを特定するキー
 -- PID・・・動的に決まるものなので×
 -- 共有メモリID・・・意図しないプロセスへメッセージ書き込みの可能性×
 -- プロセス名
 -- プロセス名 + 一意に特定する文字列
 *** 未整理・未消化
 *** 未整理・未消化 [#y61b8d86]
  map, unmap, lock, unlock, wakeup, new システムコール
 -map - 共有メモリのマップ
 -unmap - 共有メモリの解放
 -lock - mutex lock
 -unlock - mutex unlock
 -wakeup - タスク指定起動
 -new - タスク新規作成
 
  レジスタ渡し
 
 * 検討1 (2003/11/10)
 * 検討1 (2003/11/10) [#kbb74786]
 - syscall_send(pid, Msg* msg)
 ++ ユーザーモードでumallocまたは、自動変数としてセットしたMsgのポインタをシステムコールでカーネルに渡す。
 ++ カーネルモードでmallocしてMsg内容をコピー
 ++ msg* nullチェック
 ++ 相手先のプロセス構造体のMsg* msgにセット。
 - syscall receive(Msg* msg)
 ++ 自分のプロセス構造体Msg* msgから msgにコピー
 ++ msgnullセット
 - 欠点
 -- %%msg1つしか受け取れない(ためられない)%% HVectorで解決
 -- 1つのMessageを複数のプロセスに対して使いまわせない(誰が解放?)
 --- 参照カウント形式も考えられるが目的のプロセスがreceiveしてくれないとやはり解放されない。全プロセスに送信するような種類のメッセージはどうすればいいんだろう?
 - 2003/11/12に実装完了
 
 * 検討2 (2003/11/15)
 * 検討2 (2003/11/15) [#sd6860b7]
 - 第一弾実装の欠点をクリアすべく改良しよう。
 - 前提事項
 -- 各プロセスはマルチスレッドが実現されている。
 - 以下のような感じ
 + 送信元プロセスはメッセージを送信する
 + メッセージはメッセージサーバーが受信しサーバー内に蓄えられる。
 + 全てのプロセスはメッセージサーバーからメッセージを受信しなければならない
 + 全てのプロセスがメッセージを受信完了した時点でサーバー内からメッセージが削除される。
 + 各プロセスはメインスレッド以外に必ずメッセージ受信スレッドを持っている。
 + このメッセージ受信スレッドがメッセージを受信し、メッセージに応じた処理を行う。自分が所属するプロセスに関連のないメッセージであれば受信後破棄するだけである
 
 *** メッセージ
 *** メッセージ [#r7410fe6]
  typedef struct {
    dword header;
    dword arg1;
    dword arg2;
    dword arg3;
  } msg;
 
 *** ユーザーモードでのキー入力受信イメージ
 *** ユーザーモードでのキー入力受信イメージ [#p8f059f8]
  main() {
      char c = getchar();
      printf("key=%c", c);
  }
 
 ** コメント
 ** コメント [#j8c062b2]
 -参照カウント方式もまずいなあ。 -- [[[[ひげぽん]]]] SIZE(10){2003-11-14 (金) 22:02:36}
 -検討2はどうでしょう? -- [[[[ひげぽん]]]] SIZE(10){2003-11-15 (土) 20:43:49}
 -[受信プロセスを特定するキー]には、UUIDを使うとか全てのスレッドにIPv6アドレスを割り振るとかいう手もあるかと。 --  SIZE(10){2003-11-19 (水) 09:41:18}
 -受信スレッドを用意しても、メインスレッドとの同期で止められる事はよくあるとおもうので、分離する意味はあまりないような。常にブロードキャストという前提に無理があるんじゃないかなーと思いますが。昔、こんなシステムをつくった時は、受信スレッドにメッセージをぶら下げていきました。これならスレッド毎にメッセージを持つので破棄するタイミングで悩む事はありません。 --  SIZE(10){2003-11-19 (水) 17:20:10}
 -御意見ありがとうございます。整理すると。
 + 受信スレッドは同期のためとめられている可能性がある
 + ブロードキャスト前提は無理がある。
 + メッセージは受信スレッド毎にコピーを作ってやれば問題ない
 -1,3は了解です。その通りだと思います。2に関しては(a)カーネルのメッセージングとしてブロードキャストはナンセンス(b)メッセージの破棄を考えると工夫が必要(c)その他のうちどの意味合いでしょうか。 -- [[ひげぽん]]
 -通信路の信頼性(メッセージの到達可能性)とメッセージの到達の重要性によって判断されるべき問題と思いますよ。絶対届く保障があるなら送った時点でメッセージを削除しても(送信終了待ちをしなくても)なんら問題ない。メッセージの到達が重要でなければ、同様に削除しても(送信終了待ちをしなくても)問題ない。 -- [[もなか]] SIZE(10){2003-11-24 (月) 12:13:24}
 -なるほど、おっしゃるとおり二つのポイントがあるようです。私としては -- [[[[ひげぽん]]]] SIZE(10){2003-11-24 (月) 14:43:41}
 -- メッセージの到達可能性は100%保証すべき
 -- メッセージの重要性は各受信側の問題と捉えるべき
 - とおもうのでメッセージをある程度の時間後削除する方針が良いと思いました。
 -割と実装上の問題ではあるのですが「自分が所属するプロセスに関連のないメッセージであれば受信後破棄するだけである 」という判断を受信直後にやることも考慮に入れてよいと思います。IPプロトコルの語でいうなら、ブロードキャストではなくマルチキャストにするというか…。 -- [[もなか]] SIZE(10){2003-11-24 (月) 15:08:23}
 -なるほど。勉強になります。確かに受信直後削除でなんら問題はない気がします。 -- [[[[ひげぽん]]]] SIZE(10){2003-11-24 (月) 19:22:29}
 -プロセス(またはスレッド)がこのメッセージのみを待っていますと、事前に宣言する方式もありですよね。 -- [[[[ひげぽん]]]] SIZE(10){2003-11-24 (月) 19:23:08}
 --Xがそうです。
 -GUI部品などへのメッセージはサーバが受信し、GUI部品へ送信される -- [[[[ひげぽん]]]] SIZE(10){2003-11-24 (月) 20:45:50}

リロード   新規 編集 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.005 sec.