第1章 操作系统
1.1 操作系统简介
分层是计算机领域设计中最常用的技术之一,软件设计者经常使用分层的思想解构复杂的系统,将复杂系统拆分为一个个模块后,再以一种层次结构来组装。在分层模型中不同层次代表不同的抽象级别,底层负责具体功能的实现,并向上一层呈现一个抽象,为上层提供服务。上一层只需要知道下层的抽象接口,而不需要了解其内部运作机制,这使得每层只需关注自身的实现,不考虑其他不相关的层次。分层大大降低了系统设计的复杂性,提高了软件的可移植性。
分层的思想贯穿了整个计算机系统的架构,例如最常见的网络四层结构。而操作系统就是这种分层思想的典型应用。图1-1展示了一个计算机体系中分层思想的示例。
图 1-1
硬件:提供计算能力、存储能力及输入/输出等功能的物理设备,其中 CPU 作为计算机设备的运算和控制核心,负责指令读取、译码与执行,它是计算机系统的基石,是程序运行的硬件载体,所有软件程序最终都将以指令的形式运行在CPU上。
CPU指令集:在CPU内被处理的程序,指令集是计算机体系中软件控制CPU的接口。
操作系统:上层应用所能控制的系统级的功能集合,为底层硬件提供防护和调度管理功能。
系统调用:操作系统内核中有一组实现系统功能的过程,系统调用就是对这些过程的调用,它是用户态进入内核态的唯一入口。
函数库:操作系统对上层应用提供的一系列对底层硬件、内核等的调用方法,系统调用被封装在其中。
应用程序:借助底层各个层级提供的功能,实现不同的业务逻辑功能。
早期的IT系统,少数厂商绑定硬件、操作系统和应用。而标准操作系统的出现,通过系统软件屏蔽了异构硬件的差异,为上层应用提供统一的运行环境。
1.1.1 主要功能
对于早期的应用,往往需要采购特定的应用服务器,如WebLogic或WebSphere。但在这个阶段,应用和应用服务器都被直接部署在物理服务器的操作系统之上。随着技术的发展,昂贵且专有的应用服务器被开源的轻量级Web服务器如Apache Tomcat或Jetty等代替。这种部署模式往往使用编程语言特定的发布包,如JAR、WAR格式部署服务,此方法部署迅速。
但无论对于哪种应用服务器及部署于其中的应用来说,操作系统的一个作用都是建立安全保护机制,确保位于其上的部分免受来自网络或其他软件的恶意侵害。同时,它也要建立软件之间的协作秩序,让大家按照期望的方式进行协作。操作系统的重要功能包括:
资源接入与抽象——将CPU、内存、硬盘、网卡等设备接入系统中,并将其抽象为可识别的逻辑资源,这样一来,操作系统才能实现对各种硬件资源的管理。
资源分配与调度——通过对资源管理的能力,将抽象出来的不同硬件资源,按照需求分配给不同的应用使用。
应用生命周期管理——实现应用的安装、升级、启动、停止、卸载等管理操作。同时为应用提供编程接口,这些编程接口一方面简化了应用开发,另一方面提供了多应用共存(多任务)的环境,实现了对应用的治理。
系统管理与维护——协助系统管理员实现对系统自身的各种配置、监控、升级等管理操作。
人机交互与支持——提供必要的人机界面,支持系统管理员和用户对系统实施各类操作。
1.1.2 系统结构
操作系统在整个计算机系统结构中具有重要作用,承上启下,对下负责管理硬件资源,对上负责为应用程序提供标准接口。操作系统由内核、系统调用、Shell、库函数几个部分组成,其中Shell和库函数共同构成系统交互部分,如图1-2所示。
图 1-2
内核:内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分程序。但这种访问是有限的,并且内核可以决定一个程序在什么时候对某部分硬件操作多长时间。
系统调用:为了方便上层应用程序或用户调用内核,操作系统在用户态和内核态之间定制了一套标准接口,用户可以通过这些标准接口根据权限访问系统资源。这些接口统称为系统调用(System Call)。这样,用户不需要了解内核的复杂结构就可以使用内核。Linux 中有 200 多个系统调用,系统调用是操作系统的最小功能单位。一个操作系统及这个系统中的应用,都不可能实现超越系统调用的功能。
Shell:Shell是操作系统的用户界面层,提供了一种用户与操作系统交互的方式。Shell本质上是一个命令解释器(Interpreter),它可以接收用户输入的命令,然后把命令翻译成机器语言并送入内核中执行。Shell是可编程的,可以执行符合Shell语法的文本,极大方便用户使用操作系统完成自己的工作。
库函数:库函数是对操作系统的封装和扩展,目的是让应用程序更方便地使用系统调用。比如Linux的libc库函数实现了malloc()、calloc()和free()等函数,方便应用程序分配和释放内存。
操作系统的一个核心思想是保证自身功能的高内聚、低耦合。系统交互层下通系统调用,上通各种应用,充当了两者之间的“桥梁”,不同应用能够遵照同一个清晰的接口,使用底层公共的硬件资源,达到共同工作的目的,从而增强整个计算机系统的能力。