ITパスポート 2015年 春期 問65
問題文
一つのアプリケーションプログラムの中で、並列処理が可能な部分を複数の処理単位に分け、それらを並行して処理することで、マルチコアCPUを使用したコンピュータの処理能力の有効活用を図る方式はどれか。
選択肢
ア:マルチウィンドウ
イ:マルチキャスト
ウ:マルチスレッド(正解)
エ:マルチブート
🔒 解説は解答すると表示されます
一つのアプリケーション内で並列処理を行う方式【ITパスポート 解説】
正解の理由
設問は「一つのアプリケーションプログラムの中で、並列処理が可能な部分を複数の処理単位に分け、それらを並行して処理することで、マルチコアCPUを使用したコンピュータの処理能力の有効活用を図る方式はどれか」と問うています。ここで注目すべきは「一つのアプリケーションの中で」「複数の処理単位に分け」「並行して処理する」「マルチコアCPUを有効活用」という点です。これらはプログラム内で複数のスレッド(thread:処理の流れ)を作って同時に動かす手法、すなわち ウ の「マルチスレッド(multi-thread)」に当てはまります。マルチスレッドは一つのアプリケーション内で複数の実行単位(スレッド)を並列に動かし、マルチコアを利用して処理速度を上げる設計です。
解法ステップ
- 問文のキーワードを拾う:「アプリケーションの中で」「複数の処理単位」「並行して処理」「マルチコアCPU」。
- 各選択肢の意味を思い出す:
- マルチウィンドウ:画面に複数のウィンドウを表示すること(UIに関係)。
- マルチキャスト:ネットワークで一対多の送信を行う方式。
- マルチスレッド:一つのアプリケーション内で複数スレッドを走らせる方式。
- マルチブート:一台のPCに複数OSを切り替えて起動する方式。
- 「アプリケーション内で処理単位を分ける」という記述と合致するのは ウ(マルチスレッド)であると判断する。
選択肢別の誤答解説
- ア: マルチウィンドウ
ウィンドウ(画面の窓)を複数持つことを指します。ユーザーインターフェースの話であり、CPUの並列利用とは直接関係ありません。 - イ: マルチキャスト
ネットワーク用語で、送信元から複数の受信先に同時にデータを送る技術です。並列処理というより通信の方式です。 - ウ: マルチスレッド
正解です。スレッド(処理の流れ)を複数作り、同時に動かしてCPUコアを有効活用します。 - エ: マルチブート
一台のコンピュータに複数のOSを入れ、起動時にどれを使うか選ぶ仕組みです。並列処理とは無関係です。
よくある誤解
- 「マルチスレッドすれば必ず速くなる」
- 実際は同期(ロック)やスレッド切替のオーバーヘッドで遅くなる場合があります。特に処理がほとんど共有資源のアクセスで占められると効果が出にくいです。
- 「スレッドとプロセスは同じ」
- プロセスはメモリ空間や資源を独立して持つ実行単位です。スレッドは同じプロセス内でメモリを共有する軽量な実行単位で、共有の扱いに注意が必要です。
- 「どの言語でもスレッドは常にCPUを並列利用する」
- 例:Python(CPython実装)の場合、GIL(Global Interpreter Lock:グローバルインタプリタロック)があり、CPUバウンドな処理では複数スレッドが同時に実行されないことがあります。
補足コラム
スレッドを使う場面の例:
- ウェブサーバ:複数の利用者から来るリクエストを同時に処理するためにスレッド(やプロセス)を使うことが多いです。
- 画像処理や科学計算の並列化:大きなデータセットを分割して各スレッドで同時に計算することで処理時間を短縮できます。
簡単なPythonのスレッド例(説明用):
import threading
import time
def work(id):
print(f"スレッド{id}開始")
time.sleep(1) # 時間のかかる処理の代わり
print(f"スレッド{id}終了")
threads = []
for i in range(4):
t = threading.Thread(target=work, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
注意:上のコードはI/O待ちなどで効果がありますが、CPUを激しく使う処理ではPythonのGILの影響で期待どおりの並列化にならないことがあります。そういう場合はマルチプロセス(multiprocessing)や、GILのない言語(Java、C++、Goなど)を使う選択肢があります。
FAQ
Q1: スレッドとプロセス、どちらを使えばよいですか?
A1: 並列にメモリを共有して軽い切替をしたいならスレッド。独立したメモリ空間で隔離したい、あるいはGILの影響を避けたいCPU重視の処理ならプロセス(マルチプロセス)を検討します。
A1: 並列にメモリを共有して軽い切替をしたいならスレッド。独立したメモリ空間で隔離したい、あるいはGILの影響を避けたいCPU重視の処理ならプロセス(マルチプロセス)を検討します。
Q2: マルチスレッドを使うとバグが増えますか?
A2: 増えやすいです。共有資源へのアクセスで競合(race condition)やデッドロック(相互待ち)といった問題が起きやすく、同期処理(ロックやミューテックスなど)の設計が重要です。
A2: 増えやすいです。共有資源へのアクセスで競合(race condition)やデッドロック(相互待ち)といった問題が起きやすく、同期処理(ロックやミューテックスなど)の設計が重要です。
Q3: 何個のスレッドを作ればよいですか?
A3: 一般的な目安は「CPUコア数」や「I/O待ち時間の割合」に依存します。CPUバウンドならコア数付近、I/Oバウンドならもっと多めでも有効です。実際は測定して調整するのが安全です。
A3: 一般的な目安は「CPUコア数」や「I/O待ち時間の割合」に依存します。CPUバウンドならコア数付近、I/Oバウンドならもっと多めでも有効です。実際は測定して調整するのが安全です。
関連キーワード: マルチスレッド、スレッド、プロセス、マルチコア、並列処理、同時実行、スレッドセーフ、GIL

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

