by shigemk2

当面は技術的なことしか書かない

BSDカーネルの設計と実装 読書会 (28) #readDaemon

11. プロセス間通信

途中参加です

ロック

http://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A3%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%83%AD%E3%83%83%E3%82%AF

http://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%83%E3%82%AF_%28%E6%83%85%E5%A0%B1%E5%B7%A5%E5%AD%A6%29

プロセスやスレッドにたいしてアクセス制限を課すのがロックで、スレッドがカーネル空間に入る際に単一の大域的なロックを獲得してスレッドがユーザー空間に戻る際にロックを開放するのがジャイアントロック

それをやっている最中は他のプロセスはカーネルに入ることは出来ないロックで、欠点としては効率が非常に悪いことがあげられる

http://ja.wikipedia.org/wiki/%E5%AF%BE%E7%A7%B0%E5%9E%8B%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0

単一CPUだと比較的有効だけども、マルチコアCPUだと対応しきれないので、ジャイアントロックをやめる方向で開発が進められていた。

特定のCPUに非対称的に割り付けられた処理に依存する事無く、全てのCPUに対して対称的、均一的に処理が割り付けられた複数プロセッサによる並列処理方式

(大域)

接続の確立

2つのプロセスの情報交換について

  • connect
  • listen
  • accept

状態遷移

接続キュー(待ち行列) http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A5%E3%83%BC_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29

プロトコル層(トランスミッション層)でソケットの状態を見る

状態遷移は図11-10を参照のこと

プロセスの覚醒

Server Client

サーバーからのデータを待っているときは、プロセスは停止状態で、データを待っているタイムラグが存在する。 データを受け取った時に、プロセスの停止状態を解除し、処理を続行する。

待っている処理を起こす。(OS用語)

awaken

データ転送

ソケット層の仕事はモジュール化されて独立されている。

データの送受信を行うシステムコールは複数存在する←これについては、単一のインターフェイスを求める声もあるが、高い汎用性を求められるため、実装は困難であった。

データの送信

sosend()関数を使い、ほとんどのソケットレベルのデータ伝送オプションを扱う

ネットワーク層のフラグメンテーションを避ける

データが意図せず小さな断片になってしまうこと。

http://www.wdic.org/w/TECH/mbuf

BSDがカーネル内で用いるデータ構造。小さな固定長のバッファをポインタで結ぶ、連結リスト形式のバッファ。ポインタで結ばれる一つのリスト烈をmbufチェーンと呼び、複数のチェーンをまとめて一つのキューレコードとなる。

ネットワークが遅いときは、それをサポートする仕組みが必要→データを分割せずに、ちょっと待ってもらう(でもこの方法の効果は微々たるもの)

データの受信

soreceive()関数で、ソケットに溜まったデータを受信する。

具体的には、ソケットと受信データバッファの状態を検査してキュー上のデータを処理する。

バッファ データを一時的に蓄えておく記憶装置や記憶領域のこと

1バイト=8ビット

http://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%AF%E3%83%86%E3%83%83%E3%83%88_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29

  • メッセージにはいくつかの情報が含まれる
  • 送信者のアドレス
  • 補助データ
  • 通常データ

プロセスの休眠と覚醒は一対の関係

ソケットのシャットダウン

  • closeシステムコール
  • closeが遅れた場合は、close処理だけ終了しておいてデータは非同期に送信する
  • LINGERオプションをつけるとcloseを待たせることが出来る

ローカルなプロセス間通信

IPC 複数のプロセス間でデータをやり取りするための仕組み http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1

ローカルIPC機能がSystem Vから移植されている

http://www.atmarkit.co.jp/aig/03linux/systemv.html

サブシステム それ自体がひとつのシステムで、個々の構成要素が組み合わされて全体としてひとまとまりの機能を発揮する

セマフォ

Mutex http://www.fireproject.jp/feature/c-language/pthread/pthread_mutex.html

セマフォ 並行して動作しているプロセス間で同期を取ったり割り込み処理の制御を行う機構のこと

BSDのセマフォはデッドロックから保護できるように配列としてグループ化

複数のプロセスが同時に部分的なエントリを作成してしまわないようにジャイアントロックを採用している

セマフォの値がマイナスのときは使えない

休眠するのは資源が使われてしまっているとき

使える資源の数が限られている

ミューテック(mutex)

P134

  • スレッドの同期を行うための主要な仕組み
  • 競合しないミューテックの取得と解放は軽く実装する
  • ミューテックは、優先度の伝搬をサポートするための情報と記憶領域を備えている
  • ミューテックの再帰をサポートするように初期化されている場合は、スレッドによるミューテックの再帰的取得が可能であること

休眠するタイプとしないタイプがあるとのこと

メッセージキュー

型をもつ任意長のメッセージの送受信を可能とする

mtype mtextの2種類のデータ構造がある

FIFOキューとしても優先度つきキューとしても使える

キューごとにミューテックがあるわけではない

FIFO(ファイフォ フィフォ)先入れ先出し

マイクロカーネルはなんでもかんでもメッセージでやりとりするらしい

共有メモリ

2つ以上のプロセスの間で大規模なデータを交換するために用いられるやつ。セマフォと組み合せて使われることが多い

処理の大部分を仮想記憶システムに依存しているので実装は単純

12. ネットワーク通信

FreeBSDで提供されるネットワークサブシステムの内部構造

(第一版だとIPv4の話しかしてない)

  • ネットワークアーキテクチャ
  • プロトコルファミリ
  • アドレスファミリ
  • 付加機能

11章はソケットを中心とした話 12章はネットワークまわりの内部構造

  • 12.1 内部構造
  • 12.5 プロトコルとサービス
  • 12.6 バッファ管理
  • 12.7 RAWソケット
  • 12.8 雑多な問題

内部構造

  • プロセス間データトランスポート
  • ネットワーク間のアドレス管理とメッセージルーティング
  • 伝達メディアサポート

ネットワークサブシステム

  • トランスポート層
  • ネットワーク層
  • ネットワークインターフェース層

OSI参照モデルに準拠している。

このサブシステムはユーザが直接参照することはない。

これらの階層はあくまで論理的なもの。

アプリ←諸々←NIC←イーサネット

この流れで、様々なヘッダがデータに付与されていて、プロトコルごとに情報が減っていく。(逆の流れだと情報が増える)

ポーリング 監視(ずっと待っているので負荷がかかる)

さすがに40キロ走ったらしんどいですね。

とかく難しく、FreeBSDに限らない一般的な用語がそもそもわからないので、Wikipediaとか眺めていたい