このページの本文へ

もっと知りたい! Snow Leopard 第4回

Snow Leopardの深層・その2

マルチコア時代の新機軸! Snow LeopardのGCD

2009年09月02日 18時15分更新

文● 千種菊里

  • この記事をはてなブックマークに追加
  • 本文印刷

GCDとは何か?

言語を機能拡張した「Blocks」も用意

 前述のように、GCDはSnow Leopardが用意する並列化のための枠組みだ。

 GCDの中には、CPUやスレッドを管理するエンジンがあって、必要なときに必要なだけのスレッドを起こしてコアを実行してくれる軽量なAPIも「libdispatch」というライブラリにまとめられている。このエンジンがGCDの要になっていることは、アップルのウェブページにあるとおりだ(関連リンク)。

GCDは、アップルが今年6月に開いた開発者向けイベント「WWDC」の基調講演でも触れられていた

 だが、それだけではない。

 このエンジンに処理を渡し負荷を分散させ並列化を推し進めるため、アップルはプログラミング言語「C」そのものを改造するという決断をした。

 この機能拡張は「Blocks」と呼ばれており、プログラムを意味ある塊(ブロック)に区切って、それを変数に代入したり、ほかの関数に渡すことを可能にする。Rubyなどのスクリプト言語(高級言語)で「クロージャ」などと呼ばれている機能を、CというよりCPUに近い低級言語で実装したのだ(Blocksの詳細は「ASCII.technology 2009年9月号」に掲載)。

 また、ブロックをObjective-Cのオブジェクトとして扱うための、より高レベルのフレームワークも用意されている。このためGCDは特にMac OS XのAPI「Cocoa」との親和性が高く、Cocoaアプリケーションの並列化に威力を発揮する。

 例えば、OS標準のメールソフト「Mail」のような、フロントエンドはGUIでユーザーと対話しながら、バックエンドでサーバーと通信してデータをやりとりするようなアプリケーションでは、GCDにより64bit対応以上に高速化が期待できる。


GCDを使っても開発にほとんど制限がかからない

 Cocoaとだけ親和性が高いわけではない。「CoreNetwork」や「CoreFoundation」といったCocoaの下の「Carbon」や「CoreService」に属するAPIもGCDの利用が前提となっていて、Blocks が利用可能だ。それどころか「LibC」と呼ばれる基本ライブラリも対応している。GCDを使ったからといって、ライブラリやフレームワークが制限されるわけではないのだ。

 そして、いくら言語仕様やフレームワークがよくできていても、それだけでは開発は楽にならない。GCDによる並列化の開発を支援するツールも用意されている。

 エンジン、言語の拡張、フレームワーク、システムレベルのAPI、ツール──。これらすべてを用意して、万全の準備の元にアムダールの法則と正面切って戦おうというのがGCDなのだ。


GCDの仕組み

プログラマーに優しい仕様

 さて、GCDの中心は、libdispatchにより提供される並列化エンジンである。キュー(Queue)と呼ばれる待ち行列が用意されており、そこにBlocksでくくられたコードの「ブロック」をぶら下げて、逐次、または並列に実行する、という仕組みを採用している。

 「キューによる待ち行列を並列化して実行」という手法自体は、さして目新しいものではない。GCDで重要なのは、この並列実行を自動的に判断してくれるので、プログラマー側がいくつスレッドを用意してどのキューを実行させるかというのを考えなくて済むという点だ。

 これはプログラムをレストランと考えてみると分かりやすい。単純に特定のキューやタスクにスレッドを割り当てるというのは、店員(スレッド)を厨房やホールの接客、レジ打ちなどに固定して仕事(キュー)をさせるようなものだ。ホールにだけたくさん店員を割り当てても、厨房の処理が回ってなければ注文が滞ってしまうだけだろう。

 一方、特定のキューにスレッドを固定するのではなく、スレッドを集めて必要に応じて分配する「スレッドプール」という考え方もある。レストランで言えば店員が厨房もホールもレジもこなせて、忙しさに応じて担当人数を変えていくようなものだ。

 スレッドプールは固定的にスレッドを割り当てるよりは効率がよくなるが、いくつのスレッドをあらかじめ準備しておくべきかといった予測が難しい。そう、そもそも店員(スレッド)が多すぎると余計な経費(リソース)がかかるだけで効率は上がらないし、少なければ店が立ちゆかない。

 libdispatchによって提供されるGCDのエンジンは、まさにこの部分を自動化してくれる。適切なキューにスレッドをぶら下げておけば、あとはGCDがこうした複雑な問題を対処してくれる。

 要は自らレストランを経営するのではなく、腕のいいマネージャーを雇うようなものだ。GCDはSnow Leopardにもれなく付いてくる。わざわざ優秀なマネージャーをほかから探してこなくても、そこに待機しているのだ。使わなければソン、だろう。

カテゴリートップへ

この連載の記事

ASCII.jp RSS2.0 配信中