Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

Linux概要 - UNIXカーネルの概要(3)

Last updated at Posted at 2025-03-01

再入可能なカーネル(Reentrant Kernel)

UNIX系のカーネルは 再入可能(リエントラント、Reentrant) です。つまり、複数のプロセスがカーネルモードで同時に実行される可能性があります。

カーネルの再入可能性とは?

単一のCPUしかないシステムでは、一度にCPU上で実行できるプロセスは1つだけです。しかし、カーネルモードで実行しているプロセスが I/O待ち(ディスクやネットワークの応答待ちなど) になると、そのプロセスは停止され、他のプロセスが実行されることがあります。

例えば、あるプロセスが ディスクからデータを読み取る要求 を発行した場合、その処理は ディスクコントローラ に任されます。この間、カーネルは別のプロセスの実行を開始できます。そして、ディスクの読み取りが完了すると、割り込み(Interrupt) によってカーネルに通知が送られ、停止していたプロセスが再開されます。

このように、複数のプロセスが カーネルモードでの実行を一時中断しながら動作する 仕組みを カーネルの再入可能性 と呼びます。

再入可能なカーネルを実現する方法

カーネルを再入可能にするための重要なポイントは、同じカーネルコードが複数のプロセスによって同時に安全に実行できる ように設計することです。

① 再入可能な関数を使う

一般的に、ローカル変数 のみを使用し、グローバル変数を変更しない 関数は 再入可能(リエントラント)関数 と呼ばれます。再入可能な関数は、複数のプロセスから同時に呼び出されても、データ競合が発生しません。

② ロック(排他制御)を使う

ただし、カーネル内には、再入不可能な関数(グローバル変数を変更する処理など)も存在します。この場合、複数のプロセスが同時に実行すると競合が発生するため、ロック(mutexやスピンロック) を使って、一度に1つのプロセスだけがその関数を実行できるようにします。

カーネル実行パスと再入可能性

カーネルでは、以下の3つのイベントによって カーネル実行パス(Kernel Execution Path)が発生します。

  1. システムコール(ユーザープロセスがOSの機能を呼び出す)
  2. 例外処理(ページフォルトなどのエラーが発生する)
  3. ハードウェア割り込み(I/O完了やタイマ割り込みなど)

カーネルの再入可能性によって、これらの実行パスが並行して動作する場合があります。以下のような状況で 複数のカーネル実行パスが同時に動作する ことになります。

① システムコールによるプロセスの切り替え

ユーザープロセスがシステムコールを発行しても、カーネルがすぐに処理を完了できない場合があります。例えば、I/O待ちが発生すると、スケジューラが別のプロセスを実行 し、最初のカーネル実行パスは一時停止されます。

結果:
  • 最初のプロセス は I/O待ちになり、一時停止
  • 新しいプロセス が実行され、別のカーネル実行パスが動作
② 例外発生による処理の切り替え

カーネル実行中に 例外(ページフォルトなど) が発生すると、一時的にその処理を中断し、例外処理ルーチンが実行されます。

例:
  • ユーザープロセスがアクセスできないメモリにアクセス → ページフォルト発生
  • カーネルがページフォルト処理を実行し、新しいメモリページを割り当て
  • 例外処理が完了すると、元のカーネル実行パスを再開

③ 割り込みによる処理の中断

カーネル実行中に ハードウェア割り込み(I/O完了など)が発生すると、カーネルは現在の処理を中断し、割り込み処理ルーチン(割り込みハンドラ)を実行します。

例:
  • カーネルがシステムコールを処理中に、ディスクの読み取りが完了 → 割り込み発生
  • 割り込みハンドラがディスクデータを処理
  • 割り込み処理が終わると、カーネルは元の処理を再開

④ カーネル内プリエンプション(優先度の高いプロセスへの切り替え)

カーネルが実行中に、より高い優先度のプロセスが実行可能になった場合、CPUは現在の処理を中断し、新しいプロセスのカーネル実行パスを開始することがあります。

ただし、この動作はカーネルの設定(プリエンプション有効/無効)によって異なります。

カーネルの再入可能性とシステム全体への影響

カーネルが再入可能であることで、次のようなメリットがあります。

I/O処理の効率化

  • カーネルがI/O待ちの間、他のプロセスを実行できるため、CPUの待機時間が減る。
    • リアルタイム性の向上
  • 割り込みをすぐに処理できるため、デバイス応答が早くなる。
    • マルチプロセッサ対応が容易
  • 再入可能なカーネルは、複数のCPUが同時にカーネルコードを実行できる設計になる。

一方で、データ競合を防ぐためのロック管理が複雑になる という課題もあります。ロックの使用を最小限に抑えつつ、高速に処理を行うことが、カーネル設計の重要なポイントとなります。

まとめ

  • UNIXカーネルは 再入可能 であり、複数のプロセスがカーネルモードで同時に実行される可能性がある。
  • I/O待ちや割り込みによって、カーネル実行パスが並行して動作する ことがある。
  • 再入可能なカーネルを実現するために、再入可能な関数 を使用し、必要に応じて ロック機構 を利用する。
  • 再入可能なカーネルにより、I/O処理の最適化、リアルタイム性向上、マルチプロセッサ対応の強化 が可能になる。

次の記事へ

前の記事へ

一覧へ戻る

免責事項
本記事は、筆者の理解に基づいて執筆したものです。正確性には十分配慮していますが、内容の誤りや最新の情報と異なる可能性があります。
本記事の内容を参考にしたことによるいかなる損害についても、筆者は責任を負いかねますのでご了承ください。
正確な情報や書籍に書かれている根拠等はサポートしませんので、ご自身で公式ドキュメントをお調べください。
よって、この内容をAIの学習データに活用することはおすすめしません。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?