マイクロカーネル
初期のOSのカーネルは、コンピュータのメモリ容量が小さかったこともあって、比較的小さかった。コンピュータの能力が成長するに従い、カーネルが制御しなければならないデバイスの数も増えていった。それでも例えば当初のUNIXのカーネルは、デバイスドライバやファイルシステムを含んでいても一般に小さかった。アドレス空間が16ビットから32ビットに拡大すると、カーネル設計がハードウェアアーキテクチャに束縛されることがなくなり、カーネルの成長が始まった。
UNIXカーネルの肥大化の端緒となったのが Berkeley Software Distribution (BSD) である。それまでのOSの役割に加え、BSDでは複数のファイルシステムを追加し、完全なTCP/IPプロトコルスタックを備え、ネットワーク上で既存のプログラムを動作可能にする各種仮想デバイスが追加されている。UNIXはファイルという概念でリソースを統一し、ファイルを扱う小さなプロセスをパイプでつないで相互通信させることにより、コンパクトかつ高機能なOS設計に成功した。しかしその後の利用環境の変化に伴い、必ずしもファイルとして扱えないリソースが増加している。例えばネットワーク通信はソケットという概念で行われるが、ソケットはファイルではない。結果的に、後付けで似て非なるコードがOSを肥大化させるという事態が発生したといえる。このような成長が何年も続き、カーネルのソースコードは数百万行にまで肥大化した。
非同期IPCは補助スレッドを使って同期IPCプリミティブ上で実装できる。しかし、L4を採用した商用製品では非同期通信サポートのために非同期通知機構が必要であることが判明し、それを追加している。このシグナルのような機構はデータを転送するものではなく、カーネルによるバッファリングが不要である。
同期IPCでは通信の一方が応答可能になるまでもう一方がブロックされる。したがって無制限にIPCを使用すると容易にデッドロック状態が発生する。また、クライアントが要求を送って応答を待ち合わせないようにすると、容易にDoS攻撃のような状態になる。したがって同期IPCでは長期に渡るブロックを防ぐ手段を提供しなければならない。多くのマイクロカーネルはIPC呼び出しにタイムアウトを提供しており、ブロック時間を制限している。実際にはタイムアウト時間の設定は難しく、結果としてクライアントのタイムアウトは無制限、サーバのタイムアウトはゼロとすることが多い。結果としてタイムアウト時間を任意に設定できるようにせず、相手が応答可能でない場合にIPCを即座に失敗させるかどうかを示すフラグだけを用意する傾向になってきた。それによってタイムアウト時間としてゼロか無制限かを選択することになる。L4やMINIXの最近のバージョンもそのようになっている(QNXや以前のL4ではタイムアウト時間を任意に設定できる)。