Grand Central Dispatch(GCD)とは?Appleの並列処理技術の仕組みと使い方
Grand Central Dispatch(GCD)とは
Grand Central Dispatch(GCD)は、AppleのMac OS XおよびiOS向けに提供されている並列処理技術です。C言語への拡張機能、API、そしてランタイムライブラリを組み合わせたものであり、アプリケーション開発者がコードのうち並列に実行したい部分を明示できるようにするものです。OpenMPと同様に、GCDはスレッド管理に関する詳細な処理のほとんどを自動的に担ってくれるため、開発者はマルチスレッドプログラミング特有の複雑さを意識せずに済みます。
ブロック(Blocks)という作業単位
GCDでは、C言語およびC++言語に対する拡張機能として「ブロック」が定義されています。ブロックとは、自己完結型の作業単位のことです。記述方法は非常にシンプルで、波括弧 { } の手前にキャレット ^ を付けるだけで表現できます。
{
^printf("This is a block");
}ディスパッチキューによるスケジューリング
GCDは、ブロックを「ディスパッチキュー」へ登録することで、実行時のスケジューリングを行います。キューからブロックを取り出す際には、GCDが管理するスレッドプールの中から空いているスレッドへそのブロックを割り当てます。ディスパッチキューには「シリアルキュー」と「コンカレントキュー」の2種類があります。
シリアルキュー(直列キュー)
シリアルキューに登録されたブロックは、FIFO(先入れ先出し)順に取り出されます。あるブロックがキューから取り出されると、その実行が完了するまで次のブロックは取り出されません。各プロセスには固有のシリアルキュー(メインキューと呼ばれます)が存在し、開発者がプロセスローカルな追加のシリアルキューを作成することも可能です。シリアルキューは、複数のタスクを確実に順番どおり実行したい場合に役立ちます。
コンカレントキュー(並列キュー)
コンカレントキューに登録されたブロックもFIFO順で取り出されますが、一度に複数のブロックを取り出せるため、複数のブロックを同時に並列実行できます。システム全体で共有されるコンカレントディスパッチキューは3つ用意されており、「低」「デフォルト」「高」という優先度で区別されています。優先度はブロックの相対的な重要度のおおよその目安であり、重要度の高いブロックほど高優先度のキューへ登録するのが基本です。
次のコード例は、デフォルト優先度のグローバルコンカレントキューを取得し、dispatch_async() 関数を使ってブロックをキューへ投入する方法を示したものです。
dispatch_queue_t queue = dispatch_get_global_queue
(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{ printf("This is a block."); });内部構造:POSIXスレッドによるスレッドプール
内部的には、GCDのスレッドプールはPOSIXスレッドで構成されています。GCDはこのプールを能動的に管理しており、アプリケーションの負荷やシステムのキャパシティに応じて、スレッド数を柔軟に増減させることができます。これにより、開発者はスレッドの生成や破棄を意識することなく、効率的な並列処理を実現できるのです。
-
JavaScriptでキュー(Queue)を実装する方法を徹底解説
キュー(Queue)とは? キューは先入れ先出し(FIFO:First In First Out)というルールに従うデータ構造です。最初に追加した要素が最初に取り出される仕組みで、レジの待ち行列のように「並んだ順番どおりに処理したい」場面でよく使われます。 JavaScriptでは、配列とクラス(またはプロトタイプ)を組み合わせることで、簡単にキューを実装できます。キューの基本的な操作は次の3つです。 enqueue(エンキュー):キューの末尾に要素を追加する dequeue(デキュー):キューの先頭から要素を取り出す display(表示):キューの中身をすべて画面に表示する 以下は、H
-
同時実行の説明:マルチスレッド iOS アプリを構築する方法
iOS での同時実行は大きなトピックです。そこで、この記事では、キューと Grand Central Dispatch (GCD) フレームワークに関するサブトピックにズームインしたいと思います。 特に、シリアル キューと並行キューの違い、および同期実行と非同期実行の違いを調べたいと思います。 これまで GCD を使用したことがない場合は、この記事から始めることをお勧めします。 GCD の経験があり、上記のトピックにまだ興味がある場合は、それでも役立つと思います。そして、途中で新しいことを 1 つまたは 2 つ取り上げていただければ幸いです。 この記事の概念を視覚的に示すために、Sw