マエカワの備忘録的な何か

思い立ったが吉日

オペレーティングシステム 其の六 20170531

スレッドについて(スレッドとはプロセス内の処理の流れ)

写真を挿入

 ブロックされると困ってしまうプログラムがある場合、スレッドという概念が力を発揮する.

 困ってしまう例①
  ユーザーの入力待ちの間、アニメーションが止まってしまう.
   →この場合、入力街でブロックされるスレッドと、アニメーションを動かすスレッドを分岐させれば解決する.

写真を挿入

 困ってしまう例②
  クライアントの応答を待っているとき、ほかのクライアントの接続を要求したい.
   →接続状況に応じてプロセスを派生させたら解決できる.

写真を挿入

 困ってしまう例③
  複数のシステムを管理する場合、一つずつ確認していては時間がかかりすぎる.
   →下の写真のように元から複数に分岐させたら短時間で処理が終了する.


 上の例のように一つのプロセスの中で処理の流れを複数持ちたい時が結構ある.
  →しかし、処理単位が小さいと、それに合わせて複数のプロセスを生成するのは結構しんどい
   →プロセスの生成などに伴う余分な処理(オーバーヘッド)を減らしたい.

 こんな時にスレッドの出番.スレッド≒軽量プロセスと覚えておけば問題はない.

 スレッドの処理の流れはC言語の関数の概念に似ている.
  →レジスタ(CPUに入っている)とスタック(メモリに領域がある)が必要.裏を返せば、レジスタとスタック以外は共通のリソースを使っていることになる
  →スレッドのスイッチングはレジスタを切り替えるのみでOK!
  →実行するコードと処理に必要なデータの入っているスタックが変わる.
   →プログラムカウンタとスタックポインタが切り替わるということ.これだけ変えればOK

 プロセスのコンテキストスイッチの時はメモリ、ヒープ、コード領域すべてを取り換えていた.これと比較すると、スレッドのスイッチングがいかに軽量であるかがわかる.

マルチスレッドのプログラム

 スレッドライブラリ
  スレッド管理のための関数をまとめたもの.Linuxではpthreadが一般的.

 スレッドのAPIは標準化されている.
  ・POSIX(OSのAPI
   →OSによってスレッドの詳細はだいぶ異なる.その差を埋めるための措置になっている.

 pthreadについて少し.

写真を挿入

  ・fork、execとほとんど同じ構造になっている.
  ・pthread_creatを複数書けば、複数スレッドを生成可能

スレッド間の通信について

 メモリは共有しているので、スレッドどうしのデータを通信(やり取り、共有)することができる

スレッドの注意点

 同時に実行してしまうことによる障害も起こってくる
 例えば、"hello"と"*****"をそれぞれ出力するスレッドを同時に走らせたとする.この時出てくる結果は"hello *****"に必ずなるとは限らない."h**el*lo**"みたいな感じになることもある.
  →この状態のことを「競合(collision)」と呼ぶ.

スレッドの種類

 OSが管理するスレッド:カーネルレベルスレッド
 ユーザが管理するスレッド:ユーザーレベルスレッド

 カーネルレベルスレッドはちょっと重い.