RSTS/E

**RSTS** (Resource Sharing Time Sharing System) は、ディジタル・イクイップメント・コーポレーション (DEC)が16ビットミニコンピュータシリーズPDP-11用に開発したマルチユーザー・タイムシェアリング・オペレーティングシステム。最初のバージョン **RSTS-11** version 1 は1970年、PDP-8用タイムシェアリングOS TSS-8 のチームが開発した。RSTSの最終バージョン **RSTS/E** 10.1 は1992年9月にリリースされた。RSTS-11 と RSTS/E は通常単に "RSTS" と呼ばれ、本項目でもそのように記述する。

## 開発
### 1970年代
RSTSのカーネルはアセンブリ言語 MACRO-11 で書かれ、DOS-11というOS上で動作する CILUS (Core Image Library Update and Save) プログラムを使ってディスクにインストールされる。RSTSをブートすると、BASIC言語の拡張版である BASIC-PLUS の処理系が立ち上がる。リソースアカウンティング、ログイン、ログアウト、システム管理などのOS内のシステムソフトウェアは **CUSPS** (Commonly Used System Programs) と呼ばれ、全てBASIC-PLUSで書かれていた。1970年から1973年まで、RSTSは56キロバイトの磁気コアメモリのみで動作可能だった（メモリ空間は64キロバイトで、メモリマップドI/Oの空間も含む）。この構成で最大16の端末を接続でき、最大17個のジョブを同時実行できる。プログラムの最大サイズは16キロバイトである。1973年末時点で、RSTSがライセンスされたシステムは150ほどあった。

1973年、新機種 PDP-11/40 および /45 のためにメモリ管理がサポートされた RSTS/E がリリースされた（PDP-11/20 は RSTS-11 でのみサポート）。メモリ管理サポートによって扱えるメモリ容量が4倍になっただけでなく（18ビット・アドレッシングで、256キロバイトをサポート）、ユーザーモードのプロセスとカーネルの分離が可能となった。

1975年、22ビット・アドレッシングの PDP-11/70 のためにメモリ管理サポートが改良された。これにより、最大2メガバイトのメモリを扱え、最大63個のジョブを同時実行可能となった。**RTS** (Run Time System) と **CCL** (Concise Command Language) のコンセプトが導入されたが、それらは "SYSGEN" の際にコンパイルする必要があった。マルチ端末サービスも導入され、1つのジョブが複数の端末を制御できるようになった（トータルで128端末）。メッセージ送受信のプロセス間通信がさらに洗練され効率化されている。同年8月にはライセンスされたシステム数が1,200となった。

1977年、RSTSのインストールにDOS-11を使わなくて済むようになった。RSTSカーネルはRT-11の **RTS** にてコンパイルでき、RT-11の **SILUS** (Creates Save-Image Libraries) を使って **SIL**  (Saved Image Library) ファイルとしてフォーマットされ、ターゲットシステムがタイムシェアリングで動作中にシステムディスクあるいは他のディスクにコピーできる。BASIC-PLUSの**RTS**（さらにはRT-11、RSX-11、TECOやサードパーティの**RTS**）は、RSTSカーネルから独立したユーザーモードのプロセスとして動作する。システムアドミニストレータはブートの際にどの**RTS**をデフォルトの**[[コマンドラインインタプリタ|KBM]]** (Keyboard Monitor) とするかを選択可能になった。このころには3,100システムがライセンスを受けている。

1978年、22ビット・アドレッシングが可能な全機種をサポートする最後のメモリ管理の更新が行われた。PDP-11がハード的に搭載可能な最大メモリ容量（4メガバイト）をサポート可能となった。SUPERVISORYモードが追加され、DECのOSでは初めてそのモードをサポートした。DECnetもサポートされ、コロラドスプリングスにあるDECの**RDC** (Remote Diagnostics Center) から遠隔診断が行えるようになった（有償サービス）。1970年代末にはライセンスを受けたシステムは5,000を越えている。

### 1980年代
1981年、Unibusマシン（PDP-11/44, /45, /55, /70）向けにユーザー空間の命令とデータの分離をサポートし、一種のメモリ保護を可能とした。これを使い、命令に64キロバイト、データに64キロバイト（さらにはバッファ用に64キロバイト）の別々の空間を使うプログラムが作成可能となった。**** (Digital Command Language) **RTS** も含まれており、DECnet III の新バージョンもサポートされている。

1983年の RSTS/E V8.0-06 ではDECが販売した最小構成の18ビットPDP-11 (MicroPDP-11) をサポートしている。MicroPDP-11でのインストールを容易にするため、事前に生成済みの**SIL**と**CUSPS**が含まれている。MicroPDP-11用の事前生成済みのバージョンを MicroRSTS として低価格で販売したが、カーネルの再作成が必要ならフルバージョンを購入しなければならなかった。ファイルシステムが更新されており、識別のため RSTS Directory Structure 1 (RDS1) と呼ばれた。それに応じて従来のRSTSのファイルシステムは RDS0 と呼ばれるようになった。新しいファイルシステムは1700以上のユーザーアカウントをサポートできるよう設計されている。このころライセンスを受けたユーザーは1万以上で、ほぼ同数のユーザーがライセンスを受けずに（不正コピーして）使っていたと見られている。

1985年から1989年にかけて、version 9 でRSTSは円熟期を迎えた。**DCL**が主要**RTS**とされ、新たなユーザーアカウント機能をサポートすべくファイルシステムも RDS1.2 に更新された。従来のパスワードは RADIX-50 フォーマットで6文字までという制限があったが、暗号化（ハッシュ）されるようになった。従来、プロジェクト（グループ）番号ゼロのシステムアカウント（識別番号 [0,1]）があり、プロジェクト番号1の全アカウントに特権が付与されていた（UNIXのrootアカウントとは異なる）。version 9 以降はプロジェクト番号ゼロにアカウントを追加できるようになり、複数の特権を個別に任意のアカウントに付与できるようになった。**LAT** (Local Area Transport) プロトコルがサポートされ、DECnet IV の最新版も動作可能となった。それらのネットワーク強化により、任意のユーザーが端末から端末サーバ DECserver 経由でRSTSマシンに接続できるようになり、VMSの動作するVAXと同等のアクセスが可能になった。**DCL**のコマンド構造がDECファミリ内で共通していたため、ルック・アンド・フィールも似通っていた。

これはよくある擬似コマンドファイルプロセッサではなく、VMSの機能に基づいている。DCLとモニターに大幅な改造を施すことで、DCLコマンドファイルプロセッサをRSTSに統合し完全サポートしている。DCLはジョブの一部としてコマンドファイルを実行し、（ATPKと同様）擬似キーボードや実キーボードへの強制が不要である。

### 1990年代
1994年、DECはPDP-11のソフトウェア事業を Mentec という企業に売却し、DEC自体はVAXに集中するためRSTSのリリースをやめた。

Mentecは後にPDP-11用OSを非営利の趣味的利用に限って無料ライセンスで提供した。また、IBM PC 向けにPDP-11エミュレータがリリースされ、インターネット上でRSTSのイメージコピーが容易に入手可能となったため、パーソナルコンピュータ上のエミュレータでRSTS/Eを実機よりも高速に動作させることが可能となった。

## 機能と特徴
最後のリリースとなった RSTS/E version 10.1 の機能と特徴はDECの Software Product Description によれば次の通りである。

* 対話型タイムシェアリング
* システムリソースの動的割り当て
* DCL (Digital Command Language)
* DCL コマンドファイル処理
* コマンド行編集と入力済みコマンドの再呼び出し
* CCL システムマネージャにより定義されたコマンドインタフェース
* デバイスやアカウントのユーザー論理名とシステム論理名
* システムセキュリティ機能
* 必要に応じてアカウント毎に特権とリソース割り当てを設定
* バッチサービス - DCLコマンドファイルの集中化バックグラウンド実行を提供
* プリントサービス - 端末プリンター、ラインプリンター、端末サーバのプリンターなどで集中化バックグラウンド印刷を提供
* オペレータ/メッセージ・サービス - ユーザーやプログラムから要求やオペレータメッセージのディスパッチとロギング
* 各種ファイル処理 - ファイル共有、保護機構、仮想（メモリ）ディスクサポート
* DCLを使用した統合システム・アカウント管理
* 磁気テープ処理
* 対話型環境向けに設計された端末ハンドラ
* 共通コードの共有
* 頻繁にアクセスするディスク上のデータをソフトウェアでキャッシュ化
* タスク間通信
* ディスク全体やファイルを磁気テープにバックアップ/リストアするユーティリティ
* SCSIアダプターとSCSIデバイスの一部機種でのサポート
* 異なる大きさや種類のディスク間でのボリュームコピー
* 信頼性と保守性のための機能
* DCL、RT-11、RSX、BASIC-PLUSのRTSをサポート
* プログラム開発ツール群

## 運用
### 通信
RSTSではオペレータとのやりとりにシリアル通信接続を使用する。この接続は、ローカルな端末なら20mAも使えるし、RS-232インタフェース（ローカルなシリアルポート接続かリモートのモデム接続）も使える。また、DECnetまたはLAT (Local Area Transport) を使ったイーサネット接続も可能である。最大128の端末を接続可能で、同時に最大63のジョブが動作可能である（CPU性能、メモリ容量、負荷状況によってはその前に限界となる場合もある）。バッチモードでジョブを実行させることもできる。仮想端末上で一連のコマンド列を実行する "ATPK" というバッチプログラムがあり、MS-DOSのバッチファイルに近い。

### ログイン [Project,Programmer]
ユーザーがシステムと接続するには、LOGIN（またはHELLO）コマンドを使用する。実際にはログインしていない端末に任意のコマンドを入力すると、自動的にLOGINプログラムを起動してから入力されたコマンドを解釈するようになっている。ログアウト状態で入力されたコマンドについてログアウト状態で実行が許可されていない場合、"Please say HELLO" といったメッセージが表示される。version 9 より以前、1行でログインすることもできたが、そうするとパスワードが画面上にそのまま表示されるので、後ろから覗き見される危険性があった。

 Bye
 
 HELLO 1,2;SECRET
 
 Ready

または

 I 1,2;SECRET
 
 Ready

または

 LOGIN 1,2;SECRET
 
 Ready

端末の状態は、コマンドに対する反応（表示）で識別できる。例えば BASIC-PLUS RTS にログインしている場合、KBM は "Ready" というプロンプトを表示し、ログアウトしているユーザーには "Bye" というプロンプトを返す。

ログインに際しては **PPN** (Project Programmer Number) とパスワードを入力する。ユーザーの番号は、プロジェクト番号（UNIXのグループ識別子に相当）、カンマ、プログラマ番号という形式である。どちらの番号も0から254までで、特別な例外もある。アカウントを識別するのにこれらの番号を使う場合、角括弧で囲む。例えば、[10,5]（プロジェクト番号10、プログラマ番号5）、[254,31]、[2,146]、[200,220] といった形式である。ユーザーがシステムプログラムを起動してログアウトした場合（管理者がそれを許している場合）、PPN は [0,0] となり、SYSTATコマンドでは **,** と表示される。これは正しいアカウント番号ではないことを示している。

### システムアカウントとユーザアカウント
各プロジェクトのプログラマ番号0は、グループアカウントとして予約しておくのが一般的で、特殊記号 "#" で参照できる。あるユーザーの番号が [20,103] だとすると、"#" が前置された名前のファイルはユーザー番号 [20,0] のアカウントで格納されたファイルだとわかる。

特別なプロジェクト番号が2つある。プロジェクト番号0はシステムソフトウェア用に予約されているのが一般的で、version 9 より以前には1つしかアカウントがなかった（つまり、[0,1] しかなかった）。プロジェクト番号1を与えられたプログラマには特権が付与されており、Unix系のrootに似ているが、[1,0] から [1,254] までの全アカウントに特権がある点が異なる。version 9 以降、システム管理者が任意のアカウントに特権を付与できるようになった。

アカウント [0,1] はOSのシステムファイルなどに使われている。次の例の右端の太字はコメントである。

 DIR [0,1]
  Name .Ext    Size   Prot    Date       SY:[0,1]
 BADB  .SYS       0P   06-Jun-98         **List of bad blocks**
 SATT  .SYS       3CP  06-Jun-98         **Bitmap of allocated disk storage**   
 INIT  .SYS     419P   06-Jun-98         **Operating system loader program**
 ERR   .ERR      16CP  06-Jun-98         **System error messages**
 RSTS  .SIL     307CP  06-Jun-98         **Operating system itself**
 BASIC .RTS      73CP  06-Jun-98         **BASIC-PLUS run time system**
 RT11  .RTS      20C   06-Jun-98         **RT-11 run time system**
 SWAP  .SYS    1024CP  06-Jun-98         **System swap file**   
 CRASH .SYS      35CP  06-Jun-98         **System crash dump**
 RSX   .RTS      16C   23-Sep-79         **RSX-11 run-time system**
 TECO  .RTS      39C   24-Sep-79         **TECO text editor**
 
 Total of 1952 blocks in 11 files in SY:[0,1]
 
 (**注: この表示は Version 9 より以前のものである**)

**DIR** コマンドはCCLとしてインストールされており、DIRECT というプログラムの実行に等しい。[0,1] はOS用アカウント番号（と同時にディレクトリ名）である。ファイル名の次に表示されているのは512バイト単位のブロック数で表したサイズである。"C" はそのファイルが連続ブロックを割り当てられていることを示す。"P" は特権ユーザーでも削除できない保護されたファイルであることを示す。次の（"" のように）括弧に囲まれた数値は、十進数でファイルプロテクションを示している。他のプログラマ番号や他のプロジェクト番号のユーザーから見えるか、更新可能か、実行可能かなどを示すもので、UNIXのファイルパーミッションに相当する。

ライブラリファイル群はアカウント [1,1] が付与されており、通常は論理名 "LB:" で参照される。アカウント [1,2] はシステム起動アカウントで、システムのCUSPSが含まれており、"CUSP$" が名前に前置される。同様に、[1,3] では "!"、[1.4] では "%"、[1,5] では "&amp;" が前置される。アカウント [1,1] はユーザーがログインに使うことが許されており、POKEシステムコールでメモリ上の任意の位置の値を変更することができる。したがって、この [1,1] がUnix系のスーパーユーザーに最も近い。

## 実行時環境 (RTS)
RSTSの特徴のひとつとして、プログラムの実行手段と実行時に使われる環境がある。BASIC-PLUS やその拡張である BASIC-PLUS 2、またもっと古くからの言語であるCOBOLやFORTRANといったプログラミング言語も利用可能である。これらの環境は互いに分離されていて、システムは実行するプログラムごとに環境を切り換えている。この環境を**RTS** (Run-Time System) と呼ぶ。RTSの多くはコマンドラインインタフェースを備えており、それを **KBM** (Keyboard Monitor) と呼ぶ。version 9 以前ではシステム起動時のRTSを事前に設定しておく必要があり、そのRTSはコンパイル済みプログラムを実行できる必要があった。

システム管理者は特別な**CCL**コマンド群をインストールすることもでき、（DCLを除く）KBMコマンド群に優先させることができる。CCLはWindowsでのショートカットやUnix系のシンボリックリンクに似ている。CCLは立ち上げ時にメモリ常駐コマンドとしてインストールするか、システム管理者がシステム動作中に動的にインストールする（つまり、ディスク上のファイルのように永続的なものではない）。

ユーザーはログイン後に環境を切り換えることができる。

### BASIC-PLUS
BASIC-PLUSで書かれたプログラムは BASIC RTS で実行できる。BASIC RTS では64KBのメモリのうち32KBをBASICプログラム群に提供できる。言語処理系はプログラムのキーワードを1バイトのコードに変換して格納し、変数やデータはインデックス付けされてメモリ上別々に格納される。この内部のバイトコード形式をPCODEと呼ぶ。SAVEコマンドでBASICプログラムをセーブする場合、".BAC" という拡張子付きでメモリ上のイメージがそのままディスクに保存される。このフォーマットは公開されていなかったが、イギリスの大学生が ".BAC" ファイルから元のソースを生成する逆コンパイラを開発した（後にその2人の学生はDECに就職した）。64KBのメモリの残り32KBは BASIC RTS 自身が使用する。以下にBASIC-PLUSのコマンド行の例を示す。"Ready" はプロンプトである。

```
new
 New file name--HWORLD
 
 Ready
 
 10 Print "Hello World"
 20 Input "Press Control-T for 1 line status: ";a$
 30 End
 run
 HWORLD  10:17 PM        01-Jan-08
 Hello World
 Press Control-T for 1 line status: ?
 1       KB0     HWORLD+BASIC    KB(0R)  2(16)K+14K      0.2(+0.0) +0
 
 
 Ready
 
 save
 
 Ready
 
 compile
 
 Ready
 
 DIR HWORLD.*/na/ex/si/pr
 SY:[1,2]
 HWORLD.BAS       1   < 60>
 HWORLD.BAC       7C  <124>
 
 Total of 8 blocks in 2 files in SY:[1,2]
 
 
 Ready
```


### DCL (Digital Command Language)
varsion 9 以降、**DCL** が立ち上げ時の主たるRTSとされたが、機械語の実行ファイルを実行する機能はない。これは後述する RSX RTS がカーネル内に吸収されたために可能となった。DCLは当時のDECのあらゆるOS（RSX-11、RT-11、VMS、OpenVMS）で導入され、互換性を提供していた。DCLの通常のプロンプトは "$"（ドル記号）である。

 $ write 0 "Hello World, it is "+F$TIME()
 Hello World, it is 01-Jan-08 10:20 PM
 $ inquire p1 "Press Control-T for 1 line status:"
 Press Control-T for 1 line status:
 1       KB0      DCL+DCL       KB(0R)       4(8)K+24K       0.1(+0.1) -8
 $ set verify/debug/watch
 $ show memory
 (show memory)
 (SYSTAT/C)
 
 Memory allocation table:
  Start   End  Length  Permanent   Temporary
    0K -   85K (  86K) MONITOR    
   86K - 1737K (1652K)   (User)   
 1738K - 1747K (  10K)   (User)    DAPRES LIB
 1748K - 1751K (   4K)   (User)    RMSRES LIB
 1752K - 2043K ( 292K) ** XBUF ** 
 2044K -  *** END ***
 $

### RSX (Realtime System eXecutive)
COBOL、マクロアセンブラ、BASIC-PLUS 2 で書かれたプログラムはコンパイラにより機械語の実行ファイルとなり、RSX RTS で実行される。RTS自体は8KBを使用し、56KBがユーザープログラムで使用可能だった。RSTS version 7 で RSX RTS がカーネルに吸収され、ユーザー空間から消えたため、ユーザープログラムが64KB全部を使えるようになった。

このサイズの制限に対処するには、ライブラリや複雑なオーバーレイ機構を使用する、共有メモリを使ってプログラム間で協調動作するなどの方法がある。RSXをデフォルトのKBMとした場合、RSXの標準プロンプトは ">" となる。

 >run
 Please type HELLO
 >HELLO 1,2;SECRET
 >run
 ?What?
 >help
 Valid keyboard commands are:
 
 ASSIGN    DISMOUNT  HELP      RUN     UNSAVE
 BYE       EXIT      MOUNT     SHUTUP
 DEASSIGN  HELLO     REASSIGN  SWITCH
 
 >run CSPCOM
 CSP>HWORLD=HWORLD
 CSP>^Z
 >RUN TKB
 TKB>HWORLD=HWORLD,LB:CSPCOM.OLB/LB
 TKB>//
 >run HWORLD.TSK
 Hello World
 Press Control-T for 1 line status: ?
 1       KB0     HWORLD+...RSX   KB(0R)  7(32)K+0K       0.8(+0.2) +0
 
 >DIR HWORLD.*/na/ex/si/pr
 SY:[1,2]
 HWORLD.BAS       1   
 HWORLD.BAC       7C  
 HWORLD.OBJ       2   
 HWORLD.TSK      25C  
 
 Total of 35 blocks in 4 files in SY:[1,2]
 
 >

### RT-11
RT-11 RTS は、RT-11のシングルジョブ版をエミュレートしたものである。RSXと同様RTS自身は8KBを使用し、**CUSPS** (Commonly Used System Programs) のために56KBを提供する。CUSPSは FORTRAN-IV やマクロアセンブラで書かれる。RT-11をデフォルトのKBMとした場合、通常のプロンプトは "." となる。

 .VERSION
 Please type HELLO
 
 .HELLO 1,2;SECRET
 
 .VERSION
 RT-11SJ V3-03; RSTS/E V8.0
 
 .R PIP
 *HWORLD.MAC=KB:
         .MCALL .TTYIN,.PRINT,.EXIT
 HWORLD: .ASCII /Hello World/
         .ASCIZ /Press Control-T for 1 line status:/
         .EVEN
 
 Start:  .PRINT #HWORLD
         .TTYIN
         .EXIT
         .END    START
 ^Z
 *^Z
 
 .R MACRO
 HWORLD=HWORLD
 *^Z
 
 .R LINK
 *HWORLD=HWORLD
 *^Z
 
 .R HWORLD.SAV
 Hello World
 Press Control-T for 1 line status:
 1       KB0     HWORLD+RT11     KB(0R)  2(28)K+4K       0.6(+0.2) +0
 
 
 ..DIR HWORLD.*/na/ex/si/pr
 SY:[1,2]
 HWORLD.BAS       1   
 HWORLD.BAC       7C  
 HWORLD.TSK      25C  
 HWORLD.MAC       1   
 HWORLD.OBJ       1   
 HWORLD.SAV       2C  
 
 Total of 37 blocks in 6 files in SY:[1,2]
 
 
 .

### TECO (Text Editor and COrrector)
テキストエディタ TECO はRTSとして実装されていた。これは編集バッファを可能な限り大きくするためで、RSTS V5B で実装された。これは、RSX や RT-11 といった汎用RTSよりも早い。TECOにはKBMが組み込まれていない。ユーザーはTECOを通常プログラムのように起動する。TECOからUNIXのテキストエディタ ed が生まれた。RSTSシステムでは、CCLとしてファイル生成、ファイル編集、TECOプログラム実行といったコマンドを用意していることが多かった。次の例はTECOを使って円周率を20桁まで計算するプログラムである。

 Ready
 
 run TECO
 *GZ0J\UNQN"E 20UN '
 BUH BUV HK
 QN
 QQ/10UT QH+QT+48UW QW-58"E 48UW %V ' QV"N QV^T '
 QWUV QQ-(QT*10)UH >
 QV^T @^A/
 /HKEX$$
 31415926535897932384
 
 Ready

## エミュレーション
; ROSS/V (RSTS/E Operating System Simulator for VAX)
: 1981年、Evans Griffiths & Hart が発売。RSTSの全ユーザモードプロセス（CUPS、RTS、ユーザプログラム）をVAX上のVMSで修正せずに実行できる。PDP-11上では RSTS.SIL が扱うカーネル部分をエミュレータで対応している。
; Ersatz-11
: D-Bit の製品。WindowsやLinux上でPDP-11の命令セットをエミュレートする。RSTSを含めたPDP-11用OSをその上で実行可能。
; SimH
: 様々なプラットフォーム（Linuxなど）で動作するエミュレータで、PDP-1、PDP-8、PDP-10、PDP-11、VAX、AltairZ80、IBMメインフレームの一部、他のミニコンピュータなどのエミュレーションが可能。

## バージョン履歴
### RSTS-11
TSS-8に引き続き、IOX (Input Output eXecutive) コードを使ってPDP-11用の初のタイムシェアリングOSが開発され、BTSS (Basic Time Sharing System) と名付けられた。しかしBTSSという名称はハネウェルが既に使用していたため、RTSS (Resource Time Sharing System) に改称。それが単なるタイプミスから RSTS (Resource Sharing Time Sharing System) と呼ばれることになった。

### RSTS/E
新たなメモリ管理サポートを追加し、新機種のメモリ容量増に対応。名称を RSTS-11 から RSTS/E に変更した。

なお、ソビエト連邦ではRSTSのクローンとして DOS-KP ("ДОС-КП") というOSが存在した。

## 関連項目
* DECnet
* ケビン・ミトニック - ハッカー。DECでRSTS/E開発に使われていたシステムに侵入したことがある。
* タイムシェアリングシステム

## 脚注

## 外部リンク
* Elvira at The Royal Institute of Technology in Stockholm Sweden.
* RSTS Hobbyist Site
* SimH web page
* Wofford Witch