3日ブログ
2013年8月25日日曜日
minstrel の概要
・よくある RSSI を用いたレート制御は、マルチパスを考慮していないため、適切なレートになっていないことがある。
・minstrel は mac80211 上に実装されているが、もともと MadWifi の一部だった。さらには、博士論文にまでさかのぼる。
・全レートを試し、あるレートで送信成功ならそのレートを使い、失敗なら使わないようにする。
・どのレートで送信成功・失敗したかの記録を全てとっておき、基本的には送信成功しそうなレートを使っていく。
ときどき、最適と思われるレート以外のレートも使って、送信成功するようになったかの調査を行う。
・(再送などにより)送信に著しく時間がかかると、Linux カーネルの TCP 実装では次のフレームの送信を遅らせるようになっている。
・4回再送できるとしたら、再送のレートは次の順序で出す。
最速のスループットが出るレート・2番目に速いスループットが出るレート・もっとも送信成功しやすいレート・基本のレート
ただし、スループットの定義は、(そのレートでの送信成功率)× (そのレート [Mbps])
・EWMA(指数加重移動平均) により、古い結果より最近の結果を重要視するので、環境の変化に追随できる。
2013年6月23日日曜日
相関を持つ乱数の生成
相関を持つ正規分布な乱数を生成するためには、コレスキー分解を用いる。
下記はその確認用の matlab プログラム。
大きさ 1 を持つ N x 4 個の複素数の乱数 x を生成する。
実部・虚部それぞれが標準正規分布している。
また、4 列の列方向の乱数列どうしはそれぞれ独立である。
相関行列 corrcoef(x) の i,j 成分が対角成分以外ほぼ 0 になることから確認できる。
複素相関行列 R のコレスキー分解 chol(R) の下三角行列を x に乗算して、
相関のある乱数列 y を得ることができる。
y の相関行列 corrcoef(y) を計算すると、もとの R とほぼ等しくなっている。
下記はその確認用の matlab プログラム。
大きさ 1 を持つ N x 4 個の複素数の乱数 x を生成する。
実部・虚部それぞれが標準正規分布している。
また、4 列の列方向の乱数列どうしはそれぞれ独立である。
相関行列 corrcoef(x) の i,j 成分が対角成分以外ほぼ 0 になることから確認できる。
複素相関行列 R のコレスキー分解 chol(R) の下三角行列を x に乗算して、
相関のある乱数列 y を得ることができる。
y の相関行列 corrcoef(y) を計算すると、もとの R とほぼ等しくなっている。
N = 10000; x = 1/sqrt(2) * (randn(N,4) + randn(N,4) * I); corrcoef(x) # correlation matrix of y r = [ 1, -0.7+0.2I, 0.2+0.4I, -0.5+0.1I; -0.7-0.2I, 1, 0.3-0.2I, 0.4-0.2I; 0.2-0.4I, 0.3+0.2I, 1, 0.3+0.1I; -0.5-0.1I, 0.4+0.2I, 0.3-0.1I, 1] y = transpose(chol(r, 'lower') * transpose(x)); corrcoef(y) # correlation matrix of y
2012年10月18日木曜日
関数の入口出口で関数を呼ぶには
gcc でコンパイルする場合、関数の入口と出口で別の関数を呼ぶことができる。
まず、コンパイル時に -finstrument-functions を付けて、コンパイルしておく。
すると、各関数の入口と出口で
void __cyg_profile_func_enter(void* func_addr, void* call_site);
void __cyg_profile_func_exit(void* func_addr, void* call_site);
が呼ばれるので、これらの関数を共有ライブラリとして用意しておいて使う。
まず、コンパイル時に -finstrument-functions を付けて、コンパイルしておく。
すると、各関数の入口と出口で
void __cyg_profile_func_enter(void* func_addr, void* call_site);
void __cyg_profile_func_exit(void* func_addr, void* call_site);
が呼ばれるので、これらの関数を共有ライブラリとして用意しておいて使う。
2012年10月17日水曜日
あるカーネルモジュールで定義したグローバル変数を別のモジュールから参照する
あるカーネルモジュールで定義したグローバル変数を別のモジュールから参照する。
まず、最初のカーネルモジュール A で外部に見せたい変数を EXPORT_SYMBOL() で囲む。
次に、別のカーネルモジュール B で、その変数を参照するわけだが、これで通常のコンパイルをすると、その変数は undefined だと言われる。
これを解決するためには、カーネルモジュール B をコンパイルする際に、
make -C ... M=... KBUILD_EXTRA_SYMBOLS=<path>/Module.symvers modules
のように、KBUILD_EXTRA_SYMBOLS にモジュール A の Modules.symvers のパスを指定するとうまくいく。
まず、最初のカーネルモジュール A で外部に見せたい変数を EXPORT_SYMBOL() で囲む。
次に、別のカーネルモジュール B で、その変数を参照するわけだが、これで通常のコンパイルをすると、その変数は undefined だと言われる。
これを解決するためには、カーネルモジュール B をコンパイルする際に、
make -C ... M=... KBUILD_EXTRA_SYMBOLS=<path>/Module.symvers modules
のように、KBUILD_EXTRA_SYMBOLS にモジュール A の Modules.symvers のパスを指定するとうまくいく。
2012年9月23日日曜日
syslogd
syslog は UNIX domain socket を利用しているので、カーネルのコンフィギュレーションで UNIX domain socket をサポートさせるようにしないと利用できない。
2012年9月17日月曜日
登録:
投稿 (Atom)