データ構造アライメント

データ構造アライメント(データこうぞうアライメント、英語: data structure alignment)は、コンピュータのメモリ(主記憶装置)内のデータにアクセス(読み書き)する際に、メモリ上の位置の調整を行うことである。

そこには、別々だが関連する2つの問題、すなわち、データ整列とデータ構造パディングがある。最新のコンピュータがメモリアドレスを読み書きする場合には、ワードサイズのチャンク(32ビットシステムの場合は4バイトのチャンク)単位で実行される。データ整列とは、ワードサイズの倍数に等しいメモリアドレスにデータを配置することであり、CPUがメモリを処理する方法によってシステムのパフォーマンスが向上する。データを整列させるには、最後のデータ構造の終端部分と次のデータ構造の開始部分の間に未使用のバイトを挿入する必要があり、これを「データ構造パディング」という。

例えば、コンピュータのワードサイズが4バイトの場合(バイトは、ほとんどのコンピュータで8ビットを意味するが、一部のシステムでは異なる可能性がある)、読み取るデータは4の倍数のメモリアドレスにある必要がある。例えば、データが16番地ではなく14番地から開始する場合、コンピュータは、4バイトのチャンクを2つ以上読み取り、要求されたデータが読み出される前に何らかの計算を実行しなければならないか、アライメントエラーを生成する可能性がある。よって、その前のデータ構造の終端が13番地にあったとしても、次のデータ構造は16番地から始める必要がある。そのため、2つのパディングバイトが2つのデータ構造の間の14番地と15番地に挿入される。

データ構造のアライメントは現代の全てのコンピュータにとって基本的な問題であるが、多くのコンピュータ言語およびコンピュータ言語の実装がデータ整列を自動的に処理する。Ada[1][2]PL/IC言語C11以降[3])・C++C++11以降[4][5]D言語[6]Rust[7]アセンブリ言語は、特定の特殊な状況で有用なデータ構造のパディングを少なくとも部分的に制御することを可能にしている。

定義

メモリアドレス a は、an バイトの倍数(n は2の累乗)であるときに、「n バイトアライメント」と呼ばれる。この場合、バイトはメモリアクセスの最小単位である。つまり、各メモリアドレスは異なるバイトを指定する。二進数で表現した場合、n バイトアライメントされたアドレスの下位の桁は、最小で log2(n) 桁がゼロになる。

b ビットアライメント」は、「b/8 バイトアライメント」とも表現できる(例えば、64ビットアライメントは8バイトアライメント)。

アクセスされるデータが n バイト長であり、データアドレスが n バイトアライメントされている場合、メモリアクセスは「アラインされている」(aligned) という。メモリアクセスがアライメントされていない場合は、「アラインされていない」(misaligned) という。定義上、バイトメモリアクセスは常にアラインされている。

n バイト長のプリミティブ・データを参照するメモリポインタは、nバイトアライメントされたアドレスのみを含むことが許可されていれば、「アラインされている」という。データ集合体(構造体または配列)を参照するメモリポインタは、集合体内の各プリミティブデータがアラインされている場合かつその場合にのみ、アラインされている。

上記の定義は、各プリミティブデータが2の累乗バイトの長さであると仮定している。これが当てはまらない場合(x86の80ビット浮動小数点の場合など)、コンテキストはデータがアラインされているとみなされる条件に影響する。

構造体は、スタックに静的なサイズで、またはヒープ上に動的なサイズで格納できる。

問題

コンピュータは一度に1つのメモリワードでメモリにアクセスする。メモリワードサイズが、コンピュータによってサポートされる最大のプリミティブ型と少なくとも同じ大きさである限り、アラインされたアクセスは常に1つのメモリワードにアクセスする。これは、アラインされていないデータアクセスに対しては当てはまらない。

データの最上位および最下位バイトが同じメモリワード内にない場合、コンピュータはデータアクセスを複数のメモリアクセスに分割する必要がある。これには、メモリアクセスを生成してそれらを調整するために、多くの複雑な回路が必要となる。メモリワードが異なるメモリページにあるケースを処理するために、プロセッサは、命令を実行する前に両方のページが存在することを検証するか、命令実行中にメモリアクセスでTLBミスやページフォールトを処理できる必要がある。

単一のメモリワードにアクセスするとき、その動作はアトミックである。すなわち、メモリワード全体が一度に読み書きされ、その処理が完了するまでは他のデバイスによるアクセスはできない。これは、複数のメモリワードへのアライメントされていないアクセスの場合は当てはまらない。例えば、あるデバイスが最初のワードを読み込み、別のデバイスが両方のワードに書き込み、その後、1つ目のデバイスが2つ目のワードを読み込んだとき、読み込まれた値は更新前の値とも更新後の値とも異なる。このような失敗はまれだが、識別するのが非常に難しい場合がある。

アーキテクチャ

RISC

ほとんどのRISCプロセッサは、ロード命令やストア命令でアラインされていないアドレスにアクセスすると、アライメントフォールトを生成する。これにより、オペレーティングシステムは、他の命令を使用してアラインされていないアクセスをエミュレートできる。例えば、アライメントフォールトハンドラは、大きなロード命令やストア命令をエミュレートするために、バイト単位のロードやストア(常にアラインされている)を使用する場合がある。

MIPSなどのいくつかのアーキテクチャでは、特別なアラインされていないロード命令とストア命令がある。1つのアライメントされていないロード命令は、最も低いバイトアドレスを持つメモリワードからバイトを取得し、別のロード命令は、最も高いバイトアドレスを持つメモリワードからバイトを取得する。同様に、ストア・ハイ命令およびストア・ロー命令は、それぞれ上位および下位メモリワードに適切なバイトを格納する。

Alphaアーキテクチャでは、アライメントされていないロードおよびストアに対する2段階のアプローチがある。第1のステップは、上位および下位のメモリワードを別々のレジスタにロードすることである。第2のステップは、MIPS命令と同様の特別なロー/ハイ命令を使用してメモリワードを抽出または修正することである。アラインされていないストアは、変更されたメモリワードをメモリに戻すことによって完了される。この複雑さの理由は、オリジナルのAlphaアーキテクチャでは、32ビットまたは64ビットの値しか読み書きできないためである。これは、しばしばコードが膨らんでパフォーマンスが低下する重大な制限となることが判明した。この制限に対処するために、元のアーキテクチャにByte Word Extensions (BWX) という拡張機能が追加された。これは、バイトとワードのロード・ストアのための命令で構成されている。

これらの命令は、通常のメモリロード・ストア命令よりも大きく、遅いため、必要なときにのみ使用するべきである。CおよびC++のコンパイラの中には、アライメントの合っていない命令を必要とするポインタに適用できる“unaligned”属性がある[8]

x86

x86アーキテクチャは本来、アライメントされたメモリアクセスを必要とせず、またそれなしでは動作するが、x86 CPUのSSE2命令の中には、データを128ビット(16バイト)にアライメントさせる必要があるものがあり、これらのアーキテクチャでアライメントされたデータを使用することにより、パフォーマンス上の大きな利点が得られる。ただし、MOVDQUなどのアラインされていないアクセスのための命令もある。さらに、ロードとストアの操作は、通常、正しくアラインされていればアトミックである。

互換性

アラインされていないアクセスをサポートする利点は、アクセスを遅くするという犠牲を払ってでも、メモリを調整する必要のないコンパイラを書くほうが簡単だということである。生のパフォーマンスを最大にするように設計されたRISCプロセッサのパフォーマンスを向上させる1つの方法は、データの自然な境界にデータをロードまたは格納することである。従って、メモリは一般に8ビットバイトで扱われるが、32ビットマシンで32ビット整数をロードするには32ビットごとに開始し、64ビットマシンで64ビット整数や浮動小数点数をロードするには64ビットごとに開始する必要がある。このような境界にない数値をロードするように要求された場合、プロセッサはフォールトにフラグを立てることができる。しかし、これは、どのワードがデータを含んでいるか把握し、同等の値を抽出する必要があるルーチンへの呼び出しを遅くすることになる。

データ構造パティング

コンパイラ(またはインタプリタ)は、通常、アラインされた境界上に個々のデータ項目を割り当てるが、データ構造はしばしば異なるアライメント要件を有するメンバーを有する。適切なアライメントを維持するために、トランスレータは通常、追加の無名のデータメンバーを挿入して、各メンバーが適切にアライメントされるようにする。さらに、データ構造全体には、終端に名前のないメンバーが埋め込まれている場合がある。これにより、構造体配列の各メンバを適切にアラインすることができる。

パディングは、構造体のメンバの後に大きなアライメントが必要なメンバがある場合、または構造体の最後に挿入された場合にのみ挿入される。 構造体内のメンバの順序を変更することで、アライメントを維持するのに必要なパディングの量を変更することができる。例えば、アライメント要件の小さい順にメンバがソートされている場合、パディングは最小限で済む。必要なパディングの最小量は、常に構造体内の最大のアライメントよりも小さくなる。必要とされるパディングの最大量の計算は、より複雑だが、全てのメンバのアラインメント必要量から、構造体メンバの最小アライメントされた半分のアライメント必要量の合計の2倍を引いた値よりも小さい。

CとC++では、コンパイラがスペースを節約するために構造体メンバを並べ替えることはできないが、他の言語では可能である。また、大部分のC/C++コンパイラでは、構造体のメンバを一定のアラインレベルで「パック」することもできる。例えば、"pack(2)"は、バイトよりも大きいデータメンバを2バイト境界にアラインメントさせることを意味する。全てのパッディングメンバは最大で1バイト長である。

このような「パック」構造の用途の1つは、メモリを節約することである。例えば、1バイトと4バイトの整数を含む構造体には、さらに3バイトのパディングが必要となる。このような構造体の大きな配列は、パックされている場合はメモリ使用量を37.5%減らすことができるが、各構造体へのアクセスには時間がかかる。この妥協は、時間と空間のトレードオフの一形態と考えることができる。

「パック」構造の使用は、メモリ空間を節約するために最も頻繁に使用されるが、標準プロトコルを使用して送信するためにデータ構造をフォーマットするために使用することもできる。しかし、この使用法では、構造体メンバの値が、プロトコルによって要求されるエンディアン(多くの場合ネットワークバイトオーダ)で格納されるように注意する必要がある。これは、ホストマシンがネイティブに使用するエンディアンとは異なる場合がある。

パディングの計算

次の式は、データ構造の開始位置をアラインメントするのに必要なパディングバイト数を示す(modは剰余演算子)。

padding = (align - (offset mod align)) mod align
aligned = offset + padding
        = offset + ((align - (offset mod align)) mod align)

例えば、4ビットアライメントの構造体のオフセット0x59dに追加するパディングは3である。構造体は0x5a0(4の倍数)番地から開始する。ただし、offset のアライメントが align のアライメントと既に等しい場合、(align - (offset mod align)) mod align の2つ目の剰余演算はゼロを返すので、元の値は変更されない。

定義によりアライメントは2の累乗であるため、剰余演算はビット単位のAND演算に置き換えられる。

次の数式はアラインしたオフセットを生成する(& はビット単位のAND、~ はビット単位のNOT)。

padding = (align - (offset & (align - 1))) & (align - 1)
        = (-offset & (align - 1))
aligned = (offset + (align - 1)) & ~(align - 1)
        = (offset + (align - 1)) & -align

x86上のC構造体の典型的なアライメント

構造体のメンバは、メモリに順番に格納されるため、以下の構造体では、メンバData1は常にData2の前に、Data2は常にData3の前に配置される。

struct MyData
{
    short Data1;
    short Data2;
    short Data3;
};

short型が2バイトのメモリに格納されている場合、上記の構造体の各メンバは2バイトでアラインされる。Data1はオフセット0、Data2はオフセット2、Data3はオフセット4になる。この構造体のサイズは6バイトになる。

構造体の各メンバの型は通常、デフォルトのアライメントを持つ。つまり、プログラマから別途要求されない限り、あらかじめ決められた境界にアラインされる。次の典型的なアライメントは、Microsoft (Visual C++)、Borland/CodeGear (C++ Builder)、Digital Mars (DMC)、GNU (GCC) で32ビットx86用にコンパイルする場合のものである。

  • char(1バイト) - 1バイトアライメント
  • short (2バイト) - 2バイトアライメント
  • int(4バイト) - 4バイトアライメント
  • long(4バイト) - 4バイトアライメント
  • float(4バイト) - 4バイトアライメント
  • double(8バイト) - Windowsでは8バイトアライメント。Linuxでは4バイトアライメント(コンパイル時に-malign-doubleオプションをつけると8バイト)
  • long long(8バイト) - 4バイトアライメント
  • long double(C++ BuilderとDMCでは10バイト、Visual C++では8バイト、GCCでは12バイト) - C++ Builderでは8バイトアライメント、DMCでは2バイトアライメント、Visual C++では8バイトアライメント、GCCでは4バイトアライメント
  • ポインタ(4バイト) - 4バイトアライメント

LP64モデルの64ビットシステムは次の通りである。

  • long(8バイト) - 8バイトアライメント
  • double(8バイト) - 8バイトアライメント
  • long long(8バイト) - 8バイトアライメント
  • long double(GCCでは16バイト) - GCCでは16バイトアライメント
  • ポインタ(8バイト) - 8バイトアライメント

一部のデータ型は実装に依存する。

次に挙げる構造体は、様々な型のメンバを有しており、そのバイト数を単純に合計すると8バイトになる。

struct MixedData
{
    char Data1;
    short Data2;
    int Data3;
    char Data4;
};

コンパイル後、構造体にはパディングバイトが追加され、各メンバの適切なアライメントが保証される。

struct MixedData  /* After compilation in 32-bit x86 machine */
{
    char Data1; /* 1バイト */
    char Padding1[1]; /* 次のshort型を2バイト境界にアラインするための1バイトのパディング。
 構造体が始まるアドレスが偶数であると仮定。 */
    short Data2; /* 2バイト */
    int Data3;  /* 4バイト - 最も大きな構造体メンバ */
    char Data4; /* 1バイト */
    char Padding2[3]; /* 構造体のサイズを12バイトにするための3バイトのパディング */
};

構造体のコンパイルされたサイズは12バイトになる。最後のメンバの後にもパディングバイトが追加されていることに留意されたい。この場合、構造体の合計サイズは、構造体メンバの最大のアライメントの倍数となる。上の例では、構造体を12バイトのサイズにパディングするために最後のメンバの後に3バイトが追加される。

struct FinalPad
{
    float x;
    char n[1];
};

上記の例では、sizeof演算子により算出される FinalPad 構造体のサイズ sizeof(FinalPad) は5ではなく8(floatのアライメントの倍数)になる。

struct FinalPadShort
{
    short s;
    char n[3];
};

上記の例では、FinalPadShort 構造体のサイズ sizeof(FinalPadShort) は5や8ではなく6(shortのアライメントの倍数)になる。

構造体メンバの順序を変更したり、構造体メンバのコンパイラのアライメントを変更(パッキング)して、必要なメモリを減らす(または既存の形式に準拠させる)ために、構造体のアライメントを変更することができる。前述の MixedData 構造体にこれを適用すると、次のようになる。

struct MixedData  /* 並べ替え後 */
{
    char Data1;
    char Data4;   /* 並べ替えられた */
    short Data2;
    int Data3;
};

これにより、構造体のコンパイル後のサイズが、メンバのバイト数を単純に合計したサイズである8バイトと一致するようになった。Padding1[1]Data4 によって置き換えられ(従って排除され)、構造体は既にlong wordのサイズにアラインされているので、 Padding2[3] はもはや必要ではない。

MixedData 構造体を1バイト境界にアライメントさせる別の方法は、プリプロセッサに構造体メンバの所定のアライメントを破棄させ、これによりパディングバイトを挿入しないようにすることである。

C11およびC++11よりも前の規格では、構造体メンバのアライメントを定義する標準的な方法はないが、コンパイラの中には #pragma ディレクティブを使用してソースファイル内のパッキングを指定するものがある。次にその例を示す。

#pragma pack(push)  /* 現在のアライメントをスタックにプッシュ */
#pragma pack(1)     /* 1バイト境界にアライメントを設定 */

struct MyPackedData
{
    char Data1;
    long Data2;
    char Data3;
};

#pragma pack(pop)   /* スタックから元のアライメントを復元 */

この構造体は、32ビットシステムで6バイトのコンパイルサイズを持つ。上記のディレクティブは、Microsoft[9]BorlandGNU[10]などのコンパイラで利用できる。

もう1つの例:

struct MyPackedData
{
    char Data1;
    long Data2 __attribute__((packed));
    char Data3;
};

デフォルトのパッキングと #pragma pack

一部のMicrosoftコンパイラ、特にRISCプロセッサでは[要出典][要ページ番号]、プロジェクトのデフォルトパッキング(/Zp ディレクティブ)と #pragma pack ディレクティブの間に予期しない関係がある。#pragma pack ディレクティブは、プロジェクトのデフォルトパッキングから構造体のパッキングサイズを減らすためにのみ[要出典][要ページ番号]使用できる[11]。これはライブラリヘッダーとの相互運用性の問題を引き起こすケースがある(例えばヘッダーで #pragma pack(8) を使用し、プロジェクトのパッキングがこれよりも小さい場合)。このため、プロジェクトパッキングをデフォルトの8バイト以外の値に設定すると、ライブラリヘッダーで使用される #pragma pack ディレクティブが破棄され、構造間のバイナリの非互換性が発生する。x86用にコンパイルする場合は、この制限はない。

キャッシュラインに合わせたメモリの割り当て

キャッシュメモリのラインに合わせてメモリを割り当てることは有益である。配列が複数のスレッドが動作するようにパーティション化されている場合、サブ配列の境界をキャッシュラインとアラインさせないとパフォーマンスが低下する可能性がある。次に、64バイトのキャッシュにアライメントされたメモリ(サイズ10の倍精度配列)の例を示す。

#include <stdlib.h>
double *foo(void) {
    double *var; /* サイズ10の配列を作成 */

    int ok = posix_memalign((void**)&var, 64, 10 * sizeof(double));

    if (ok != 0) {
        return NULL;
    }

    return var;
}

アラインメント要件のハードウェア重要性

アライメントの問題は、ハードウェアアドレス変換メカニズム(PCIリマッピング、MMUで実施)によるその領域の効率的なマッピングが目的である場合、C構造体よりもはるかに大きな領域に影響を与える可能性がある。

例えば、32ビットオペレーティングシステムでは、4 KBページは、任意の4 KBのデータチャンクだけではない。通常は、4 KB境界にアラインされたメモリ領域である。これは、ページをページサイズの境界にアラインすると、複雑な算術演算ではなくアドレスの上位ビットを置換することで、ハードウェアが物理アドレスに仮想アドレスをマップできるためである。

例: 物理アドレス0x12345000に仮想アドレス0x2cfc7000のTLBマッピングがあるとする(これらのアドレスは両方とも4 KB境界でアラインされている)。仮想アドレスva = 0x2cfc7abcにあるデータにアクセスすると、0x2cfc7〜0x12345のTLB分解能で、pa = 0x12345abcへの物理アクセスが行われる。ここで、20/12ビットの分割は幸いなことに、5/3桁の16進表現の分割に一致する。ハードウェアは、物理アドレス(0x12345)の最初の20ビットと仮想アドレス(0xabc)の最後の12ビットを単純に組み合わせることによって、この変換を実装できる。これは、仮想インデックス(abc)物理的タグ付け(12345)とも呼ばれる。

サイズ 2^(n+1)-1 のデータのブロックは、常に 2^n バイトにアラインされたサイズ 2^n の1つのサブブロックを有する。

以下は、アライメントの知識のない動的アロケータを使用して、スペースロスの2倍を犠牲にして、アラインしたバッファを提供する方法である。

Example: get a 12-bit aligned 4 KBytes buffer with malloc()

// unaligned pointer to large area
void *up=malloc((1<<13)-1);
// well-aligned pointer to 4 KBytes
void *ap=aligntonext(up,12);

where aligntonext() is meant as:
move p to the right until next well-aligned address if
not correct already. A possible implementation is

// PSEUDOCODE assumes uint32_t p,bits; for readability
// --- not typesafe, not side-effect safe
#define alignto(p,bits) (p>>bits<<bits)
#define aligntonext(p,bits) alignto((p+(1<<bits)-1),bits)

関連項目

脚注

  1. ^ “Ada Representation Clauses and Pragmas”. GNAT Reference Manual 7.4.0w documentation. http://docs.adacore.com/gnat_rm-docs/html/gnat_rm/gnat_rm/representation_clauses_and_pragmas.html 2015年8月30日閲覧。 
  2. ^ “F.8 Representation Clauses”. SPARCompiler Ada Programmer's Guide. http://docs.oracle.com/cd/E19957-01/802-3641/802-3641.pdf 2015年8月30日閲覧。 
  3. ^ _Alignas - cppreference.com
  4. ^ alignas specifier (since C++11) - cppreference.com
  5. ^ いくつかのC/C++の実装(処理系)では、これらの規格が標準化される以前から、独自拡張としてアライメント指定をサポートしている。
  6. ^ Attributes - D Programming Language: Align Attribute”. 2012年4月13日閲覧。
  7. ^ The Rustonomicon - Alternative Representations”. 2016年6月19日閲覧。
  8. ^ __unaligned | Microsoft Docs
  9. ^ pack pragma | Microsoft Docs
  10. ^ 6.58.8 Structure-Packing Pragmas
  11. ^ Working with Packing Structures”. MSDN Library. Microsoft (2007年7月9日). 2011年1月11日閲覧。

参考文献

  • Bryant, Randal E.; David, O'Hallaron (2003). Computer Systems: A Programmer's Perspective (2003 ed.). Upper Saddle River, NJ: Pearson Education. ISBN 0-13-034074-X. http://csapp.cs.cmu.edu/ 

外部リンク

Read other articles:

Chemical compound HU-320Identifiers IUPAC name (3S,4S)-3-[2,6-Dihydroxy-4-(2-methyloctan-2-yl)phenyl]-4-(prop-1-en-2-yl)cyclohex-1-ene-1-carboxylic acid PubChem CID11223325ChemSpider9398378 YChemical and physical dataFormulaC25H36O4Molar mass400.559 g·mol−13D model (JSmol)Interactive image SMILES O=C(O)/C2=C/[C@H](c1c(O)cc(cc1O)C(C)(C)CCCCCC)[C@@H](\C(=C)C)CC2 InChI InChI=1S/C25H36O4/c1-6-7-8-9-12-25(4,5)18-14-21(26)23(22(27)15-18)20-13-17(24(28)29)10-11-19(20)16(2)3/h13-15,19-20...

 

◄ Junho ► Dom Seg Ter Qua Qui Sex Sáb 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 Ano: 2024 Década: 2020 Século: XXI Milênio: 3.º 6 de junho é o 157.º dia do ano no calendário gregoriano (158.º em anos bissextos). Faltam 208 dias para acabar o ano. Eventos históricos 1944: Desembarques da Normandia 1982: Início da Guerra do Líbano 0913 — Constantino VII, filho ilegítimo de Leão VI, o Sábio, aos 8 anos de ...

 

追晉陸軍二級上將趙家驤將軍个人资料出生1910年 大清河南省衛輝府汲縣逝世1958年8月23日(1958歲—08—23)(47—48歲) † 中華民國福建省金門縣国籍 中華民國政党 中國國民黨获奖 青天白日勳章(追贈)军事背景效忠 中華民國服役 國民革命軍 中華民國陸軍服役时间1924年-1958年军衔 二級上將 (追晉)部队四十七師指挥東北剿匪總司令部參謀長陸軍�...

Part of the Byzantine–Bulgarian Wars (986 AD) Battle of the Gates of TrajanPart of the Byzantine–Bulgarian WarsRuins of the fortress Gates of TrajanDate17 August 986[1]LocationThe Gate of Trajan pass, Bulgaria42°21′22″N 23°55′6″E / 42.35611°N 23.91833°E / 42.35611; 23.91833Result Bulgarian victoryBelligerents First Bulgarian Empire Byzantine EmpireCommanders and leaders Samuil of Bulgaria Basil IIStrength Unknown 15,000–20,000[2]Casual...

 

この項目には、一部のコンピュータや閲覧ソフトで表示できない文字が含まれています(詳細)。 数字の大字(だいじ)は、漢数字の一種。通常用いる単純な字形の漢数字(小字)の代わりに同じ音の別の漢字を用いるものである。 概要 壱万円日本銀行券(「壱」が大字) 弐千円日本銀行券(「弐」が大字) 漢数字には「一」「二」「三」と続く小字と、「壱」「�...

 

This article is about the mountain in the Red Rock Canyon National Conservation Area in Nevada. For the mountain in southern Utah, see Bridge Mountain (Utah). Bridge MountainBridge Mountain from the Red Rock Canyon OverlookHighest pointElevation6958+ ft (2121+ m)[1]Prominence1,991 ft (607 m)[1]ListingDesert Peak Section List[2]Coordinates36°08′08″N 115°29′26″W / 36.1355235°N 115.4905643°W / 36.1355235; -115.4905643[...

國立埔里高級工業職業學校埔里高工校徽國立埔里高級工業職業學校地址545 南投縣埔里鎮中山路一段435號经纬度23°58′19″N 120°58′40″E / 23.9719852°N 120.9778465°E / 23.9719852; 120.9778465邮政编码545其它名称National Puli Industrial Vocational Senior High School类型技術型高級中等學校创办日期1953年学区 臺灣南投縣埔里鎮学校编号049-2982225教育部學校代碼080403校長謝敬堂[1&...

 

Women's Downhillat the XIV Olympic Winter GamesAlpine skiingVenueJahorinaDateFebruary 16Competitors32 from 13 nationsWinning time1:13.36Medalists Michela Figini  Switzerland Maria Walliser  Switzerland Olga Charvátová  Czechoslovakia← 19801988 → Alpine skiing at the1984 Winter OlympicsDownhillmenwomenGiant slalommenwomenSlalommenwomenvte Women's DownhillLocationJahorinaVertical   547 m (1,795 ft)Top elevation1,872 m (6...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Indian Music Industry – news · newspapers · books · scholar · JSTOR (May 2016) (Learn how and when to remove this message) Indian Music IndustryFounded28 February 1936LocationMumbai, IndiaKey peopleBlaise Fernandes, President & CEOWebsiteindianmi.org The In...

Type of organic molecule with a linear structure In chemistry, an open-chain compound (or open chain compound) or acyclic compound (Greek prefix α 'without' and κύκλος 'cycle') is a compound with a linear structure, rather than a cyclic one.[1] An open-chain compound having no side groups is called a straight-chain compound (also spelled as straight chain compound).[2][3] Many of the simple molecules of organic chemistry, such as the alkanes and alkenes, have bo...

 

Former shopping mall in Toledo, Ohio NorthTowne SquareLocationToledo, Ohio, United StatesCoordinates41°43′31″N 83°32′30″W / 41.725395°N 83.541567°W / 41.725395; -83.541567Opening dateMarch 13th 1981Closing dateFebruary 21st 2005(demolished January-spring 2013)DeveloperMelvin Simon & AssociatesNo. of stores and services91 (when open)No. of anchor tenants3 (all vacant)Total retail floor area758,000 square feet (70,420.5 m2)[1]No. of floors1 (...

 

Early Christian ascetics, 3rd–5th centuries AD Desert Mothers Saint Paula and her daughter Eustochium with their spiritual advisor Saint Jerome—painting by Francisco de Zurbarán Desert Mothers is a neologism, coined in feminist theology as an analogy to Desert Fathers, for the ammas or female Christian ascetics living in the desert of Egypt, Palestine, and Syria in the 4th and 5th centuries AD.[1] They typically lived in the monastic communities that began forming during that tim...

Questa voce sull'argomento centri abitati del Michigan è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Hazel Parkcity(EN) Hazel Park, Michigan Hazel Park – Veduta LocalizzazioneStato Stati Uniti Stato federato Michigan ConteaOakland TerritorioCoordinate42°27′45″N 83°06′15″W42°27′45″N, 83°06′15″W (Hazel Park) Altitudine192 m s.l.m. Superficie7,3 km² Abitanti1...

 

American drama miniseries The Comey RuleGenrePolitical dramaBased onA Higher Loyalty: Truth, Lies, and Leadershipby James ComeyWritten byBilly RayDirected byBilly RayStarring Jeff Daniels Holly Hunter Michael Kelly Jennifer Ehle Scoot McNairy Jonathan Banks Oona Chaplin Amy Seimetz Steven Pasquale Brendan Gleeson Music byHenry JackmanCountry of originUnited StatesOriginal languageEnglishNo. of episodes2ProductionExecutive producers Heather Kadin Alex Kurtzman Shane Salerno Billy Ray Producers...

 

1989–1991 unification process of Germany with its full sovereignty returned For the unification of most German states in the 1800s, see Unification of Germany. Reunification of GermanyPart of the Revolutions of 1989 and the end of the Cold WarGermans stand on top of the Wall in front of the Brandenburg Gate in the days before the Wall was torn down.Native name Deutsche WiedervereinigungDie WendeDate9 November 1989 – 15 March 1991 (1989-11-09 – 199...

Ion I. C. Brătianu The second cabinet of Ion I. C. Brătianu was the government of Romania from 4 March 1909 to 28 December 1910. Ministers The ministers of the cabinet were as follows:[1] President of the Council of Ministers: Ion I. C. Brătianu (4 March 1909 - 28 December 1910) Minister of the Interior: Ion I.C. Brătianu (4 March - 15 December 1909) Mihail Pherekyde (15 December 1909 - 16 February 1910) Ion I.C. Brătianu (16 February - 28 December 1910) Minister of Foreign Affai...

 

For other uses, see Blockley (disambiguation). Human settlement in EnglandBlockleyBlockleyLocation within GloucestershirePopulation2,041 (2011 Census)[1]OS grid referenceSP1634DistrictCotswoldShire countyGloucestershireRegionSouth WestCountryEnglandSovereign stateUnited KingdomPost townMoreton-in-MarshPostcode districtGL56Dialling code01386PoliceGloucestershireFireGloucestershireAmbulanceSouth Western UK ParliamentCotswoldWebsitewww.cotswolds.in...

 

1863 book by Henry Walter Bates Naturalist on the River Amazons Frontispiece to volume 1 by Josiah Wood Whymper, entitled Adventure with Curl-Crested Toucans. The image is misleading as Bates was not carrying a gun when he encountered the birds.[1]AuthorHenry Walter BatesIllustratorE. W. Robinson, Josiah Wood Whymper, Joseph Wolf, Johann Baptist Zwecker, etc.LanguageEnglishGenreNatural history, TravelPublisherJohn MurrayPublication date1863Pages466 The Naturalist on the River Amazons,...

Voce principale: Volleyball Casalmaggiore. Volleyball CasalmaggioreStagione 2015-2016Il Volleyball Casalmaggiore Sport pallavolo Squadra Casalmaggiore Allenatore Massimo Barbolini All. in seconda Giorgio Bolzoni Presidente Massimo Boselli Serie A12ª Play-off scudettoQuarti di finale Coppa ItaliaQuarti di finale Supercoppa italianaVincitrice Champions LeagueVincitrice Maggiori presenzeCampionato: Gibbemeyer, Kozuch, Lloyd, Sirressi, Stevanović, Tirozzi (26)Totale: Gibbemeyer, Kozuch, L...

 

19th-century German paleographer Wilhelm WattenbachBorn(1819-09-22)22 September 1819Rantzau, HolsteinDied20 September 1897(1897-09-20) (aged 77)Frankfurt, Hesse-NassauNationalityGermanOccupationHistorian Wilhelm Wattenbach (22 September 1819 – 20 September 1897), was a German historian. He was born at Rantzau in Holstein. He studied philology at the universities of Bonn, Göttingen and Berlin, and in 1843 he began to work upon the Monumenta Germaniae Historica. In 1855 he ...