18 Feb 2014, 13:28

スレッドとタスクの違いについてしらべてみた(C++/Linux)

今日、タスクとスレッドの違いについて質問された。

うまく説明できなかった。

人間失格。

ということで、ここで反省しようと思う。

タスクとスレッドの定義について

Wikipediaから引用する。

スレッド

<div class="outline-text-4" id="text-1-0-1">
  <blockquote>
    <p>
      スレッド(thread)とは、CPU利用の単位。<br /> プロセスに比べて、プログラムを実行するときのコンテキスト情報が最小で済むので切り替えが早くなる。<br /> スレッドは、thread of execution(実行の脈絡)という言葉を省略したものである。
    </p>
  </blockquote>

  <blockquote>
    <p>
      ある処理を単一のスレッドのみを用いて動作させる環境もしくは手法をシングルスレッドという。<br /> 対して、複数のスレッドが同時に動作することをマルチスレッドという。<br /> プログラム(概ねプロセス)の開始時にはメインとなるスレッドが動作する。<br /> 必要に応じてその他の処理をするスレッドを作り、実行させる事も出来る。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)">スレッド (コンピュータ) &#8211; Wikipedia</a>
    </li>
  </ul>
</div></p>

タスク

<div class="outline-text-4" id="text-1-0-2">
  <blockquote>
    <p>
      1つのタスクは、1つ以上のプロセスから構成され、1つのプロセスは、1つ以上のスレッドから構成される。
    </p>

    <p>
      プロセスと同義。スレッド (コンピュータ)と同義。タスク並列性などの用語では両者を区別しない場合もある。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BF%E3%82%B9%E3%82%AF">マルチタスク &#8211; Wikipedia</a>
    </li>
  </ul>

  <blockquote>
    <p>
      OSから見た処理の実行単位。<br /> 通常はスレッドが実行単位となるが、OSによってはプロセス(複数のスレッドを含むプログラム全体)を1つの実行単位としてみる場合もある。<br /> 一つのアプリケーションソフトが行っている作業全体を一つのタスクと扱う場合が多く、この場合は「プロセス」に近い意味合いになる。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://e-words.jp/w/E382BFE382B9E382AF.html">タスクとは 【 task 】 &#8211; 意味/解説/説明/定義 : IT用語辞典</a>
    </li>
  </ul>
</div></p>

調査結果

<div class="outline-text-3" id="text-1-1">
  <p>
    わからん。
  </p></p>
</div></p>

C++からアプローチ

C++11では、threadライブラリがあるので、使ってみる。

 g++ thread.cpp  -pthread -std=c++11 -Wl,--no-as-needed

実装結果

<div class="outline-text-3" id="text-2-1">
  <p>
    わからん。
  </p></p>
</div></p>

タイマをつかって比べてみる

タイマをつかってみた。

スレッドライブラリをつかったマルチスレッドプログラムは5秒かかる。

スレッドライブラリをつかってないシングルスレッドプログラムは15秒かかる。

実装結果

<div class="outline-text-3" id="text-3-1">
  <p>
    ちょっとわかった。
  </p></p>
</div></p>

まとめ

C++/Linux環境だと、コンパイルした a.outを実行したものがタスク(プロセス?)

% ./a.out &
% ps
  PID TTY          TIME CMD
11484 pts/5    00:00:00 a.out

ひとつのプログラムのなかに複数のスレッドが動ける。

これはシングルスレッドかつシングルタスク。


int main()
{
  std::cout << "hello thread" << std::endl;
  return 0;
}

これはマルチスレッドかつシングルタスク。


int main()
{
  thread th(  std::cout << "hello thread" << std::endl; );
  thread th2(  std::cout << "hello thread" << std::endl; );
  th.join();
  th2.join();
  return 0;
}

これはマルチタスク。


 % ./a.out &
 % ./a.out &
 % ps
  PID TTY          TIME CMD
 8668 pts/5    00:00:00 a.out
 8874 pts/5    00:00:00 a.out

結論

<div class="outline-text-3" id="text-4-1">
  <p>
    結局、わからん。
  </p></p>
</div></p>