Open5
並行並列処理について
学習すること
- 並行並列処理とは何なのか
- マルチプロセスとマルチスレッドとの違い
- マルチコアとの関係
並行処理と並列処理
こちらの書籍で学習する
タスク実行方法の概念
逐次処理・並行処理・並列処理の3つの概念を説明
逐次処理(シーケンシャル)
名前の通りタスクを順番に一つずつ実行する方法。
一つの処理が終わったら次の処理が実行される。
並行処理(コンカレント)
シングルコアの場合に、複数のタスクのコンテキストを高速に入れ替えながら実行する方法。
ある時点においては一つのタスクしか実行していない。
並列処理(パラレル)
マルチコアを用いて複数タスクを真に同時に実行する方法
コンテキストとは
何らかのタスクで使用されるデータの状態。
タスクAが中断された場合、タスクAを再開するために中断された時点までのプログラムの実行状態を保存する必要がある。
chapter1 まとめ
- コンピュータ上で複数のコードを実行する仕組みを
マルチタスク
と呼ぶ - 実行単位が
スレッド
の場合、マルチスレッド - 実行単位が
プロセス
の場合、マルチプロセス - スレッド間では計算資源(要調査)を共有するためスレッドセーフにすることが大切
- マルチタスクの場合はタスクの実行をCPUが高速で切り替えており、これを「コンテキストスイッチ」と呼ぶ
- q) 並列処理においてはコンテキストスイッチは必要ない?(完全に同時実行しているため切り替える必要はない?)
- 並行処理と並列処理の違いをコンテキストから考えるを見るにコンテキストスイッチは並行処理でのみ起こる
- q) 並列処理においてはコンテキストスイッチは必要ない?(完全に同時実行しているため切り替える必要はない?)
「マルチスレッド/マルチプロセス・並列/並行」に関しては以下の記事がわかりやすかった
chapter2まとめ
-
pthread_create
関数でスレッドを作成できる -
pthread_exit
関数でスレッドを終了できる -
プロセスが終了するとプロセス内のスレッドは強制的に終了する
- exitで終了
-
q) プログラム開始時に生成されるスレッドとpthread_createで生成したスレッドは対等ではないのでは?
以下のようなコードの場合、threadFunc
で8秒の処理が行われているが、main関数の処理(メインスレッド)が5秒なのでthreadFuncもそれと同時に終了する。このコードではメインスレッドの終了が優先されているので、プログラム開始時に生成されるスレッドが優先される?
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
void *threadFunc(void *arg) {
for (int i = 0; i < 8; i++) {
printf("threadFunc %d\n", i);
sleep(1);
}
return NULL;
}
int main() {
pthread_t thread;
if (pthread_create(&thread, NULL, threadFunc, NULL) != 0) {
printf("Error: Failed to create thread\n");
exit(1);
}
for (int i = 0; i < 5; i++) {
printf("main thread %d\n", i);
sleep(1);
}
return 0;
}