2016-09-28 11 views
2

У нас есть приложение java, поддерживаемое двоичным файлом fortran, который мы активно развиваем. Я в основном на стороне java, и я считаю своей задачей защитить людей, которые работают на fortran, от некоторых неприятных систем, которые могли бы в противном случае их беспокоить, например, параллелизма и не надавливания на них, чтобы выставить сложные API.Является ли callstack безопасной для пользователя структурой данных? Квазар + Фортран?

Одно из решений, которое я сделал в этих строках, состояло в том, чтобы передать обратный вызов стиля JNA из java в наши бинарные файлы fortran. Когда этот обратный вызов запускается на выполнение, наш CallStack будет выглядеть примерно так:

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 - Для тех, кто незнаком, Quasar предлагает то, что он называет «волокно», которые являются «легкими нитями», реализуемым stackful сопрограмм, это означает, что Quasar выполняет прямые манипуляции с фреймами стека.

Проблема в том, что, хотя я концептуально рад выставить OurCode.computationComponents в качестве обратного вызова, некоторые бизнес-требования диктуют, что я не могу. Вместо того, чтобы просить наших прославленных fortran-программистов преобразовать свой существующий код в нечто с явными точками ввода и выхода (возврата), я бы скорее использовал сопрограмму, чтобы использовать наш существующий код.

Идея заключается в том, что сопрограмма бы выход при OurCode.computationComponents.java получая любые аргументы, которые были переданы, чтобы computationComponents от HeavyComputation.f99 как ReturnValue к вызывающей doHeavyComputation. Вызывающая затем сделать работу, что computationCompoennts обратного вызова обычно делает, передавая результат в от с resumeHeavyComputation, которая позволила бы получить обратно computationComponents и в конечном итоге вернуться к HeavyComputation.f99

Я могу, конечно, сделать все это с Блокировкой очередей и несколько потоков, но попытка ограничить себя использованием одного потока означает, что я получаю некоторое воздействие на Quasar, что приятно по нескольким причинам.

Может ли Quasar обрабатывать и безопасно восстанавливать стек так же сложно, как тот, который мы используем?

ответ

1

ОС предоставляет потоки. Другие модели программирования (Java, Quasar, независимо) должны основываться на этом, если они находятся в пространстве пользователя. Ваши «легкие потоки» Quasar будут по-прежнему жить в контексте вашего процесса ОС и потоков ОС. Так как потоки вашей ОС могут совместно использовать память, так что ваши «легкие потоки». Обратные вызовы на Java через JNA из разных «легких потоков» будут отображаться в одном и том же потоке Java-сопоставления (и, следовательно, в том же самом потоке).

Независимо от того, какие стеки времени выполнения Quasar перемещается вокруг своих сопрограмм, он будет в значительной степени непрозрачным для стороны Java.

 Смежные вопросы

  • Нет связанных вопросов^_^