LoginSignup
1
0

More than 3 years have passed since last update.

プログラミング(IT)初心者がgoroutineを理解しようと頑張ってみた。

Posted at

はじめに

LaravelやRailsなどのMVCフレームワークでのwebアプリケーション作成くらいしかしたことない自分がGoを自主学習してみた。

PHPやRubyと重複してるような文法はある程度把握できたが、goroutineが出た瞬間に何が何だか分からなかったので、理解のプロセスをまとめてみた。

学習の流れ

1、A tour of goでの解説を噛み砕いてみた

goroutine (ゴルーチン)は、Goのランタイムに管理される軽量なスレッドです。

ランタイムとは

スレッドとは
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典(引用)

上記二つの記事を元に噛み砕いた結果
goroutine (ゴルーチン)は、Goが持つ、軽いプログラムの実行手段(並行処理)。

みたいな感じでしょうか。
Goが凄いと言われる理由にもなるgoroutineの理解を少し深めてみました。

2、goroutine (ゴルーチン)の並行処理についてもう少し理解を深めてみた

理解を深める際に
goroutineはなぜ軽量なのかという記事を参考にしました。

goroutineが軽量な理由

・プログラムを実行する際のメモリ使用量が低い
・プログラムを切り替える際のコストが低い
という点があります。
それぞれについてまとめました。

スレッドに比べてメモリ使用量が低い

プログラム実行時にメモリ領域が利用されます。
その領域の利用のされ方は大きく三つある
1、スタック領域(コンパイラやOSが勝手に利用領域を決めちゃう)
2、ガード領域(スタック領域とヒープ領域が重複されないように壁を作ってる)
3、ヒープ領域(プログラムが意図的に利用領域を調整できる)

上記の問題点として
・スタック領域が多めに確保しちゃう
・ガード領域がプログラム実行が行われる度にできちゃう
↓イメージ図
スクリーンショット 2020-12-03 11.58.42.png
イベントループなしでのハイパフォーマンス – C10K問題へのGoの回答 | POSTD(引用)

完結に言うとgoroutineを利用することで、
スタック領域を最小限にするかつ、ガード領域を無くし、処理を早くすることができるらしい
凄いね!

プログラムを切り替える際のコストが低い

プログラムを並行処理するにあたって、スイッチングコストという負荷がかかる。
goroutineは現行で一番早いとされているM:N(ハイブリッドスレッディング)というものを採用されている。
このM:Nの欠点としてスケジューラ(プログラムに優先順位をつける)が複雑になるが、それはGO言語自体の機能で補完されている。

詳細はこちら

とても簡単に言うと
M:Nは処理めっちゃ早いんだけれども、プログラムの処理を行う順序を意図的に行えないという欠点がある。
しかし、Go言語は順序を意図的に行える機能がついていて、その欠点はないも同然!!

最後に

いかがでしょうか。
Goの何が凄いかを理解しないまま使うのは恥ずかしいと思い、goroutineについて調べてみました。
思ったよりも自分の知識の補完ができた上にGoが凄い理由を話せるようになってよかったです。

たくさんの参考文献を利用させていただきました。ありがとうございます!!!!!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0