order

Section: WIN SYSTEM (1W)
Updated: 2014.11.12
Index Return to Main Contents
 

名称

order, orderd - 共有メモリ中の win 形式データの時間順整列  

形式

order [-aBD] [-l key:size] inkey outkey shmsize limit [ logfile ]

orderd [-aB] [-l key:size] inkey outkey shmsize limit [ logfile ]

 

解説

order は、キー  inkey の共有メモリ・セグメントに書き込まれている、時間順に整列されて いない、「書き込み時刻」付きの win 形式のデータを、時間順に 整列させて、キー  outkey で与えられる共有メモリ・セグメントに書き込みます。キー  outkey をもつ共有メモリ・セグメントが存在しない場合は、大きさ  shmsize  (KB) の共有メモリ・セグメントが作られます。すでに存在している場合は、 そのサイズが  shmsize  (KB) よりも小さいとエラーになります。 共有メモリ・キーは32ビットの整数値です。

入力側共有メモリにデータを書き込むのは、通常 recvt(1W) プロセスです。 order は、データを整列させる際に、「現在時刻から過去  limit 秒間に入力側共有メモリに書き込まれたデータの中から、まだ 出力側にコピーされていない、最も古い時刻のデータ」を集めて 出力側共有メモリにコピーしていきます。結果的に、同じ(データの) 時刻ラベルをもつデータパケットのうち、最も早く到着したデータよりも  limit 秒以上遅れて到着したデータは、出力されずに読み捨てられることに なります。したがって入力側共有メモリは、データが最も膨らんだ ときでも、少なくとも  limit 秒分の win 形式データを蓄積できる容量がなければなりません。

一方  limit の秒数は、さまざまな系統から入力側に到着するデータパケットがもちうる、 実時間からの遅延時間の幅を考慮して決定される必要があります。

order の入力側と出力側の間では、最大  limit 秒の遅延時間が発生することになります。また出力されるデータは、 実時間から少なくとも  limit 秒遅延しています。

orderd は daemon モードで起動します。order でオプション -D を指定した時と同じ動作です。

ログファイル名  logfile を指定すると、ここに動作ログがとられます。 指定しないとログ情報は標準出力に 送られます(ただし、daemon モードで動いている時は syslogd(8) に送られま す)。ログファイルは書き込みのたび毎に オープン/クローズされます。

order は引数なしで起動すると簡単な使用法を表示します。  

入力側共有メモリ上の形式

recvt(1W) を参照してください。order は通常の形式と、「ブロック末尾にも ブロック長をもつ形式」の両方を自動判別して受け入れることができますが、 後述の「絶対時刻準拠モード」の場合は入力データは「ブロック末尾にも ブロック長をもつ形式」でなければなりません。  

出力側共有メモリ上の形式

order が共有メモリに書き込むデータは、1秒分ずつのブロック形式です。 1ブロックの構造は次のようになっています (オプション -B による別のもう一つの形式については オプションの項を見てください)。

     (1)4バイトのブロックサイズ(バイト)
     (2)6バイトの時刻ヘッダー(年〜秒、各1バイト、BCD形式)
          年の下2桁(00〜99)、月(01〜12)、日(01〜31)、
          時(00〜23)、分(00〜59)、秒(00〜59)
     (3)同時刻の1チャネル分以上のデータ(win形式)

共有メモリ・セグメント全体は、次のような構造体になっています。


     struct Shm {
       unsigned long p;         /* write point */
       unsigned long pl;        /* write limit */
       unsigned long r;         /* latest */
       unsigned long c;         /* counter */
       unsigned char d[SIZE];   /* data buffer */
       } *sh;

p, pl, r, c は管理用の変数、d がデータの領域で、これらはすべて 1つの書き込み側プロセスによって書き込まれます。読み出し側プロセスは これらの変数を使って同期をとって、データを読み出します。
p
現在書き込み中のブロックの先頭位置(d の先頭からのバイト数)。
pl
ここを越えては新しい秒ブロックに入らず、先頭に戻る位置(d の先頭から のバイト数)。これは共有メモリセグメントの大きさの90%の位置に とられます。最後の秒ブロックはこの位置を越えて書き込まれますが、 そのブロックは、共有メモリセグメントの終端までには終わらなければ なりません。したがって、共有メモリセグメントの大きさは、少なくとも、 最大の1秒ブロックの大きさの10倍以上である必要があります。 ただし、残存メモリのサイズが10MBを越える場合(共有メモリの大きさを100MB より大きく取った場合)、メモリの有効活用のため残存メモリサイズが10MBに なる位置に設定されます。
r
最後に書き込み完了したブロックの先頭位置(d の先頭から のバイト数)。
c
これまでに書き込んだブロック数の積算値。
 

オプション

-a
絶対時刻準拠モード。order はシステム時計に同期して、毎秒 実時刻よりも limit 秒前のタイムスタンプをもつデータだけを、共有メモリを走査することにより 出力します。これにより、入力データに異常なタイムスタンプがあっても 影響を受けることのない、安定したソート動作が可能です。ただし このモードを選ぶためには、入力側共有メモリが後方サーチ可能な 「ブロック末尾にもブロック長を持つ形式」である必要があります。
-B
共有メモリに次のような別の形式で書き込みます(ブロック末尾にも ブロックサイズを持つ形式)。

     (1)4バイトのブロックサイズ(バイト)
     (2)6バイトの時刻ヘッダー(年〜秒、各1バイト、BCD形式)
          年の下2桁(00〜99)、月(01〜12)、日(01〜31)、
          時(00〜23)、分(00〜59)、秒(00〜59)
     (3)同時刻の1チャネル分以上のデータ(win形式)
     (4)4バイトのブロックサイズ(バイト)

これはデフォールトの形式と(4)の部分だけが異なります。(1)と(4)には 同じ値が入っており、これは(1)〜(4)をすべて含んだ1ブロックの サイズです。この形式は、後方から(アドレスの高い方から低い方へ) のサーチを可能にするためのものです。この形式では、共有メモリ構造体の 中の変数 pl は、共有メモリ先頭に戻る直前に書き込まれた最後の ブロックの(4)の位置を示します。読み出し側プロセスは、pl を 「ここを越えては新しい秒ブロックに入らず先頭に戻る位置」として 使用することができるとともに、後方サーチの起点(先頭から折り返して戻る点) として利用することができます。読み出し側プログラムでは、共有メモリが この形式であるかどうかを自動判別するのが普通です。

-D
daemon モードで起動します。
-l key:size
limit 秒のソート期限に遅れたデータは、大きさ size KB、キー key である共有メモリ・セグメントに書き出されます。書き出すデータのフォーマッ トは、「書き込み時刻」付き、つまり、recvt(1W) が書き込む時と同じフォー マットです。
 

ソース

`order.c'
 

関連事項

winformat(1W), recvt(1W)


 

Index

名称
形式
解説
入力側共有メモリ上の形式
出力側共有メモリ上の形式
オプション
ソース
関連事項