文章目录

      在早期的计算机中不包含操作系统,它们从头到尾只执行一个程序,并且这个程序能访问计算机中的任何资源。在这种裸机环境中,不仅很难编写和运行程序,而且每次只能运行一个程序,这对于昂贵并且稀缺的计算机资源来说也是一种浪费。
      操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都运行在单独的进程,操作系统为各个独立执行的进程分配资源,包括内存,文件句柄及安全证书等。如果需要的话,在不同的进程之间可以通过一些粗粒度的通信机制来交换数据,包括套接字共享内存信号量以及文件等。
      之所以在计算机中加入操作系统来实现多个程序同时运行,主要是基于以下原因:

资源利用率:在某些情况下,程序必须等待某个外部操作执行完成,例如输入操作和输出操作等,而在等待时程序无法执行其它任何工作。因此,如果在等待的同时运行另一个程序,那么无疑会提高资源的利用率。

公平性:不同的用户和程序对于计算机上的资源有着同等的使用权,一种高效的运行方式是通过粗粒度的时间分片使这些用户和程序共享这些资源,而不是由一程序从头到尾运行,然后在启动下一个程勋。

便利性:通常来说,在计算多个任务时,应该编写多个程序,每个程序执行一个任务并在必要时相互通信,这比只编写一个程序来计算所有任务更容易实现。
      在早期的分时系统中,每个进程相当于一台冯诺依曼计算机,它拥有存储指令和数据的内存空间,根据机器语言的语义以串行的方式执行指令,并通过一组IO指令与外部设备通信。对每条被执行的指令,都有相应的“下一条指令”,程序中的控制流是按照指令集的规则来确定的。当前,几乎所有的主流编程语言都遵循这种串行编程模型,并且在这些语言的规范中也都清晰的定义了在某个动作完成之后需要执行下一个动作。
      串行编程模型的优劣在于其直观性和简单性,因它模仿了人类的工作方式。每次只做一件事情,做完之后再做另一件事情。例如:起床,穿上睡衣,刷牙洗脸,然后下楼吃早点。在编程语言中,这些现实世界中的动作可以进一步抽象为一组粗粒度更细的动作。但凡做事高效的人,总能在串行与一不行之间进行合理的平衡。

文章目录