GAE開発の落とし穴
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
ブックマークされました!
ブックマークがエラーになりました。もう一度お願いします。

作者 Dingze Zhu , 翻訳者 吉田 英人 投稿日 2010年2月14日
この記事は Max Brunning 氏の発表した Solaris, BSD,Linux に対する見解から着想を得たものです。Unix 系システム同士の長所と短所を比較する,というのはよく見る話題ですが,今回の記事で取り上げるのは最新の3つのオペレーティングシステムのカーネルサブシステム – OpenSolaris,Windows Vista,そして Linux Kernel 2.6 です。その理由は簡単で,この3つがビジネス環境と開発コミュニティの両方において最も広く利用されていて,なおかつ評価の高いオペレーティングシステムであるからです。
システム評価の基準は数多くありますが,コンピュータ科学において,オペレーティングシステムの基本的な役割が不変であることは疑う余地がありません。オペレーティングシステムの目的は次の3つと考えてよいでしょう。
OS にはプロセス/スレッド管理のような機能が不可欠です。これは一定のディパッチ実行基準とメモリ管理,ファイル管理のもとで,スレッドの生成と呼び出しを行うものです。ここでは前述のサブシステムひとつひとつを比較することにします。(この記事はカーネルの比較に的を絞っているため,ユーザフレンドリ性については扱いません。)Linux と OpenSolaris には概念的に近い部分がいくつかありますが,Windows Vista のコンセプトはそれらとは大きく異なっています。
OpenSolaris は,プロセッサリソースを柔軟に利用できるように設計された,マルチレベルのスレッドサポートを実装しています。ここでは次の4つの新しい概念が導入されています。
ps -Lec コマンドを使用すると,図 0 に示すようにシステムプロセッサとスレッドが表示されます。

図0 Solaris 10 update 6 での出力
図1は,これら4つのエンティティの関連を示したものです。

図1 OpenSolaris スレッドモデル1
OpenSolaris の3レベルスレッド構造 (ULT,LWP,カーネルスレッド) は,OSによるスレッド管理を容易にし,アプリケーションにクリーンなインタフェースを提供する,という意図のもとに設計されています。
ユーザスレッドインターフェースは,標準的なスレッドライブラリとして使用されます。前述の ULT は LWP 上にマッピングされています。LWP は OS によって管理され,別途定義される実行ステータスを保持します。実行状態にある LWP は,1対1の対応でカーネルスレッドに結び付けられています。したがって,スレッドの実行と並行性はカーネルスレッドのレベルで管理されることになります。
またアプリケーションは,システムコールの集合体であるアプリケーションプログラムインターフェース (Application Program Interface.,API) を通じて,ハードウェアにアクセスします。API は,コールしたプロセスに代わって特権的なタスクを実行するためにカーネルサービスを起動するものです。ファイルの読み書き,デバイスへの制御コマンド発行,プロセスやスレッドの新規生成,プロセスで使用するメモリの確保などを行います。
スレッドモデルの変更は,プロセスデータの構造に影響を与えます。OpenSolaris では基本的な構造は変更されていませんが,プロセッサ状態ブロックが LWP 単位のデータブロックを格納した構造体リストに変更されています。
LWP データ構造体には次のような項目があります。
LWP 識別子 (LWP identifier)

図2 Solaris プロセス構造と通常の Unix プロセス構造の比較
Vista のプロセス設計は,多種多様なOS環境のサポートを実現する,というニーズに従って決定されています。そのため,ネイティブのプロセス構造とWindows カーネルが提供するサービスは,各OSサブシステムがそれぞれのプロセス構造と機能をエミュレートできるように,比較的シンプルかつ汎用的なものとなっています。Windows プロセスの重要な特性としては,次のようなものがあります。
下の図32はプロセスと,プロセスがコントロールし,利用するリソースとの関連方法を説明しています。各プロセスにはセキュリティ・アクセス・トークンが割り当てられていますが,これをそのプロセスのプライマリ・トークンと呼びます。

図3 Windows のプロセスとスレッド
ユーザが最初にログオンするとき,Vista はそのユーザのセキュリティ ID を持ったアクセストークンを生成します。そのユーザが生成する,あるいはそのユーザの権限で動作するすべてのプロセスが,このアクセストークンのコピーを所持します。Windows はトークンを,セキュアなオブジェクトにアクセスする際のユーザ権限確認や,システムおよびセキュアなオブジェクトに対する特権機能の実行確認に使用します。またアクセストークンは,プロセス自身の属性変更の可否をコントロールするためにも使用されます。この場合,プロセスはアクセストークンに対してオープンしたハンドルを持っていません。プロセスがこのハンドルをオープンしようとすると,セキュリティシステムによってそれが許可されるかどうか,すなわちプロセスが自身の属性を変更可能かどうか,が判断されます。
他にプロセス関連のものとして,そのプロセスに現在アサインされている仮想アドレス空間を定義する,一連のブロックがあります。このデータ構造はプロセスから直接編集することはできず,仮想メモリマネージャが提供するメモリ配置サービスを利用しなければなりません。
最後に,プロセスはオブジェクトテーブルを持っていて,そこにはこのプロセスが認知している他のオブジェクトのハンドルが格納されています。このオブジェクトに含まれるスレッドごとに1つのハンドルが割り当てられます。
プロセスはファイルオブジェクトや,共有メモリのセクションを定義するセクションオブジェクトにもアクセスします。
Windows のオブジェクト指向アーキテクチャは,汎用的なプロセス機能を実現する上で効果があります。Windows Visa では2種類のプロセス関連オブジェクト,すなわちプロセスとスレッドが使用されています。プロセスは OpenSolaris と同じくユーザジョブあるいはアプリケーションに該当するエンティティであり,それ自身がメモリなどのリソースやオープンファイルを保持します。スレッドはディスパッチ可能な処理の単位で,シーケンシャルに実行されます。スレッドは中断可能であり,プロセッサを他のスレッドに移動することができます。
Windows Vista は,各プロセスに属するスレッド間の並列性によってプロセスの並列実行をサポートしています。さらに同じプロセス上のスレッドが別々のプロセッサに配置され,同時に実行される場合もあります。マルチスレッドプロセスは,複数プロセスを使用するオーバーヘッドを回避しながら並列性を実現します。同一プロセス内のスレッドは,共有するアドレス空間を通じての情報交換や,プロセスの共有リソースへのアクセスが可能です。別プロセスに属するスレッド同士は,2つのプロセスの間にセットアップされた共有メモリを通じて情報交換を行います。
オブジェクト指向マルチスレッドプロセスは,サーバアプリケーションの実装には効率的な方法です。例えば,ひとつのサーバプロセスで複数のクライアントにサービスすることが可能です。
Linux のプロセス,あるいはタスクは,task_struct というデータ構造体で表現されます。task_struct データ構造体には数多くのカテゴリの情報が格納されています。
Linux はスレッドとプロセスの区別を認識しない,というユニークなソリューションを提供しています。ユーザレベルのスレッドは,OpenSolaris のライトウェイトプロセスと同じような機構を使用して,カーネルレベルのプロセスにマップされます。グループ ID を共有する Linux のカーネルレベルプロセス群にマップされた複数のユーザレベルスレッドが,ひとつのユーザレベルプロセスを構成しています。このような構成によってこれらのプロセスは,ファイルやメモリなどのリソースを共有し,スケジューラが同一グループに属するプロセスを切り替えるときのコンテキストスイッチを回避しています。
Solaris と Windows がすでに長い年月を重ねているのに対して,Linux はとても若く,まだまだこれからのOSです。また,3つのOSは明らかに,一般的なオペレーティングシステム理論に基づいて実装されています。私たちにとって最大の難題は,カーネル実装へのアクセス方法とデバッグです。私の知る限り Windows Vista にはスレッドやプロセスをトレース,デバッグする方法がないのに対して,OpenSolaris にはカーネルスレッドを検査するツールが豊富に提供されています。
次回はメモリ管理とファイルシステムについて議論する予定です。
1 Richard McDougall, Jim Mauro ,Solaris internals 2005 Pearson Education
2 Russinovich, M., and Solomon, D. Microsoft Windows Internals: Microsoft Windows Server(TM) 2003, Windows XP, and Windows 2000. Redmond, WA: Microsoft Press, 2005.
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。
Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。
GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式
本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。
前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。
Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。
スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。
1 comment
スレッド表示 返信