
2025.02.12
職員一人あたり52時間の残業削減に成功 kintone導入がもたらした富士吉田市の自治体DX“変革”ハウツー
RustはOS界の銀の弾丸となりうるか(全1記事)
リンクをコピー
記事をブックマーク
garasubo氏:よろしくお願いします。「RustはOS界の銀の弾丸になりうるか 論文で見るRustで変わるOS設計」というタイトルでgarasuboが発表します。内容を詰め込みすぎちゃったので、けっこう駆け足の発表になると思いますが、ご了承ください。
Rustは、OSを書くにあたってC言語の代わりになるんじゃないかといろいろと注目されてきていて、今回は3つの論文を紹介します。論文はRustを使って新しいOSの設計を模索するというものです。
1つ目がSOSP2017(Symposium on Operating Systems Principles 2017)で発表された「Tock」というOSで、残り2つは2020年のOSDI(Operating Systems Design and Implementation)で発表された「ReadLeaf」と「Theseus」というOSを作った論文です。これらの内容を全部紹介するのは無理なので、Rustの性質をうまく活かせているところをピックアップして紹介していきたいと思います。
最初がTockというOSです。何度か私もブログで紹介しているんですが、これは省メモリなマイクロコントローラ用のとして設計されたもので、ArmのCortex-Mみたいな、すごくメモリ領域が限られたものを想定したOSです。
Tockの目的の1つがアプリケーション間の独立性を保ちつつ、アプリケーション内の柔軟性がほしいというもので、具体的には例えば1つのプロセスがたくさんメモリを使っても他のプロセスは無事にさせたいということです。従来だとメモリを確保するときは静的に何個か配列を作っておいて、各プロセスに割り当ててしまうことがけっこうあります。
そうすると定数で確保しちゃうので、最大値の制約の付け方が難しくなります。そこでmallocみたいに動的に確保しようとすると、あるプロセスがたくさんメモリを使ってしまって他のプロセスが足りなくなって、プロセス間の独立性が損なわれてしまう危険性がありました。
それを解決するためにTockにはGrantsという仕組みがあります。プロセスがシステムコールを呼び出すときに、動的にメモリを確保する必要があるケースで使うものです。例えばタイマードライバがあって、新しいイベントを登録したい。そのイベントのメタデータをメモリ上に置いておきたいというときにメモリを確保する必要があります。
Grantsには、プロセスごとにメモリ領域があって、そのメモリ領域の一部をOS側に貸し出します。その貸し出した仕組みをGrant型としてRustで実装して、カーネルはGrant型を利用してそのメモリ領域を触ります。
メモリ領域を自分から貸し出すので、メモリをたくさん使って困るのはプロセスだけになります。Grantのインターフェイスによってコンパイラがこの領域の安全性を保証するという仕組みです。
これが実際の実装で、ライフタイム制約によってOwned型なので、カーネル側はメモリ内部を触るんですが、ライフタイム制約が付いているので他のプロセスには渡せません。Result型でCopy型のRなので、エラーコードなどは返せるようになっています。
次のReadLeafですが、これはx86ベースのアーキテクチャ用で、Rustを使って実装されたマイクロカーネルベースのOSです。基本的なコンセプトはハードウェアのアドレススペースではなくて、Rustの言語機能を使ってfault isolationを実現しようというものです。
最終的にはPOSIXのサブセットまで実装して、ネットワークドライバで実際に実装して比較実験をしています。今回見るのはドメイン間通信のところです。ドメインごとの独立性を担保しつつ、ドメイン間通信を実現するためにRustの言語機能を使っているのを見ていきます。
ドメイン間通信は効率良くやりたいので、共有のヒープ領域を利用するんですが、例えばあるドメインが共有のヒープ領域から確保されたオブジェクトを抱えたままクラッシュすると、抱え落ち状態になって困るという問題があります。これをどうしたかというと、共有ヒープの領域をRRef
この型は、「どのドメインがこのオブジェクトを持っている」という情報をきちんともっているので、クラッシュしたときはそのRRef
抱え落ちするオブジェクトが生まれるインターフェイスが作れないように各ドメインを設定しています。
最後にTheseusというOSです。これが一番アーキテクチャとして尖っているなと個人的に思っています。これもx86を対象にして作られていて、OSのコンポーネント間でのステートスピル、状態が他のコンポーネントに漏れ出すというのがOSのバグの原因としてよくあるらしくて、それをいかに少なくするかということに焦点を当てて設計したRust製のOSです。
どうやって実現したかというと、OSの実行モデルと言語の実行モデルをできるだけ近づけてコンパイル時の静的チェックを最大限利用しています。
言語を実行モデルと一致させるのは、すべてのコンポーネントをシングルアドレススペースで、同じ権限上で動かしています。
タスク管理を見てみます。Theseusでは標準ライブラリのスレッドではなくて、独自のタスク抽象化をしていて、型制約を利用することで、ライフタイムやスレッド安全性をコンパイラレベルで保証しています。
いろいろと工夫があるんですが、タスク生成の部分だけ詳しく見ていきたいと思います。コードはこんな感じになっていて、funcというもので渡されるのがエントリの関数なんですが、FnOnceという型制約を付けることで、この中で複数回呼ばれないことを保証しています。TArgが引数でTRetが返り値ですが、Sendが制約として付いているのでタスクが終了しても引数や返り値が解放されないことを、static制約で保証しています。
まとめです。Rustを使って新しいOS設計を試みる論文を紹介しました。OSの満たすべき性質をRustの言語制約に紐づけて、コンパイラで静的に検証することにより、従来の言語や設計で難しかったOSの構築ができる可能性が見えてきたんじゃないかなと思いました。
関連タグ:
2025.02.06
すかいらーく創業者が、社長を辞めて75歳で再起業したわけ “あえて長居させるコーヒー店”の経営に込めるこだわり
2025.02.13
“最近の新人は報連相をしない”という、管理職の他責思考 部下に対する「NG指示」から見る、認識のズレを防ぐコツ
2025.02.13
AIを使いこなせない人が直面する本当の課題 元マッキンゼー・赤羽雄二氏が“英語の情報”を追い続ける理由
2025.02.12
マネージャーは「プレイング3割」が適切 チームの業績を上げるためのマネジメントと業務の比率
PR | 2025.02.07
プロジェクトマネージャーは「無理ゲーを攻略するプレイヤー」 仕事を任せられない管理職のためのマネジメントの秘訣
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
2025.02.06
落合陽一氏や松尾豊氏の研究は社会に届いているか? ひろゆき氏が語るアカデミアの課題と展望
2025.02.10
32歳で「すかいらーく」を創業、75歳で「高倉町珈琲」で再起業 「失敗したからすかいらーくができた」横川竟氏流の経営哲学
2025.02.12
何度言っても変わらない人への指示のポイント 相手が主体的に動き出す“お願い”の仕方
2025.02.13
「みんなで決めたから」を言い訳にして仲良しクラブで終わる組織 インパクトも多様性も両立させるソース原理
着想から2か月でローンチ!爆速で新規事業を立ち上げる方法
2025.01.21 - 2025.01.21
新人の報連相スキルはマネージメントで引きあげろ!~管理職の「他責思考」を排除~
2025.01.29 - 2025.01.29
【手放すTALK LIVE#45】人と組織のポテンシャルが継承されるソース原理 ~人と組織のポテンシャルが花開く「ソース原理」とは~
2024.12.09 - 2024.12.09
『これで採用はうまくいく』著者が語る、今こそ採用担当に届けたい「口説く」力のすべて
2024.11.29 - 2024.11.29
【著者来館】『成果を上げるプレイングマネジャーは「これ」をやらない』出版記念イベント!
2025.01.10 - 2025.01.10