我們有一個由fortran二進制文件支持的java應用程序,我們正在積極開發這個應用程序。我主要是在java方面,我認爲這是我的工作,以保護在Fortran上工作的人員免受某些可能會困擾他們的惡意系統的影響,例如併發性,而不是迫使他們暴露覆雜的API。callstack是一種語言安全的數據結構嗎? Quasar + Fortran?
我在這些方面做出的一個決定是將JNA風格的回調從java傳遞到我們的fortran二進制文件中。當這個回調得到執行,我們調用堆棧會是這個樣子:
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
我的問題是主題之一:將兩個紗線如何訪問內存中的同一個FORTRAN DLL處理?我的問題植根於內存中如何處理調用堆棧的確切細節:爲了使Fortran編譯器能夠生成可從JNA調用的代碼,而不需要一個程序計數器與另一個程序計數器互斥,那麼編譯器必須具有某種與JVM共同瞭解堆棧的存儲位置。 X86是否爲我們提供了某種單獨的程序計數器容器,其中Pthreads
,java.lang.Thread
和其他線程庫都使用,從而允許安全隔離調用堆棧?
爲了讓事情真的很有趣,我使用Quasar還討論 - 對於那些不熟悉,類星體提供所謂的「纖維」,這是「輕量線程」,由stackful協同例程來實現,這意味着Quasar執行堆棧幀的直接操作。
問題是,雖然我在概念上很樂意將OurCode.computationComponents
作爲回調來公開,但一些業務需求決定我不能。與其要求我們傑出的Fortran程序員將其現有代碼轉換爲具有顯式進入和退出(返回)點的代碼,我寧願使用協程來利用我們現有的代碼。
這個想法是,一個協同例程會在收率OurCode.computationComponents.java
產生通過HeavyComputation.f99
在傳遞給computationComponents
作爲返回值到的doHeavyComputation
呼叫者任何參數。然後調用者會做的computationCompoennts回調照常工作,路過的結果從與resumeHeavyComputation
,這將產生回computationComponents
並最終回到HeavyComputation.f99
我當然可以做到這一切與阻塞隊列和多線程,但試圖限制自己使用一個線程意味着我有一些接觸Quasar,這是很好的幾個原因。
類星體能否像我們使用的那樣複雜地處理和安全恢復?