最近在移植一个应用到没有操作系统的处理器上,之前对操作系统的认识一直很浅,搞不清楚操作系统到底起到一个什么作用,这回通过在没有操作系统的处理器上运行程序,反而对操作系统有了新的认识,下面我通过《现代操作系统(第三版)》来总结一下我所理解的操作系统。
操作系统的功能是什么?操作系统的功能是连接应用程序与底层硬件。操作系统作为一个中间件为应用程序提供了一个抽象的计算机模型,其中最重要的三个抽象的概念是进程、地址空间、文件。
进程是对CPU的抽象,地址空间是对物理内存的抽象,文件是对磁盘信息的抽象。下面简单介绍一下这三个概念。
进程本质上是一个正在运行的程序,进程有其自己的地址空间,在这个地址空间中有可执行的程序代码(机器码)、数据、堆栈。除此之外,进程还有自己的资源集,包括寄存器,打开文件的清单,进程的清单及运行该程序所需要的其它信息。进程和程序的区别在于进程是一个动态的过程,而程序只是一堆静态的代码。
打开windows的任务管理器,如图一所示,windows系统运行着很多进程,但是计算机只有一个CPU,于是操作系统周期性的挂起一个进程然后运行另一个进程,但在任一时刻,都有一个进程是全部占领了CPU的,所以对进程而言,操作系统给了进程一个独占CPU的错觉。
当一个进程被挂起后,在随后的某个时刻,该进程再次启动的状态必须与之前的状态相同,这就要求挂起该进程时所有的信息必须保存下来。在操作系统中,与进程有关的所有信息,均存放在操作系统的一张表中,称为进程表(process table),进程表是数据(或链表)结构,当前运行的每个进程都占用表中的一项。
地址空间:程序的运行是将程序代码加载到内存中执行的,当运行多个程序时,多个程序的寻址可能会相互干扰,为了解决这个问题,操作系统引入地址空间这个抽象概念,由操作系统实现地址空间和物理空间之间的映射和管理,从而给进程一个独占整个内存的假象。
文件:文件是操作系统的又一重要的抽象概念,通过文件给程序员一个清晰的独立于设备的抽象模型。
如果没有这些抽象会怎么样呢?如果在一个裸机上实现应用,没有进程的概念就只能运行单进程程序;没有文件系统就不能使用fopen、fread等函数,只能通过将所需的文件加载的内存指定地址,然后从指定地址读入数据。