THE SOLO OPERATING SYSTEM: A CONCURRENT PASCAL PROGRAM 译文

这是使用Concurrent Pascal语言写的单用户操作系统solo系统的一个描述。它支持顺序和并发(Sequential and Concurrent)的Pascal语言为PDP 11/45计算机开发。输入/输出被并发的进程处理,Psscal程序可以相互之间递归的调用,并且通过他们传递任意的参数。这让使用Pascal作为一个作业控制的语言变成可能。Solo是第一个分层的并发程序的主要实现,对抽象数据类型(类,监视器和进程)编译时控制的最访问权限。他以用户的观点描述,就像介绍另一篇论文一样介绍自己的内部的结构。

INTRODUCTION:

这是第一个用Concurrent Pascal编程语言写的操作系统Solo操作系统的描述。这是一个简单但是很有用的单用户操作系统,用于PDP 11/45计算机开发和发布Pascal程序,在1975年5月开始使用。
以用户的观点,系统并没有什么不同的地方。都支持编辑,编译,存储,顺序和并发的Pascal程序。这些程序可以使用不同级别访问任何一个控制台,卡带,打印机,磁带,或者磁盘(逐字符,逐页,逐文件,或者通过直接存取设备)。输入,处理,文件的输出被并发的进程控制。Pascal程序可以递归的调用另一个并且通过这个传递参数。这让使用Pascal作为一个作业控制的语言变成可能(Brinch Hansen 1976a)
对系统程序员来说,Solo系统与其他操作系统有非常大的不同:
1、 少于4%的部分是使用机器语言写的,剩余的部分使用顺序和并发的Pascal语言
2、 与面向机器的语言不同,Pascal不包含低级程序设计的特性,像是寄存器,地址和中端。这些都是通过被编译的程序运行时,虚拟机来处理。
3、 系统保护大部分是通过编译时期检查访问权限来实现。运行时的检查只占很少一部分,并且这不被硬件机制支持
4、 Solo系统是通过抽象数据结(类,监视器,进程)构来实现的分层程序设计的第一个主要例子。
5、 完整的系统包含大于10万多字的机器码(包括两个编译器),整个系统由我和一个学生在不到一年的时间开发。
去欣赏Concurrent Pascal的用处,需要充分理解至少一个由这种语言实现的操作系统。本描述的目的就是在学习solo 操作系统内部结构之前,以一个用户的观点来看一下Solo操作系统。(Brinch Hansen 1976b)。他介绍了用户在这个系统上怎么操作,他内部的数据流是什么,程序如何彼此调用和传递信息,文件是如何存放到磁盘上的,以及在典型任务上面系统执行的如何优秀。
作业控制:
用户通过显示器控制程序的执行(或者通过电传打字机)。用户通过写出一个程序的名字和参数来调用程序,例如:

move(5)
read(maketemp, seqcode, true)

第一行命令地位一个磁带到文件号为5的地方,第二行输入到磁盘文件并且并将其保存为名为maketemp的顺序代码。布尔类型的true保护了文件在以后不会意外的删除。
当用户需要帮助的时候,程序试图变得有帮助。如果用户忘记了那个程序是有用的,他可以输入命令

help

或者其他的命令。系统会回应:

not executable, try
list(catalog, seqcode, console)

(不是可执行文件,尝试列出 目录,序列码,控制台)
建议的命令在控制台列出了所有连续的程序的名字。
如果用户确定知道磁盘包含了一个程序,但是不确定参数传递,他可以简单的使用程序名调用程序,而不使用参数例如:

read

这个程序就会给出必要的信息:

try again
read(file: identifier; kind: filekind; protect: boolean)
using
filekind = (scratch, ascii, seqcode, concode)

通过读取一个程序的手册可以获得更多的信息:

copy(readman, console)

一个用户会话可以由一个新的Pascal程序从卡带到磁盘的输入开始

copy(cards, sorttext)

接下来是编译:

pascal(sorttext, printer, sort)

如果编译器报告错误就会列出:

pascal:
compilation errors

下一步要做的通常是编辑程序文本:

edit(sorttext)
. . .

并且再次编译,当编译成功时,用户程序可以被直接调用

sort(. . .)

系统也会从其他媒介读取作业控制命令,例如:

do(tape)

任务是通过在控制台按响铃按钮来抢占。这会导致系统的重装和初始化。这个命令开始可以通过任何其他储存在磁盘上的并发程序替换Solo系统

数据流:

图一显示了当用户通过复制,编辑,编译,顺序处理一个单文本文件时,系统内部的数据流
输入、 处理和输出文本同时发生。处理是通过这样的过程完成的:作业进程通过发送一个参数开始输入,参数通过缓冲器来传递。参数就是输入设备或者是磁盘文件的名字。
输入进程通过缓冲区把输入送往作业进程。在文件的末尾,输入进程通过作业进程的另一个缓冲区传递参数,用来指定在输入的过程中是否发生了传输的错误。
输出通过类似的输出进程和另一个缓冲区集合来处理。
在单用户操作系统中,期望能够以尽可能高的速度处理一个文件。所以,数据被缓冲在内存映像(core)而不是磁盘上,每个缓冲区的容量是512个字符。
这里写图片描述

控制流:

图二展示了当用户输入一个如下的命令时,会发生什么:

edit(cards, tape)

在系统加载后,机器会执行一个Concurrent Pascal的程序(Solo),他包含了3个进程。最初,输入和输出进程均加载,并且当作业进程调用另一个顺序程序do时,输入和输出进程会调用顺序程序io。do程序通过控制台读取用户的命令,并且调用包含两个参数的edit程序(cards和tape)
编辑器通过发送他的第一个参数给被输入进程执行的io程序来启动输入。这会引发io程序去调用另一个程序cards,cards程序开始读取卡带并且把他们送往作业进程。
编辑器通过发送他的第二个参数给被输出进程执行的io程序来启动输出。后者会调用程序tape,tape会从工作进程读取数据并且把他们放置在磁带中。
在文件的末尾,cards和tape程序返回io程序,然后等待从作业进程发出的下一步指令。编辑器返回do程序,然后读取控制台的下一个命令。
这是值得观察的:操作系统自身没有为各种设备中输出/输出提供内置的驱动。数据简单的通过储存在磁盘中的顺序的Pascal程序来生产和消耗。
操作系统仅仅包含了调用他们的机制。这给用户提供了完全的自由来增补系统与新的设备并且可以模拟复杂的输入/输出像是合并,分割,格式化文件而不改变作业程序。
这里写图片描述
最重要的是顺序Pascal程序可以通过任意参数递归的调用另一个程序的能力。在图二中,例如,do程序使用两个标识符作为参数调用edit程序。这就不需要一个单独的(笨拙的)作业控制语言。作业控制语言就是Pascal
这在图三更鲜显明的阐明了,这句命令

pascal(sorttext, printer, sort)

是怎样引起do程序来调用pascal程序的。后者依次调用了7个编译器,一次通过一个,并且(如果编译的程序正确)pascal最终调用文件系统来储存生成的代码。
程序不知道自己被另一个程序调用还是直接被控制台调用。在图三中pascal程序调用了文件系统,用户也可能直接调用文件系统,例如保护他的程序,防止被意外删除:

file(protect, sort, true)

这里写图片描述
Pascal的指针和堆的概念让程序拥有在他们之间传递任意复杂的数据结构的能力,像是编译期间的符号表(Jensen 1974)。在大多数情况下,使用标识符,整型和布尔型作为参数就可以满足需要。

STORE ALLOCATION(存储分配):

顺序和并发Pascal的运行时环境是一个4K字大小的核心。这是唯一一个使用机器语言写的程序。用户通过操作面板将内核(kernel)从磁盘加载到内存映像(core)。内核就会加载solo操作系统并且启动它。Solo操作系统包含固定数目的进程。他们占用由编译器决定的固定数量的核心存储器(core store)
所有其他的程序都使用顺序Pascal编写。每个进程都在固定的核心段(core segment)储存了当前执行进程的代码。当被另一个程序调用的程序结束运行之后,进程重新从磁盘加载前一个程序,并且返回到这个程序。进程使用的数据和被调用的程序都储存在一个固定长度的常驻内存的内核堆栈(core resident stack)

文件系统:

后备存储(backing store)是一个由可拆卸包(removable packs)的慢速磁盘。每个用户都有他自己的磁盘包(disk pack)包含系统和自己的私有文件。所以没有必要使用分层的文件系统。
磁盘包包含一个储存在上面的所有文件的目录。该目录把自己描述为一个文件。文件由他的名称,类型,保护和磁盘地址所描述。文件通过散列(hashing)来查找
所有系统程序在操作输入文件之前都会检查他们类型,并且把类型与输出文件相关联。例如,顺序Pascal编译器,从ascii文件中提取输入文件(而不是一个临时(scratch)的文件),然后把输出文件变成一个顺序码的文件(sequential code file)。可能的文件类型是scratch,ascii,seqcode和concode
由于每个用户都有自己的磁盘包,文件需要保护防止被意外覆盖或删除。所有的文件初始化是未受保护的。如果想要保护的话,用户必须从控制台调用文件系统像是第四节描述的那样。
为了避免文件的压缩(持续几分钟),文件页面被分散在磁盘上并且通过页面映射来间接寻址(图4)。文件通过在目录中查找并且把它的页面映射放到内核(core)中来打开。
这里写图片描述
Solo系统常驻内存的部分是那些最频繁使用的文件操作,lookup, open, close, get和put。一个非常驻内存,顺序程序,调用文件,处理更复杂并且很少使用的操作:create, replace, rename, protect, 和delete file

DISK ALLOCATION:(磁盘分配)

磁盘总是包含255页名为next一个临时文件。程序通过输出数据到这个文件来创建新文件。然后他调用文件系统关联这个数据一个新名字,类型和一个长度(≤ 255)。做完这些文件系统创建next的一个新的实例。
该方案有两个好处:

  1. 所有文件都通过类型化的数据(typed data)初始化
  2. 一个程序创建文件仅仅需要调用非常驻内存的文件系统一次(产生该文件之后)。没有next文件,文件系统就会需要调用两次:在output创建文件之前和在output定义文件长度之后。
    使用单文件next的缺点就是程序同一时间只能创建一个文件
    没使用的磁盘文件被储存在磁盘上的页面索引的幂集(powerset)所定义。
    在一个慢速磁盘上必须特别注意,让程序加载快速。如果程序页随机散布在磁盘上,这样花费16秒钟来加载编译器和他的输入/输出驱动。在Brinch Hansen(1976c)描述的算法将这一时间减少为5秒。当系统创建next文件时,他试图将文件放置在连续的页,尽可能在相邻的扇区里面(但这将会将页或多或少的分散)。然后重新排列页面映射内的页面索引,来最小化加载文件时所需要的磁盘的旋转和扇区的移动次数。由于这在一个程序被编译并且储存到磁盘之前已经完成,这被称作在编译器的磁盘调度。
    系统将两个不同的分配技术用于两个在编译期间使用到的临时文件。每次编译的传递都从前驱生成的文件中输入,并且将输出放入另一个文件传递给后继。maketemp程序创建这些文件和他们交错的页面索引(interleaves their page indices)(making every second page belong to one file and every second one to the other)这使得磁头通过传递(pass)慢慢扫过这两个文件而不是疯狂的在他们之间来回移动。
    OPERATOR COMMUNICATION:(操作员通信)
    用户通过控制台来和系统通信。由于任务(例如编辑)通常涉及通过并发执行的多个程序,这些程序必须在被要求输入或者输出前让用户识别出自己。
do:
edit(cards, tape)
edit:
• • •
do:
• • •

程序标识(program identity)仅仅在每次用户开始对话(talking to)不同程序的时候显示。一个程序在不中断的情况下多次与用户通讯(例如编辑器)只需认证(identifies)自己一次即可。
通常在同一时间只有一个程序试图与用户进行通信(被作业进程执行的当前的程序)。但是输入/输出错误可能引起另一个进程发出的消息。

tape:
inspect

由于进程很少争夺控制台,这足以将进程的独占访问权限给用户,来输入或输出一行。一次会话几行将很少被打断。
一个Pascal程序仅仅携带身份认证来调用操作系统一次。系统将在需要的时候自动的显示。

SIZE AND PERFORMANCE:(尺寸和性能)

Solo系统包含由Concurrent Pascal编写的操作系统和使用顺序Pascal编写的系统程序集。
这里写图片描述
(这两个Pascal编译器可被用在使用Concurrent Pascal编写的不同操作系统里,而不仅仅是solo)
使用不同编程语言写的代码量为:
这里写图片描述
这就清楚的表明了一个良好的顺序编程语言对于操作系统设计比并发语言更加重要。尽管并发程序可能很小,但他似乎仍然值得使用高级语言编写来确保编译器可以彻底检查数据类型和访问权限。否则,他太容易发生依赖时间的编程错误(time-dependent programming errors)这种错误很难定位。
内核使用机器语言编写,实现了Concurrent Pascal的进程和监视器的概念和响应中端。他独立于运行在上面的特定操作系统。Solo系统需要为程序和数据提供一个39K字的磁心存储(core store)。
这里写图片描述
这一数额的空间允许Pascal编译器来编译自己。
使用磁盘输入和磁带输出的文本处理速度为:
这里写图片描述
所有这些任务60—100%磁盘有限(All these tasks are 60–100 per cent disk limited)这些数字不区分花费在等在外围设备的时间和花费在执行操作系统或用户代码,因为这种区分与用户无关。他们展示了一个使用高级语言写的操作系统的总体执行效率,这个系统使用直接的代码生成并且不经过任何优化。

FINAL REMARKS:(结语)

我和AI Hartmann使用了半年的时间把顺序和并发的Pascal编译器设计并且实现。我使用3个月编写的操作系统和实用程序。使用机器语言的话,这需要话费20—30个人年(man-years)并且没有人能够完全理解。使用一种高效,抽象的编程语言降低开发成本到2个人年并且完成了一个可以由两个程序员理解的操作系统。
编程成本低让扔掉笨拙的程序并且重写他们变得可能。我们这样做了几次:早期6道(6-pass)编译器没有发布(尽管他工作很完美),因为我们发现他的结构太过复杂。第一个使用Concurrent Pascal编写的操作系统(被称作Deamy)仅仅用于评估语言的表达能力,并且从未构建(Brinch Hansen 1974)。第二个(被称作Pilot)使用了几个月,但是太慢了。
从一个制造商的角度来看,将一个巨大的低效的“通用的”操作系统替换为一个小的,高效的有特殊用途的操作系统是现实的并且有吸引力。
内核,操作系统,编译器最初都进行了非常系统的测试,这似乎是正确的。

Acknowledgements:(致谢)

Bob Deverill和AI Hartmann在实现内核(kernel)和Concurrent Pascal编译器所做的工作对于这个项目是至关重要的。同样对于Gilbert McCann的鼓励和支持非常感谢。
Stoy和Strachey(1972)建议在尝试同时满足多个用户之前,应该构建一个好的单用户操作系统。我发现这是个非常好的建议。我也试图听从Lampson(1974)的劝告,同时提供给程序员高层和底层的抽象。
Concurrent Pascal项目由美国国家科学基金会支持。授权号为DCR74-17331

P. Brinch Hansen 1974. Deamy—A structured operating system. Information Science,
California Institute of Technology, (May), (out of print).
P. Brinch Hansen 1975. The programming language Concurrent Pascal. IEEE Trans. on
Software Engineering, 1, 2 (June).
P. Brinch Hansen 1976a. The Solo operating system: job interface. Software—Practice
and Experience, 6, 2 (April–June).
P. Brinch Hansen 1976b. The Solo operating system: processes, monitors and classes.
Software—Practice and Experience, 6, 2 (April–June).
P. Brinch Hansen 1976c. Disk scheduling at compile-time. Software—Practice and Experience 6, 2 (April–June), 201–205.
K. Jensen and N. Wirth 1974. Pascal–User manual and report. Lecture Notes in Computer
Science, 18, Springer-Verlag, New York.
B. W. Lampson 1974. An open operating system for a single-user machine. In Operating
Systems, Lecture Notes in Computer Science, 16, Springer Verlag, 208–217.
J. E. Stoy and C. Strachey 1972. OS6—an experimental operating system for a small
computer. Comput. J., 15, 2.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值