iex -S mix
で起動しますFAServer.start_link(taskseed, engineseed, tasknumlimit)
でAlgoServer,Device,Relay,Engineを表すプロセスが起動します(開発時はFAServer.start_link(100, 10000, 100)
で起動しています)taskseed
: タスク生成時間間隔・タスクの重さflo の乱数シードengineseed
: engine flops, R-R Network Delay&BW の乱数シードtasknumlimit
: 1タスクセットのタスク数
FAServer.start_assigning()
でタスク生成を開始します- 応答時間・cluster利用コスト・Rela間通信遅延のデータが
responsetime.txt
,clusterfee.txt
,RtRDelay.txt
に保存されていき、 各タスクセットの平均がresponsetime_average.txt
,clusterfee_average.txt
,RtRDela_average.txt
に出力されます。 Giocci_enddevice.ex
のhandle_cast(:set_algo)
で指定された試行の終了後、(RuntimeError) end
のメッセージを出力して終了します(エラーメッセージですが正常動作です)。
1タスクセットの割付・処理が終了すると、各種パラメータをリセットし、同じタスクセットの割付が始まります。
各試行で用いる割付アルゴリズムは Giocci_enddevice.ex
の36~41行目 handle_cast(:set_algo)
で指定できます。
パラメータ | ファイル | 設定箇所 |
---|---|---|
relay間通信遅延 | fairly_algorithm_server.ex |
28行目付近 |
計算資源利用コスト定義に用いる変数a,b | fairly_algorithm_server.ex |
costmodel (565行目付近) |
device, relay, engine の数 | fairly_algorithm_server.ex |
relayrandomseed (566行目付近) |
各試行で用いる割付アルゴリズム | Giocci_enddevice.ex |
:set_algo |
タスク生成間隔時間・タスクの重さ | Giocci_enddevice.ex |
:create_task |
応答時間予測値の計算方法・応答時間予測値の計算におけるパラメータr | Giocci_relay_server.ex |
:initialize_clusterinfo |
engine flops: | Giocci_engine_server.ex |
:initialize_engineinfo |
- API関数
- start_link(taskseed, engineseed, tasknumlimit)
- AlgoServer,Device,Relay,Engineを表すプロセスを起動する
- taskseed: タスク生成時間間隔・タスクの重さflo の乱数シード
- engineseed: engine flops, R-R Network Delay&BW の乱数シード
- tasknumlimit: 1タスクセットのタスク数
- start_assigning()
- タスクの生成・割付・処理を開始する
- stop_assigning()
- タスクの生成・割付・処理を終了する
- 通常は指定された数のタスクを処理して自動終了するため、この関数を使う必要はない。
- start_link(taskseed, engineseed, tasknumlimit)
- 内部関数
- handle_call :get_relaymap
- fairly-algorithm serverの状態変数mapを返す
- handle_call {:append_relayinfo, pid, relayinfo}
- fairly-algorithm serverの状態変数mapに(key:新規relayのPID, val:新規relayの状態変数)を追加
- handle_call {:append_relaynetwork_feature_table, relaynetworkseed}
- relay間通信路の通信遅延(・帯域幅)を乱数生成し、fairly-algorithm serverの状態変数mapに保存
- handle_cast :initialize_tasknum
- 生成されたタスク数のカウンターを初期化
- handle_call {:append_tasknumlimit, tasknumlimit}
- FAServer起動時の第3引数で与えられた、1タスクセット当たりのタスク数をfairly-algorithm serverの状態変数mapに保存
- handle_cast {:initialize_creating_task_flag, initial_flag}
- fairly-algorithm serverでは各Deviceがタスクを生成する状態にあるかどうか(true/false)を、Deviceが接続しているRelay単位で管理している。本関数は、Deviceが存在するrelayに対し、そのタスク生成状態(true/false)をinitial_flagに設定する。
- handle_call {:assign_algorithm, device_connected_relaypid, task}
- relayからの問い合わせに応じて、タスクの割付先Clusterを決定する。
- handle_cast {:relay_finish_handling_task, relaypid}
- あるrelayに接続する全てのDeviceでタスク生成が終了したときに、relayから自動的に呼び出される。そのrelayがタスク生成状態にあるかどうか(true/false)を示すfairly-algorithm server内の情報をfalseに設定する。その後、:wait_for_tasklistsを呼び出す。
- handle_cast :wait_for_tasklists
- 全てのClusterで処理待ちタスクがなくなるまで待機する。その後:initialize_parametersを呼び出す。
- handle_cast :initialize_parameters
- 各種変数の初期化処理を行い、次のタスクセットのシミュレーションを開始する。
- handle_cast {:update_relaymap, relaypid, new_relayinfo}
- 各Cluster単位の計算資源情報をfairly-algorithm server上の状態変数へ更新する。ここでは処理の簡単化のため、relayの状態変数をまるごとコピーしているが、本来Cluster単位の情報だけでよい。
- handle_call :get_relaymap
- API関数
- start_link(deviceinfo)
- FAServer.start_link()内で自動的に呼ばれるため、通常この関数を使う必要はない。
- start_link(deviceinfo)
- 内部関数
- handle_cast :taskflag_true
- Deviceのタスク生成状態をtrueにする。
- handle_cast :taskflag_false
- Deviceのタスク生成状態をfalseにする。
- handle_cast {:set_randomseed, seed}
- Device内の処理に用いるランダムシードを設定する。
- handle_cast {:set_algo, algonum}
- n回目のシミュレーションでどの資源配分手法を用いるかを設定する。
- handle_cast :create_task
- タスクを生成する。
- handle_cast :taskflag_true
- API関数
- start_link(randomseed, costmodel)
- FAServer.start_link()内で自動的に呼ばれるため、通常この関数を使う必要はない。
- start_link(randomseed, costmodel)
- 内部関数
- handle_call {:append_engineinfo, pid, engineinfo}
- relayの状態変数に、新規engineの情報を追加する。
- handle_call {:append_deviceinfo, pid, deviceinfo}
- relayの状態変数に、新規deviceの情報を追加する。
- handle_cast :initialize_clusterinfo
- cluster単位の計算資源情報clusterinfoを初期化する。
- handle_call :update_clusterinfo
- cluster単位の計算資源情報clusterinfoを更新する。
- handle_cast {:send_task_response_time_in_cluster, processed_task, task_response_time_in_cluster}
- cluster内処理時間の実測値・発生した計算資源利用コストをファイルへ記録する。
- その後、cluster内処理時間の実測値を用いて、cluster内処理時間の予測値を更新する。
- handle_cast {:record_responsetime, processed_task}
- 応答時間を測定し、記録する。
- handle_call :get_relayinfo
- relayの状態変数を返す。
- handle_cast :start_assigning
- 各Deviceのtaskflagを変更し、タスクを生成する状態にする。 handle_cast :stop_assigning
- 各Deviceのtaskflagを変更し、タスクを生成しない状態にする。
- handle_call {:assign_request, task}
- Deviceからタスクのオフロード依頼を受け、割付先Clusterを資源配分サーバに問い合わせる。
- handle_cast {:assign_task_in_cluster, task, rtr_delay}
- 自分のClusterに割り付けられてきたタスクについて、その割付先Engineを決定し、割り付ける。
- handle_cast {:update_engine_taskque_in_enginemap, task, assigned_engine_pid}
- relayが持っている、Engine上のタスクキュー情報を更新する。
- handle_cast {:update_enginemap, enginepid, new_engineinfo}
- engineの状態変数を受け取り、relayの状態変数内に記録する。
- handle_cast {:device_finish_creating_task, devicepid}
- Deviceから、そのDeviceがタスクを生成しない状態になった(taskflagがfalseになった)という通知を受け、relayの状態変数内の情報を更新する。自Relayに接続する全てのDeviceでタスクを生成しない状態になったとき、:relay_finish_handling_taskを呼び出す。
- handle_call :initialize_clusterinfo_and_taskseed
- clusterinfoやランダムシード値を初期化し、次のシミュレーションで同じタスクセットを再現できるようにする。
- handle_call {:append_engineinfo, pid, engineinfo}
- API関数
- start_link(engineinfo)
- FAServer.start_link()内で自動的に呼ばれるため、通常この関数を使う必要はない。
- start_link(engineinfo)
- 内部関数
- handle_call :get_engineinfo
- engineの状態変数を返す。
- handle_call :initialize_engineinfo
- engineの状態変数を初期化する。
- handle_cast :update_engineinfo
- engineの計算資源情報をRelayへ送信する。ここでは簡単のため、engineの状態変数を丸ごと渡している。
- handle_cast {:assign_task_to_engine, task, rtr_delay}
- Relayからタスクを引き受け、engineのタスクキューへ格納する。
- handle_cast :process_a_task
- タスクを処理する。タスクキューが空でない場合、再帰的に実行される。
- handle_call :get_engineinfo
- 佐々木 大祐,柏崎 礼生,大崎 充博,西内 一馬,中川 郁夫,菊地 俊介,菊池 豊,細合 晋太郎,高瀬 英希:5G通信網向け資源透過型プラットフォームにおけるMECサーバ間の資源配分手法,情報処理学会研究報告 インターネットと運用技術(IOT),Vol. 2023-IOT-60, No. 3, pp. 1-8 (2023). (IPSJ電子図書館)
If available in Hex, the package can be installed
by adding tinker_bell_sim
to your list of dependencies in mix.exs
:
def deps do
[
{:tinker_bell_sim, "~> 0.1.0"}
]
end
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/tinker_bell_sim.