カーネル全体のロック

v2.2以前は、プロセスがシステムコールを発行すると、その入口でカーネル全体をロック(lock_kernel関数)していた。しかしv2.4では、カーネルロック(lock_kernel関数)が大幅にスピンロック(spin_lock関数)を用いるコードに書き直された。

ネットワークのコードはほぼ全てといって良い程、各資源毎にスピンロックを利用するコードに書き直されている。

ファイルI/Oに関しては、read/writeファイルI/Oに関してはカーネルロックを行なわず、スピンロックで実現できるようコードが書き直されている。ただし、メタデータ(inode、間接ブロック、ディレクトリ、フリーbitmapなど)を更新するときは、相変わらずカーネルロックを行っている(資源間の依存関係が深く、単純にはスピンロックに書き直せないものと思われる)。

空間管理に関しては、ページフォルトのルートにはカーネルロック処理が姿を消している。

それ以外のカーネル資源に関しても、カーネルロックで保護される部分はかなり少なくなって来ている。

が、しかし依然としてカーネルロックで保護されている資源は多数残されている。それらの資源はこのカーネルロックを行ったプロセスからでないとアクセスは許されていない。複数のプロセスが同時にカーネルロック(lock_kernel関数)行おうとすると、そのうちの一つのプロセスのみがカーネルロックに成功し、カーネルロックで保護されている資源を利用する権利を得る。他のプロセスはカーネルロックが終了するのをカーネルロック関数(lock_kernel関数)内でビジーウェイトして待ち続ける。

CPU数の多いマルチプロセッサマシンでは、まだこのあたりがネックになりそうであり、まだまだ改善の余地がある。

img124.gif

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1