Professordeng's Blog

可能有人会问:为什么需要操作系统?前面说的系统调用完全可以实现为应用程序链接的库。没有操作系统,用户程序甚至可以根据自己的需要定制自己的库。应用程序可以直接与硬件资源交互,并以最适合应用程序的方式使用这些资源(例如实现高性能)。毕竟一些嵌入式设备或实时系统的操作系统就是这样实现的。

直接利用库方法的缺点是,如果有多个应用程序在运行,那么这些应用程序必须都表现良好。例如每个应用程序必须定期放弃处理器,以便其他应用程序可以运行。如果所有应用程序相互信任并且没有错误,那么这种协助分时方案也是可以的。但是对于应用程序来说,不信任对方和有 bug 菜式常态,因此隔离通常比协作更重要。

为了实现强隔离,操作系统禁止应用程序直接访问硬件资源,而是将资源抽象为服务。例如,应用程序只通过打开、读取、写入和关闭系统调用与文件系统交互,而不是读取和写入原始磁盘扇区。这为应用程序提供了方便的路径名,并允许操作系统(作为接口的实现这者)管理磁盘。

类似地,Unix 在进程之间透明地切换硬件处理器,根据需要保存和恢复寄存器状态,这样应用程序就不必考虑 “时间共享” 问题。这种透明性允许进程共享处理器,即使某些应用程序处于有限的循环中。

另外,Unix 进程使用 exec 来构建它们的内存影像,而不是直接与物理内存交互。这允许操作系统决定进程在内存中的位置;如果内存不足,操作系统甚至可以将进程的一些数据存储在磁盘上。exec 还为用户提供了文件系统存储可执行程序影像的便利。

Unix 进程之间的许多交互形式都是通过文件描述符进行的。文件描述符不仅可以抽象许多细节(例如,管道或文件中的数据存储在何处),还可以简化交互。例如,如果管道中的一个应用程序失败,内核将为管道中的下一个进程生成文件结尾。

系统调用接口经过精心设计,既为程序员提供了方便,又提供了强隔离的可能性。Unix 接口并不是抽象资源的唯一方法,但事实证明它是一种非常好的方法。