2016-09-28 12 views
2

私たちは積極的に開発しているfortranバイナリに裏打ちされたJavaアプリケーションを持っています。私は主にJava側であり、Fortran上で作業する人たちをいくつかの厄介なシステムから保護し、並行処理のようなものや、複雑なAPIを公開しないようにすることを私は考えています。コールスタックは言語安全なデータ構造ですか? Quasar + Fortran?

私がこれらの行に沿って行った決定は、JavaからFortranバイナリにJNAスタイルのコールバックを渡すことでした。このコールバックが実行されます場合は、私たちのコールスタックは、次のようになります。

UIframework.click.java -- com.sun#1234 
OurCode.UIHandlers.java -- our.code#2345 
OurCode.doHeavyComputation.java -- our.code#4567 
JNASurrogates.java -- com.sun.jna#456 
JNASurrogates.proxy.f99 -- com.sun.proxies 
HeavyComputation.f99 -- /code/algorithm.f99#1234 
JNASurrogates.executeCallback.proxy.f99 -- com.sun.proxies 
JNASurrogates.java -- com.sun.jna#1234 
OurCode.computationComponents.java -- our.code#6789 
//bottom of callstack 

私の質問は、スレッドのいずれかですでしょう2つのスレッドは、メモリ内の同じFORTRAN DLLにアクセスする方法を扱うこと?私の質問は、コールスタックがメモリ内でどのように処理されるかについての正確な情報に基づいています:FortranコンパイラがJNAから呼び出すことができるコードを生成するためには、コールスタックが格納される場所についてのJVMとの理解を共有しました。 X86は、Pthreadsjava.lang.Thread、およびその他のスレッドライブラリをすべて活用してコールスタックを安全に分離できる、何らかの種類のプログラムカウンタコンテナを提供していますか?


私もQuasarを使用して議論してる事が本当に面白くするには - なじみのない人のために、クエーサーは、それがstackfulコルーチンによって実装「軽量スレッド」であり、「繊維」、呼んでいます、つまり、Quasarはスタックフレームの直接操作を実行します。

問題は、私が概念的にはOurCode.computationComponentsをコールバックとして公開していることですが、ビジネス上の要件によっては気にしないことがあります。有名なFortranのプログラマーに、既存のコードを明示的な入り口と戻り(返り)ポイントで変換するように依頼するのではなく、既存のコードを活用するためにむしろコルーチンを使用します。

アイデアは、コルーチンがOurCode.computationComponents.java収率doHeavyComputationの呼び出し元へ戻り値としてHeavyComputation.f99によってcomputationComponentsに渡された引数をもたらすであろうことであろう。呼び出し側はその後、computationComponentsに戻っもたらすであろうし、最終的に戻ってHeavyComputation.f99

に私はもちろんのブロッキングキューでこのすべてを行うことができ、resumeHeavyComputationとそのからに結果を渡し、computationCompoenntsが通常行うコールバックという仕事をするだろうし、 1つのスレッドを使用することに自分自身を制限しようとすると、私はいくつかのQuasarに暴露されます。

Quasarでは、使用しているスタックと同じ複雑なスタックを安全に復元できますか?

答えて

1

OSはスレッドを提供します。他のプログラミングモデル(Java、Quasarなど)は、ユーザー空間にあればその上に構築する必要があります。あなたのQuasar "軽量スレッド"は、すべてあなたのOSプロセスとOSスレッドのコンテキスト内に存続します。あなたのOSスレッドはメモリを共有できるので、あなたの "軽量スレッド"もそうです。異なる "軽量スレッド"からのJNA経由のJavaへのコールバックは、すべて同じJavaマッピングされたスレッド(したがって、同じネイティブスレッド)にあるように見えます。

実行時スタックどのようなものであれ、そのコルーチンに対するQuasar Shuffleは、Java側ではほとんど不透明です。

関連する問題