並行/並列処理と非同期処理
web系のアプリケーションでは人とのインタラクションを考慮する必要があり、マイクロセカンド単位で動作する機械と秒単位で動作する人との圧倒的に異なる時間軸の調整を行う必要が出てくる。それらを実現するメカニズムが非同期処理や並列処理とよばれる機能になる。
ここで、非同期処理とは、何かの処理を呼んだ後その処理が終了するまでに時間がかかり、その間に別の処理を行う事を言う。例えばUIのボタンを人が押す処理を考えると、プログラム上では一旦ボタンを押す事を検知する関数を呼び出していても、実際に押されるまでには時間がかかり、その間に別の処理を行うというものになる。
この処理を行わないと、ある関数の実行が終了するまで他の処理がストップすることになりプロセスの実行に大幅な遅延を生じる。また無計画にコーディングすると非同期処理が複雑になったりループを生じたりして、動作が止まったり極端に遅くなるJavascriptで言われるコールバック地獄(Callback Hell)になるような弊害も生じる。
並列処理の定義は、複数のタスクを同時に実行するケースで、プロセスをいくつかの小さな実行単位に分割し(スレッドと呼ぶ)それを切り替えながら処理するマルチスレッド処理と呼ばれるものとなる。
マルチスレッドの処理には、並列(Parallel)処理と並行(concurrent)の二つの分類があり、並行処理は複数のタスクをバラバラにして効率的に動くように並べ替えて動くものとなり、コンピューターの中では常に一つの仕事しか行っていないものとなる。並列処理はマルチCPU等を使ってコンピューターの中で同時に複数の仕事を行っているところが並行処理との違いとなる。
並行処理は先述のUIを含めたI/O等の実質上時間がかかる処理と、計算のみの短時間で終わる処理をうまくより分けて実行する主にOSの中での処理に使われ、並列処理は計算処理そのものを細かく分け同時に実行させる深層学習のようなタスクに使われる。
並列処理も非同期処理に必要な技術としては、バラバラに分解したスレッドをうまく並び替えるスケジュール機能や、処理中のデータをどのような形でスレッド間で共有するかというメモリ管理機能等がある。実現する為のキー技術は、処理中のデータをどう扱うかにある。
プログラミング言語にはそれぞれそような並行/並列処理と非同期処理を行う機能が実装されている今後それらの具体的な例を紹介していきたい。
コメント
[…] 前回、並行/並列と非同期処理の概要について述べた。今回はいくつかの言語で実際に確認する。 […]
[…] 並列並行処理と非同期処理 概要 […]