操作系统
操作系统的作用是为用户提供应用软件的运行环境。用户运行应用程序时所执行的任务依赖于操作系统的服务,然而,操作系统执行任务时,许多情况下都无需用户甚至程序员的干预。例如,应用程序从硬盘读取任务时,程序员只需要调用操作系统提供的函数即可,执行读取的特定步骤完全交由操作系统处理。程序员不用了解从计算机硬盘中读取文件与从外部的USB存储有什么区别。
绝大多数程序员都开发过很多代码供用户使用,他们可能还会使用框架提供图形化用户界面与用户进行交互。mac或者iphone应用商店提供的所有应用程序都属于这一类。
操作系统的一项重要功能就是管理计算机硬盘资源(如内存和CPU)以及外部设备(如硬盘)。操作系统所支持的硬件设备的集合在不同的机器上有很大的区别。尽管air与pro运行相同的操作系统,但是他们的硬件设置却有很大的区别。为了让操作系统支持多种硬件配置而不膨胀,支持每个硬件组件的代码被打包成一种特殊类型的内核扩展程序(驱动程序)。这种模块化的方式是操作系统可以根据系统上现有的硬件按需要加载驱动程序。厂商因而也可以在系统中安装相应的驱动程序以支持他们的硬件。安装标准的MAC OS 系统需要安装100多个驱动程序,但其中只有一个子集用户运行特定的系统。
为了提高系统的安全性和稳定性,现代操作系统将操作系统核心代码与应用程序、用户运行的服务程序分离。任何作为内核的一部分运行的代码,都要在内核空间内运行。运行在内核空间的代码被授予特权,如可以直接读写链接到计算机的硬件设备,但是标注你的用户应用程序没有这个特权。
相反,用户处理的标准应用程序代码要在“用户空间”中运行。用户空间中运行的软件无法直接访问硬件。因此,为了访问硬件,用户代码需要向内核发送请求,让内核代表应用程序执行任务。
用户空间与内核空间运行的代码之间具有明确的界限。应用程序只能通过调用操作系统发布给用户空间代码的函数访问内核。类似的,内核空间代码独立运行与用户空间代码环境之外。内核不适用与用户空间代码相同的富编程API,他们有自己的API集合,以供内核扩展开发者使用。如果你熟悉用户空间编程,那么这些API最初看棋类可能有一定的局限性。因为通常情况下,用户交互和访问文件系统等操作不能在开发内核扩展时使用。
强制应用程序向内核发送访问硬件的请求有一大优点:内核成为硬件设备的中央仲裁器。比如声卡,系统上可能有多个应用程序在同一时间播放音频,但由于所有的请求只能通过一个音频驱动传送,所以该驱动程序能将来自所有的应用程序的音频流混合,然后将产生的混合流提供给声卡。