Terminate and Stay Resident (TSR) はMS-DOS(など[1])のオペレーティングシステムにあるシステムコールの1つで、プロセスを終了させてシステムに制御を戻すが、そのメモリは残しておくという機能を提供する。しばしば、割込み(キー押下など)を契機として制御を戻すことで、擬似的なマルチタスクを実現するなどに使われた。このシステムコールを利用するプログラムも一般にTSRと呼ばれる。TSRプログラムには、OSがサポートしていないハードウェア用のデバイスドライバとして機能するものや、スケジューリングやアドレス帳などのよく使う小さなユーティリティプログラムなどがある。
背景
通常、MS-DOS[2]では一度に1つのプログラムしか実行できない。実行中のプロセスが終了する場合、制御を親プロセスに戻すため、INT 21H/4CH というシステムコールを使う。そのプログラムが使っていたメモリは解放されるため、最初からロードする以外に再び呼び出すことはできなくなる。しかし、プログラム終了時にシステムコール INT 27H か INT 21H/31H を使うと、MS-DOSはそのプログラムのメモリを解放しないままプロセスを終了する。
TSRの使い方
システムコール INT 27H は 'Terminate But Stay Resident' と呼ばれるため、それを使うプログラムを 'TSR' と称した。これを使うと、プログラムは最大64KBのメモリだけをそのままの状態で残すことができる。MS-DOS 2.0 ではそれを改良したシステムコール INT 21H/31H ('Keep Process') が追加された。これは残すメモリ量の制限を外し、プロセスの終了コードを指定できるようにしたものである。
また、前述のようにアンロードさせるオプションが提供されないことも多かったことには理由があった。MS-DOSでは「アリーナ」と呼ばれる数珠繋がりのデータ構造でメモリを管理しているので、「以前に実行され常駐した自分自身が、メモリのどこかにいないだろうか?」という処理のためには、その「数珠繋がりの先頭」をMS-DOSに教えてもらう必要があるのだが、そのためのシステムコールは、非公式に Get List-of-Lists などと呼ばれていたundocumentedなAPIで、正式には保証されておらず、そういった点でも不安があった[4]。
DOSエクステンダを使ったゲームが開発されるようになり(初期の例としてDOOMがある)、TSRに関連したメモリ容量問題の多くは解消された。そして Windows により、TSRの多くは不要となり、一部のTSRは非互換によって使えなくなった。ただし、NT系 Windows 以前のWin16アプリケーションではTSR風の技法が可能で、IDTにパッチを当てるものもあった(リアルモードのWindowsでは可能だったため)。その後は Windows も Windows NT となり、またその他のマルチタスク型のOS(Windows NT、macOS、PC-UNIXなど)がPC向けにも普及し、複数のプログラムやデバイスドライバが同時並行して動作できるようになり、その際にTSRのような特殊な技法は不要となった。割り込みは、カーネルが独占的に管理するようになった。
Macintosh
実装は全く異なるが、似たような目的のものとして Macintosh のデスクアクセサリ (DA) がある。初期のMacintoshのOSはMS-DOSのようにシングルタスクで、その制限に対処するべくDAが生まれた。DAは任意の時点で動作中のアプリケーションの中で動作できる小さなプログラムで、「計算機」などが代表であろう。さまざまなサードパーティがアプリケーションをDAとして実装した。例えば、ワードプロセッサから抜け出さずに挿絵を描くためのお絵かきソフトなどがあり、擬似的なマルチタスクを実現していた。