java.lang.Fiber APIで、OSに依存しないマルチスレッドなプログラミングを実施できるらしい

なんてこった、パンナコッタ、テラコッタ、肩凝った、スリジャヤワルダナプラコッテ...

2016年から2018年の3年間は日本では6月は祝日がない唯一の月となっていた。また、過去にもこの月に祝日が存在したことがない。

これは皇室由来の節目の日もなく、庶民の生活も農繁期でハレの行事がなかった点が影響している。

6月 - Wikipedia

⇧  嘘だって言ってよ、Wikipediaさん...

ということで、5月病の次には、6月病が控えているという...、どうもボクです。

フィクション作品では漫画『ドラえもん』でドラえもんひみつ道具の1つである「日本標準カレンダー」を使って独自に祝日を制定するエピソードがある。

  • 漫画版ではのび太が6月に祝日がないことに対する不満から6月2日を「ぐうたら感謝の日」という架空の祝日を制定したことがある
  • アニメ版では2014年6月13日放送「たけしのズンドコ誕生日」でジャイアンが6月13日は「昼寝の日」、6月15日は「ジャイアンの誕生日」も祝日に制定された。

6月 - Wikipedia

ドラえもんは、一体いつ開発されるんでしょうね...

 

ということで、祝日が一切ない6月が始まり、絶望が待ち受けているという...そうじゃなくて、ちょっと、時間が経ってしまったんですが、Java のイベントに参加してきました~。

f:id:ts0818:20190518230721p:plain

github.com

⇧  今回も面白い話が盛りだくさんでした。スポンサー様に、「星野リゾート」様がおられたおかげで、『よなよなエール』っていうビールも飲めたし、「LINE」様がおられたおかげで『お寿司』も食べれたし、大満足でした!

肝心のJavaの技術のほうも、新しい技術が知れて良かったです。

 

Pivotalジャパン(株)の「槙俊明」さんのセッションで、Spring Framework で関数型の記述ができるようになったよって話も面白かったです、もはやSpringの意味無くなってくるけどというツッコミも。

docs.google.com

 

んで、Javaチャンピオンの「櫻庭 祐一」さんのセッションでその存在を知ったのですが、「Project Loom」 というプロジェクトで絶賛開発中の「Fiber」という技術。

 

 

Open JDK のプロジェクトらしいっす。

wiki.openjdk.java.net

Project Loom is to intended to explore, incubate and deliver Java VM features and APIs built on top of them for the purpose of supporting easy-to-use, high-throughput lightweight concurrency and new programming models on the Java platform. This is accomplished by the addition of the following constructs:

  • Fibers (lightweight user-mode threads)
  • Delimited continuations
  • Tail-call elimination

This OpenJDK project is sponsored by the HotSpot Group.

Main - Loom - OpenJDK Wiki

Java に新たなプログラミングのモデルを!って言うとりますね。

Note

Loom is under active development, which means that information and advice given here might change in the future.

 

 

 

⇧ 未だ開発中につき、APIの情報が今後変わっていくかも知れないと...

Javaチャンピオンの「櫻庭 祐一」さんの話では、仕様が定まるのが、3年後ぐらいなんじゃないかって話らしいっす(涙)。

なので、実際のプロジェクトで使うのは控えましょう言うことみたいです。

 

Fiberで何ができるのか

具体的に、どんなことができるのか?

nowokay.hatenablog.com

www.sakatakoichi.com

taichiw.hatenablog.com

⇧  上記サイト様によりますと、「継続(Continuation)」、「軽量スレッド(Fiber)」をJavaに導入することを目的としているんだと。

 

う、う~ん...どっちもよく分からんのだけど、

www.youtube.com

⇧  上記の動画によりますと、「継続(Continuation)」については、

「A continuation(precisely: delimited continuation)is a program object representing a computation that may be suspended and resumed(also, possibly, cloned or even serialized).」

と仰ていますね。

処理の状態を保持しておけるオブジェクトということらしいです。

 

んで、「軽量スレッド(Fiber)」については、

「Key idea:A language runtime is better positioned to manage and schedule application threads than the OS, esp.if they interleave IO and computation and interact ofthen --exactly how server threads behave(also, UI elements)」

と仰ていますね。

要するに、OSが管理するスケジューラー(アプリケーションのスレッドを管理する)だと無駄が多いので、JVMで管理できるようにして軽量スレッドとなるようにしたいってことみたいです。

 

んで、Javaの話に限定だとは思うのだけど、

「Thread = Continuation + Scheduler」

っていう定義をしてるようで、「Scheduler」については、既に存在する「ForkJoinPool」ってのを使っていったら良いのでは?という話らしいです。

んじゃ、「Continuation」はどうすんのよ?ってところで、

「We need:
・Millions of continuations(=> low RAM overhead)
・Fast task-switching(=> no stack copying)」 

ってことで模索中ってことですかね。

よく分からんのだけれど、Stack が関係してるんですかね?

  1. Contiguous virtual memory
  2. Stacklets(constant-size, linked, C hap)
  3. Horizontal stacks(contiguous, Java heap)
  4. Native Horizontal stacks(contiguous, C-heap)

動画の紹介だと、v-stack から Native Call で continuation を呼ぶみたいに見えるけど、そもそも「v-stack」「Native Call」って何よ?

f:id:ts0818:20190601223035p:plain

⇧  この図の意味が分からんですたい...。

 

ちなみに、Java 8 で、JVMのプロセスの構成が変わってるそうな...

stackoverflow.com

 

そして、「v-stack」「Native Call」は結局よく分からんのだけど、

luozengbin.github.io

⇧  上記サイト様によりますと、JVMの仕様上のメモリ構成は、

f:id:ts0818:20190601223335p:plain

⇧  「Java Stack」「Native Stack」が別れているのだけれど、

JDKの実装によって、JVMのメモリ構成が異なってくるのだそうです...

んで、「HotSpot」のJVMによるメモリ構成は以下のようになるようです。「Java Stack」「Native Stack」が同じメモリ領域を共有しているらしい...仕様の意味ないっすね...。

f:id:ts0818:20190601223538p:plain

動画で言ってる、「v-stack」は、これのことを言ってるのかしら?

だとすると、動画の「Native Call」っちゅうのは、「Native Stack」から「continuation」を呼び出し、「Java Stack」の「Frame」に「continuation」を格納してるってことなのかしら?

ところで、「Thread = Continuation + Scheduler」の「Thread」== 「Fiber」って考えて良いのかしら?
 

というわけで、今回もモヤモヤ感が半端ないし、結局よく分からんのだけど、3年後ぐらいにはFiber が使えるようになるんじゃなかろうかという話でした。

ちなみに、いまは、 

Supported Platforms

Mac and Linux on x86-64

Main - Loom - OpenJDK Wiki

⇧ 公式サイトの説明にあるように、

のどちらかでしか使えないらしい(涙)。また、Windows は除け者パターンですね...。

時間がある時に、Virtual Box上に仮想マシン作って、試してみたいですかね~。

 

今回はこのへんで。