“操作系统”,简称“OS”,是一个包含多个部分和多个目标的大型程序。
它的第一项工作是在你第一次打开计算机时启动并运行计算机。它的另一项工作是启动和结束应用程序,并给每个程序一个运行时间。它是那台计算机上所有其他程序的“老大”。当RAM中有多个程序时,在它们之间切换的是操作系统。它允许一个程序运行一小段时间,然后运行另一个程序,然后运行另外一个程序。如果RAM中有十个程序,并且每个程序每次运行百分之一秒,那么每个程序将能够在这段时间内执行数百万条指令,每秒执行几次。看起来所有十个程序都在同时运行,因为每个程序都能以比眼睛更快的速度完成任务.
操作系统还向应用程序提供服务。当应用程序需要从磁盘读取、写入磁盘或在屏幕上绘制字母时,它不必执行完成任务所需的所有复杂I/O指令。操作系统有许多小例程,它一直保存在RAM中,用于此类目的。
应用程序要使用其中一个例程,只需要在寄存器中加载一些信息,然后跳转到正确的OS例程的地址。下面是一个如何实现的示例。假设您想在屏幕上绘制一个角色。首先,将所需字符的ASCII码放入R0。然后将希望它在屏幕上出现的行和列编号放入R1和R2。这里有一个棘手的部分:您将应用程序的下一条指令的地址放入R3。现在只需跳转到OS例程。例程将处理在屏幕上绘制字符的所有细节,然后它的最后一条指令将是JMPR R3。因此,这些例程可以从任何应用程序“调用”,完成后,例程将跳回调用它的应用程序中的下一条指令.
让OS执行所有I/O功能有几个原因。一个是它使编写应用程序更容易,程序员甚至不需要知道外围设备的实际工作方式。另一个原因是,如果每个应用程序都有自己的所有I/O例程的副本,那么将浪费大量RAM。其中一个最重要的原因是,操作系统可以检查程序是否应该被允许做它要求做的事情。这是OS作为老板的另一项工作的一部分。
操作系统的核心基本上是一个指令循环,它提出以下问题:我需要输入什么吗?我需要输出什么吗?我需要让一些程序运行吗?
如果所有这些问题的答案都是否定的,那么CPU只是在这个循环中反复执行指令,每秒执行数百万次。当有事情要做时,它跳到处理它的程序的开头,当完成后,它跳回到这个循环,在那里操作系统“等待”其他事情。
这是一个更大的RAM版本的图,显示了操作系统和其他几个程序可能占用的RAM部分。
在每个程序的RAM中,都有使程序工作的所有指令代码。每个程序可以被分成自己的主循环,以及许多用于它需要执行的各种任务的例程。如上所述,操作系统还具有可由其他程序调用的例程。
每个程序还使用部分“地址空间”存储正在处理的数据。例如,计算器需要有几个字节,用于存储用户输入的数字。纸牌需要一些字节来指定哪些牌在哪个位置。字处理器需要一些RAM来存储组成您正在处理的文档的所有ASCII代码。操作系统还需要字节,以便存储字体、跟踪应用程序的加载位置、接收从磁盘读取的数据,以及执行其他用途。
这就是普通电脑里发生的事情。RAM中有许多不同的程序和数据区域。OS跳转到程序,程序跳转到例程,例程跳转到子程序。每个程序处理其数据或计算某些内容或执行I/O操作。当每一个完成时,它会跳回到它的来源。CPU一次执行一个程序中的一条指令,如果它们被智能地编写,每个程序都会一条一条地完成任务,而不会干扰其他程序。
如果我们的计算机包括一个“中断系统”,就像我们在前几章所描述的那样,每当有人按下键盘上的键或移动鼠标时,就会有一个中断,它会调用操作系统的一部分来确定是哪个I/O设备导致了中断,然后调用适当的例程来处理它。完成后,CPU将继续执行中断发生时运行的任何程序的下一条指令。
这一切看起来都很复杂,一眨眼之间就执行了数百万和数十亿条指令。有一些组织程序的方法和良好的编程实践可以使其更容易理解。