並行性 (Concurrency)
並行処理とは、プログラムの異なる部分が順不同または並列に実行され、独立して進捗できる能力のことです。
コンピューティングにおける並行処理は、システムが複数のタスクまたはプロセスを、あたかも同時であるかのように処理できるようにします。タスクは、厳密にシーケンシャルではなく、インターリーブされた方法で実行でき、それぞれが独立して進捗できます。これにより、システムの応答性とリソース利用率が向上します。プロセッサがタスク間を高速に切り替えるタイムシェアリングのような技術は、同時実行の幻想を作り出します。複数のプロセッサを必要とする真の並列処理は、実際に同じ瞬間にタスクを実行します。並行処理は、オペレーティングシステム、サーバー、GUIにとって不可欠であり、システム全体のブロックなしに多数の操作を管理します。
graph LR
Center["並行性 (Concurrency)"]:::main
Pre_thread["thread"]:::pre --> Center
click Pre_thread "/terms/thread"
Pre_process["process"]:::pre --> Center
click Pre_process "/terms/process"
Rel_parallelism["parallelism"]:::related -.-> Center
click Rel_parallelism "/terms/parallelism"
Rel_identity_and_access_management_iam["identity-and-access-management-iam"]:::related -.-> Center
click Rel_identity_and_access_management_iam "/terms/identity-and-access-management-iam"
Rel_pipelining["pipelining"]:::related -.-> Center
click Rel_pipelining "/terms/pipelining"
classDef main fill:#7c3aed,stroke:#8b5cf6,stroke-width:2px,color:white,font-weight:bold,rx:5,ry:5;
classDef pre fill:#0f172a,stroke:#3b82f6,color:#94a3b8,rx:5,ry:5;
classDef child fill:#0f172a,stroke:#10b981,color:#94a3b8,rx:5,ry:5;
classDef related fill:#0f172a,stroke:#8b5cf6,stroke-dasharray: 5 5,color:#94a3b8,rx:5,ry:5;
linkStyle default stroke:#4b5563,stroke-width:2px;
🧒 5歳でもわかるように説明
複数の注文をこなすシェフを想像してみてください。彼はある料理のために野菜を切りながら、別の料理のスープを煮込み、そして3番目の料理のためにパンを焼きます。シェフはすべての作業を全く同じ瞬間にこなしているわけではありません(それは並列処理です)、しかし、一つの注文が他のすべてを停止させることなく、すべての食事が準備されるように、効率的にタスクを切り替えています。これにより、キッチンはスムーズに運営され、より早く食事を提供できます。
🤓 Expert Deep Dive
並行処理は、複数の計算が時間的に重複することを許可する設計原則であり、以下を通じて管理されます。
タスクスケジューリング: OSスケジューラはCPU時間をプロセス/スレッドに割り当て、同時実行の幻想を作り出します。
非同期プログラミング: コールバックやasync/awaitのようなパターンを使用して、ブロッキングなしで結果を管理し、操作はメインフローから独立して進行します。
マルチスレッディング: プロセス内の複数のスレッドは並行して実行され、メモリを共有します。同期プリミティブ(ミューテックス、セマフォ)は、競合状態を防ぎ、データ整合性を保証します。
メッセージパッシング: 分散システム/アクターモデルでは、並行処理は、分離されたプロセスまたはアクター間のメッセージ交換を通じて管理されます。
主な課題には、共有リソースの管理、デッドロック/ライブロックの回避、アトミック性の保証が含まれます。並行処理(一度に複数のことを扱う)は、並列処理(一度に複数のことを行う)とは異なります。並行処理は並列処理なしで存在できます。