サイト内の現在位置

VEOSの機能(その2)

no.0042020.10.30

 ここでもう一つ、VEのプロセス管理についてforkを使って遊んでみます。VEで実行されるプログラム(この場合、VEでは親プロセスです)からfork関数を使い子プロセスを作成し、実行時間30秒後に終了させます。fig.6がこのプログラムのコードです。
 子プロセスが終了した後も親プロセスはさらに30秒間継続して動いているという、その様子をfig.7-1からfig.7-4に再現します。
 子プロセスは「I'm the child」とメッセージを送った後、child was 190667、190667 diedという簡単なメッセージを残して終了します。子プロセスの実行期間中、VEOSのpsは親子プロセスのpidとコマンド名を並べて表示します。
 その後、再びpsを実行してみると親のpidとコマンド名だけが表示されていることが分かります。このようにVEOSはVEで実行されるプロセス、またその子プロセスの管理をLinuxのカーネルと同じように行っています。
 ちなみにfig.8に示したように、VH側のpsでもVEの親子は2つの代理プロセスの形で親/子としてちゃんと見えていることがわかります。

fig.6 VE上で動作するプログラムソースコードfork.c
fig.6 VE上で動作するプログラムソースコードfork.c
(fork()で子プロセスを生成、これを30秒後に終了させます)

fig.7-1 nccコンパイラにより実行ファイルfork.exeを作成後、実行した直後の表示
fig.7-1 nccコンパイラにより実行ファイルfork.exeを作成後、実行した直後の表示
(子プロセスが生成されています)

fig.7-2 子プロセスが動作中にVEOSのpsでプロセスを表示。プロセスが2つ存在。
fig.7-2 子プロセスが動作中にVEOSのpsでプロセスを表示。プロセスが2つ存在。

fig.7-3 子プロセスが30秒後に終了し、コマンドfork.exeが親プロセス190656として実行中
fig.7-3 子プロセスが30秒後に終了し、コマンドfork.exeが親プロセス190656として実行中

fig.7-4 VEOSのpsは親プロセスだけを表示
fig.7-4 VEOSのpsは親プロセスだけを表示

fig.8-1 VE上で子プロセス動作中にLinuxのpsでプロセスを表示。プロセスが2つ存在。
fig.8-1 VE上で子プロセス動作中にLinuxのpsでプロセスを表示。プロセスが2つ存在。

fig.8-2 子プロセス終了後、LinuxのpsはVE上の親プロセスだけを表示
fig.8-2 子プロセス終了後、LinuxのpsはVE上の親プロセスだけを表示

 つづいて、VEOSを介してVEがシステムコールをVHに送る動きについてみていきます。
VHでは、ユーザープログラムからカーネルへ何かリクエスト(メモリ領域の確保やIO処理など)が出されるとカーネルはシステムコールという形でリクエストを受け取ります。VEで動くプログラムも同じようにVH側のカーネルにリクエストを出すことができるようになっています。その流れは、ざっと次のようなものです。

・VEプロセスはシステムコールをVHにオフロード
 ・代理プロセスがシステムコールの要求を処理
  (先のhello_getpid_ve.exeがgetpidを要求したような場合)
 ・代理プロセスは必要に応じてVEOSデーモンやLinuxに処理を依頼

 先にも説明が出てきた通り、ve_execという代理プロセスはVEプロセスが出すシステムコールというリクエストをVEOSデーモンを通して、あるいはLinuxを通して処理しているのです。
 ここまで確認してきたことをあらためて説明するため図(fig.9)にまとめておきます。

Fig.9 VEOSの役割一部
Fig.9 VEOSの役割一部

 最後にプロセス間通信についてみてみます。VEで動くプロセスの間だけでなくVEとVHで動くプロセス間でも通信を行うことができます。VEプロセスのシステムコールをすべて代理プロセスが行うためVE-VHの間でもプロセス間通信が行えるのです。
 以下、fig.10の通り、簡単なサンプルとして名前付きパイプFIFOを使ったVE-VH双方のプロセス間で通信を行ってみます。まず、VH側でmkfifoコマンドを使ってパイプFIFO用の特殊なファイルを作っておきます。VHでこのFIFO用特殊ファイルをcatで開きます。
 次にVEで文字列を表示するプロセスと標準入出力のリダイレクト機能でFIFO用ファイルに出力するプロセスを実行します。FIFO(First In First out)とは、名前付きパイプと呼ばれます。この名前なしのプロセス間通信では、関係しないプロセスの間でデータのやり取り(ここでの例では’ Hello cat!\’という文字列データ)を行うことができます。
 きわめて簡単なプロセス間通信の一例でしたが、VHとVEで実行されるプロセスが同じカーネル上に存在していることをあらわしています。

fig.10-1 Linuxのmkfifoコマンドでfifo_pipeという名称の名前付きパイプを作成
fig.10-1 Linuxのmkfifoコマンドでfifo_pipeという名称の名前付きパイプを作成

fig.10-2 VE上で実行されるプロセスのコマンド(ソースコード)
fig.10-2 VE上で実行されるプロセスのコマンド(ソースコード)

fig.10-3 fifo_pipeの中身をVH側で表示
fig.10-3 fifo_pipeの中身をVH側で表示

  1. ではVH側でcatコマンドを実行してfifo_pipeの中を表示させようとしていますが、VEでhello_pipe.exeコマンドを実行していないため何も表示されず、またcatコマンドは終了せず待ち続けます。
  2. ではVE上でhello_pipe.exeコマンドを実行し、fifo_pipeにリダイレクトしています。
  3. VH側で待ち続けていたcatコマンドはVE上の②の動作によって文字列を読み取り、表示後に終了します。
   以上、駆け足でVEの上でどのようにユーザープログラムが実行されるのか、それを実現するVEOSの果たす役割についてみてきました。
 今回、VEOSの全てのコンポーネント、機能を紹介することはできませんでしたが、これら詳細についてはNEC Aurora Forumドキュメント紹介サイトにある「VEOS 概要設計」をご覧ください。VEのメモリ管理やユーザーモードDMA、サポートされるプロセス間通信など様々な情報が掲載されています。
 普段、SX-Aurora TSUBASAを使って科学技術計算を行う際、ほとんどVEOSを意識することはないかもしれません。しかし、VHのリソース情報が必要となったようときにVEOSの仕組みについての情報が役に立つのではと考え、VEOSについて紹介しました。コードを書く際、参考にしていただければと願っています。