カーネル
それらは単純なハードウェア抽象化の小さなセットを提供し、サーバと呼ばれるアプリケーションを使ってさらなる機能を提供する。この特定の手法でハードウェア上の高度な仮想インタフェースを定義し、プロセス管理、並行性管理、メモリ管理といったスーパーバイザモードで動作するいくつかのモジュールでOSサービスを実装し、システムコールでそれらを呼び出せるようにしている。しかし、このような設計には以下のような短所や制約がある。
カーネル内のコーディングは難しい。標準Cライブラリが使えず、デバッグにはGNUデバッガなどのソースレベルのデバッガを必要とするためである。そのため、開発中はコンピュータを頻繁にリブートする必要がある。これは単に開発者だけの問題ではない。デバッグが難しいということはバグをつぶすのが難しいということであり、カーネル内にバグが残存しやすいということでもある。
カーネル内のバグは重大な副作用を引き起こす。カーネル内の関数はどれも特権状態で動作するので、全く無関係なデータ構造を(カーネル空間内でもユーザー空間内でも)容易に壊すことができる。モジュール群は同一アドレス空間で動作するので、バグによってシステム全体をダウンさせることがある。
カーネルは肥大化しやすく、肥大化すると保守が困難になる。
コードの結合度が強く、モジュール化して分離したとしても、その分離を正しく行うのは困難である。
移植性が低い。動作させるアーキテクチャごとに書き直しが必須となる。
RAMにないデータがあるプログラムで必要になった場合、CPUはカーネルにそれを知らせ(ページフォールト)、(必要なら)カーネルが使われていないメモリブロックの内容をディスクに退避させ、必要なデータをそのメモリブロックに復帰させる(ページ置換アルゴリズム)。すると、プログラムは要求を行った時点から処理を再開させることができる。これをデマンドページングと呼ぶ。
仮想アドレッシング方式では、仮想空間をカーネル用の部分(カーネル空間)とアプリケーション用の部分(ユーザー空間)に分けることができる。アプリケーションはカーネル用メモリにアクセスできないので、アプリケーションにバグがあったとしてもカーネルにダメージを与えることはない。この根本的な分離は多くの汎用カーネルで実際に使われているが、別の方式を採用したカーネルの研究も行われている(たとえば、Singularity)。
メモリ管理のもうひとつの機能として、カーネル内の各モジュールやデバイスドライバが使用するメモリの割り当てがある(動的メモリアロケーション)。
Microsoft Windowsは1985年、MS-DOSへのアドオンとしてリリースされた。他のOSに依存していたため、Windows 95までのリリースはOSではなくオペレーティング環境とみなされている。その製品ラインは発展して、Windows 9x系となり(32ビット化やプリエンプティブ・マルチタスクといった強化を経て)、最終的に2000年にWindows Meがリリースされた。マイクロソフトはまた、ハイエンド向けにWindows NT のラインも1993年の Windows NT 3.1からスタートさせ、こちらは2000年以降も続いている。
2001年10月にリリースされたWindows XPでWindows 9x系を置換して一般ユーザー向けOSが一新された。Windows NT系のカーネルはWindow ManagerやIPC Managerとクライアント・サーバ型階層型サブシステムモデルを採用しており、ハイブリッドカーネルとみなされている。