2016-09-28 43 views
2

我們有一個由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是否爲我們提供了某種單獨的程序計數器容器,其中Pthreadsjava.lang.Thread和其他線程庫都使用,從而允許安全隔離調用堆棧?


爲了讓事情真的很有趣,我使用Quasar還討論 - 對於那些不熟悉,類星體提供所謂的「纖維」,這是「輕量線程」,由stackful協同例程來實現,這意味着Quasar執行堆棧幀的直接操作。

問題是,雖然我在概念上很樂意將OurCode.computationComponents作爲回調來公開,但一些業務需求決定我不能。與其要求我們傑出的Fortran程序員將其現有代碼轉換爲具有顯式進入和退出(返回)點的代碼,我寧願使用協程來利用我們現有的代碼。

這個想法是,一個協同例程會在收率OurCode.computationComponents.java產生通過HeavyComputation.f99在傳遞給computationComponents作爲返回值到的doHeavyComputation呼叫者任何參數。然後調用者會做的computationCompoennts回調照常工作,路過的結果從與resumeHeavyComputation,這將產生回computationComponents並最終回到HeavyComputation.f99

我當然可以做到這一切與阻塞隊列和多線程,但試圖限制自己使用一個線程意味着我有一些接觸Quasar,這是很好的幾個原因。

類星體能否像我們使用的那樣複雜地處理和安全恢復?

回答

1

操作系統提供線程。其他的編程模型(Java,Quasar等)必須建立在其之上,如果他們在用戶空間。你的Quasar「輕量級線程」將仍然存在於OS進程和OS線程的上下文中。既然你的操作系統線程可以共享內存,那麼你的「輕量級線程」也可以。通過JNA從不同的「輕量級線程」回調Java將看起來都在同一個Java映射線程中(因此也是同一個本地線程)。

無論運行時棧是什麼類型的Quasar對其協程的混洗對Java端來說將是很不透明的。