大手IT面接オペレーティングシステム頻出10問:プロセス・メモリ・ファイルシステムを完全網羅
プロセス、メモリ、ファイルシステムなどOSの高頻出面接10問を網羅。各問題に出題ポイントと回答方向付きで、OS面接を全面的に準備できる。
背景紹介
オペレーティングシステムの授業は大学時代に曖昧に学び、試験ではプロセス状態遷移図を暗記する程度だった。仕事を始めてから、面接官が聞くOSの問題は非常に実践的であることに気づいた——epollがなぜ効率的なのか、仮想メモリがどう動作するのか、プロセスとスレッドの本当の違いは何か。約10日間かけてOSの高頻出題を再整理し、実はいくつかのコア知識ポイントしかないことを発見した。基礎となるロジックを理解すれば、面接で応用が利くようになる。この10問は私が面接した数社で最も頻繁に出題されたものだ。
一、プロセス(3問)
1. プロセス、スレッド、コルーチンの違い?
出題ポイント:並行モデルの理解
プロセスはリソース割り当ての基本単位で、独立したアドレス空間を持つ;スレッドはCPUスケジューリングの基本単位で、プロセスのアドレス空間を共有;コルーチンはユーザー空間の軽量スレッドで、プログラム自身がスケジューリングし、カーネルの関与なしで切り替えられる。重要な違い:プロセス切替のオーバーヘッドが最大(ページテーブル、TLB等の切替が必要)、スレッド切替が次(アドレス空間を共有、レジスタとスタックの切替のみ)、コルーチン切替のオーバーヘッドが最小(ユーザー空間でのレジスタ保存/復元のみ)。追問:いつマルチプロセスを使い、いつマルチスレッドを使うか?マルチプロセスはCPU集約型で分離が必要なシナリオに適し(Chromeのマルチプロセスアーキテクチャなど)、マルチスレッドはメモリ共有が必要なシナリオに適する。Goのgoroutineは本質的にコルーチン+マルチスレッドスケジューラの組み合わせ。
2. プロセス間通信(IPC)の方式?
出題ポイント:プロセス協力メカニズム
7つの方式:パイプ(半二重、親子プロセス間)、名前付きパイプ(無関係なプロセス間)、メッセージキュー(カーネル内のメッセージリンクリスト)、共有メモリ(最速、セマフォとの同期が必要)、セマフォ(カウンタ、アクセス順序の制御)、シグナル(非同期通知メカニズム)、ソケット(クロスネットワーク通信)。面接官が最も聞く:どれが最速か?共有メモリ。カーネル空間とユーザー空間間のデータコピーが不要だから。ただし共有メモリは同期問題を自分で処理する必要があり、通常セマフォと組み合わせて使用。実際のプロジェクトでは、同一マシンは共有メモリ+セマフォ、クロスマシンはソケットまたはRPC。
3. デッドロックの条件と予防?
出題ポイント:デッドロック理論
4つの必要条件:相互排除(リソースは同時に1つのプロセスのみ使用可能)、保持と待機(リソースを保持しながら他のリソースを待機)、非割り込み(取得済みリソースは強制的に奪取不可)、循環待機(プロセス間で環状待機チェーンを形成)。いずれかの条件を破壊すれば予防可能:相互排除は一般に破壞不可;保持と待機はプロセスに全リソースを一括要求させることで対応;非割り込みはタイムアウト解放で対応;循環待機はリソースに番号を付け順序通りに要求することで対応。追問:実際の開発でデッドロックをどう避けるか?最も実用的な方法はロック順序の統一とタイムアウト設定。プロジェクトではtryLockにタイムアウトを付けてデッドロックを回避している。
二、メモリ(3問)
4. 仮想メモリとは?
出題ポイント:メモリ管理の核心概念
仮想メモリは各プロセスに独立した連続的な仮想アドレス空間を提供し、ページテーブルを通じて物理メモリにマッピングする。核心的な利点:プロセス分離(各プロセスが独立したアドレス空間を持つ);メモリ保護(ページテーブルエントリにパーミッションビットあり);オンデマンド割り当て(実際にアクセスされたページのみ物理メモリを割り当て);メモリオーバーコミット(物理メモリ不足時にページをディスクにスワップ可能)。追問:仮想アドレスから物理アドレスへの変換過程は?仮想アドレス→MMUがTLBを検索→TLBヒットで物理アドレスを直接取得→TLBミスでページテーブルを検索→ページテーブルヒットで物理アドレスを取得→ページテーブルミスでページフォールト割り込みをトリガー→ディスクから物理メモリにページをロード→ページテーブルとTLBを更新。
5. ページ置換アルゴリズム?
出題ポイント:ページフォールト処理戦略
一般的なアルゴリズム:OPT(最適、将来最も長く使用されないページを置換、理論上存在し実装不可)、FIFO(先入先出、Beladyの異常が発生する可能性——物理ページ増加でページフォールトが逆に増加)、LRU(最近最も使用されていない、性能は良いが実装オーバーヘッド大)、Clock(LRUの近似、参照ビット+循環リンクリスト使用)、LFU(最も使用頻度が低い、頻度で淘汰)。Linuxは実際にはアクセスビットとダーティビットを考慮した改良版Clockアルゴリズムを使用。追問:LRUの実装方法は?ハッシュテーブル+双方向リンクリスト、O(1)の検索と調整。これはLeetCode 146問の古典的実装で、面接でよく手書きされる。
6. メモリマッピング(mmap)とは?
出題ポイント:ファイルマッピングメカニズム
mmapはファイルをプロセスの仮想アドレス空間にマッピングする。このメモリ領域の読み書きはファイルの読み書きと同等で、OSがディスクへの同期を担当する。利点:ユーザー空間とカーネル空間間のデータコピーを回避(従来のread/writeは2回のコピーが必要);大規模ファイル処理に適する;複数プロセスが同じファイルをマッピングして共有メモリを実現可能。欠点:マッピング領域のサイズは仮想アドレス空間に制限される;ランダム書き込みの効率はシーケンシャル書き込みに劣る。追問:mmapとread/writeの違い?read/writeはカーネルバッファを中継として使用、mmapはページキャッシュを直接操作。Kafkaはmmapを使用して書き込み性能を向上している。
三、ファイルシステム(2問)
7. inodeとは?
出題ポイント:ファイルシステムメタデータ
inode(インデックスノード)はファイルのメタデータを保存:ファイルサイズ、パーミッション、所有者、タイムスタンプ、データブロック位置など。重要なポイント:inodeはファイル名を保存せず、ファイル名はディレクトリエントリ(dentry)に保存される。1つのパーティションのinode数はフォーマット時に決定され、大量の小ファイルがあるとinodeが使い切られてもディスク容量が残る場合がある。追問:inode使用状況の確認方法は?df -i。inode枯渇の解決方法は?不要なファイルの削除、フォーマットし直してinode数を増やす、より大きなディスクを使用。
8. ソフトリンクとハードリンクの違い?
出題ポイント:ファイルリンクメカニズム
ハードリンク:同じinodeを指す異なるファイル名、1つ削除しても他に影響なし、ファイルシステムを跨げない、ディレクトリをリンクできない。ソフトリンク(シンボリックリンク):独立したファイルで、内容は別のファイルへのパス、ファイルシステムを跨げる、ディレクトリをリンクできる、元ファイル削除後にソフトリンクは無効になる(ダングリングリンク)。追問:ls -iでハードリンクのinode番号が同じことを確認できる。ハードリンクの作成はln、ソフトリンクの作成はln -s。実際の開発ではソフトリンクの方が多く使われる。例えばNginxのsites-enabledディレクトリはソフトリンクで設定を管理している。
四、その他(2問)
9. select、poll、epollの違い?
出題ポイント:IO多重化メカニズム
select:最大1024個のfd(FD_SETSIZE)を監視、毎回fd集合をユーザー空間からカーネル空間にコピー、戻り後に全fdを走査してレディなものを探す、O(n)の計算量。poll:1024制限なし、ビットマップの代わりにリンクリストを使用、しかし依然としてO(n)の走査。epoll:イベント駆動、epoll_ctlでfdを登録する際にカーネルにコールバックを設定、epoll_waitはレディなfdのみ返却、O(1)の計算量(実際はO(アクティブfd数));ET(エッジトリガー、1回のみ通知)とLT(レベルトリガー、継続通知)モードをサポート。追問:ETとLTの選び方?ETは効率が高いがプログラミングがより複雑(ノンブロッキングIO+EAGAINまでループ読み取りが必須)、LTはより安全。NginxはET、RedisはLTを使用。
10. ユーザー空間とカーネル空間の違い?
出題ポイント:オペレーティングシステムの特権レベル
カーネル空間はOSカーネルコードを実行し、すべてのメモリとハードウェアにアクセス可能;ユーザー空間はアプリケーションを実行し、制限されたメモリにのみアクセス可能、ハードウェアを直接操作不可。ユーザー空間からカーネル空間への切り替え方式:システムコール(自発的)、例外(ページフォールトなど)、デバイス割り込み(キーボード入力など)。切り替えオーバーヘッド:ユーザー空間レジスタの保存/復元、スタックの切り替え、CPU特権レベルの更新、TLBとCPUパイプラインのフラッシュの可能性。追問:カーネル空間への切り替えを減らすには?read/writeの代わりにmmapを使用、システムコールのバッチ化、vDSOの使用(カーネルをユーザー空間の読み取り専用ページにマッピングし、一部のシステムコールで切り替え不要)。
心得とアドバイス
OS面接の準備についての体験:プロセスとメモリは最重要中の最重要で、ほぼ毎回の面接で出題される;epollはバックエンド開発の必須問題で、select/pollからepollへの進化過程と原理を明確に説明できなければならない;仮想メモリとページ置換はメモリ管理理解の基礎であり、Linuxの実際の実装と結びつけて理解することを推奨。また、OSの問題は具体的なシナリオと組み合わせて出題されることが多い。例えば「Redisがなぜシングルスレッドを使うのか」「Kafkaがなぜmmapを使うのか」など、OSの原理を理解してこそこのような総合問題に答えられる。
FAQ
Q:OS面接にLinuxソースコードの読解は必要?
全てを読む必要はないが、主要モジュールの実装(epollソースコード、プロセススケジューラなど)を理解していると大きくプラスになる。
Q:epoll面接の準備方法は?
ET/LTの違い、epollのデータ構造(赤黒木+レディリスト)、なぜselect/pollより効率的かを重点的に理解する。
Q:プロセスとスレッドでよく出題されるのは?
違いと選択、プロセス間通信方式、スレッド同期メカニズム(ミューテックス/条件変数/読み書きロック)、デッドロックの予防と検出。