ごらくらいふ

プログラミングしたりゲームしたり

OSXやiOSにおけるスレッドのスタックサイズ

最近、ご無沙汰になっていたので軽いものを。

iOS関連のトラブルシューティングを行っている際に、スタックのアドレスか、そうでないかを気にする場面があった。

「そういえば、スタックの大きさってなんだ?」 ドキュメントによれば、メインスレッドには特別に多く割り当てられるらしい。

OSX(いまや macOS ?)では 8MBiOS においては 1MB だそうだ。iPadOSもiOSに準じていそうだ。

そして、サブスレッドには 512KB まで割り当て可能のように読める。最小は 16KB で、 4KB 単位で増やすことができるという。

Thread Management

ここから雑多に考えてることを書き出している。理路整然とはしていない。

メモリに対するおおまかなイメージは、単一のスレッドが単一の仕事をする場面における印象しかなかった。 ヒープもスタックも同一の主記憶装置(メモリ)を使い、膨大なメモリ空間の先頭側から自由に使える空間をヒープメモリ、メモリ空間の末尾側から使われ積まれていくものをスタック領域と呼ぶイメージだった。 スタックオーバーフローはこのヒープとスタックがぶつかったときに起きるような、そんな認識でいた。

仕事で付き合うコンピューターはマルチスレッドで動いているものだし、単一のプロセスに集中するのではなく、多くのプロセスにいい感じに計算リソースを割り当てて動いている。 ということは、あれこれをごちゃ混ぜにしては管理がし辛いはずだ。

求められる仕事の数に対して、レジスタの数は限られている。 スタックポインタはスタック操作のたびにアドレスを変えるのだから、いろんなプロセスが同じスタック領域を共有していては扱うアドレスやデータを間違えないことは不可能だろう。 スレッドが扱うプロセスを変えるたびに、レジスタの状態は保存され(また、復元され)ているべきだろう。 保存・復元を用意にするためには、プロセスごとに使用するメモリの領域が予約されていればいいのだろう。 雑多に混ざっているよりは、「このプロセスが使うメモリの(スタック)領域はこの範囲」と明らかになっていれば、扱いやすいことは想像に難くない。

スレッドごとに決められたスタック領域を割り当てられるもの、という認識が持てて今回の調べ物は良かった。