操作系统结构
前言
一、操作系统服务
这一部分讨论操作系统提供了哪些服务。
操作系统提供的服务类型: 用户界面、程序执行、I/O操作、文件系统操作、通信、错误检测、资源分配、统计、保护和安全。
用户界面(user interface,UI): 分为命令行界面(command-line interface,CLI)和图形用户界面(graphical user interface,GUI)。
程序执行: 系统必须能将程序装入内存并运行程序。程序必须能结束执行,包括正常或不正常的结束。
通信: 在许多情况下,一个进程需要与一个进程交换信息。通信可以通过共享内存实现,也可以通过信息交换技术来实现(对于信息交换,消息包通过操作系统在进程之间移动)。
资源分配: 当同时有多个用户或多个作业运行时,系统必须为它们中的每一个分配资源。
二、操作系统的用户界面
命令解释程序
命令解释程序是相对于命令行界面来说,也就是我们常说的Shell。命令解释程序的主要作用是获取并执行用户指定的下一条命令。
命令解释程序分类: 命令解释程序包含代码以执行这些命令;由系统程序实现绝大多数命令(用于UNIX系统,且程序员可以通过创建合适名称的新文件以轻松地向系统增加命令)。
图形用户界面
我们常用的windows以及macOS,默认都是图形用户界面。但同样也都提供了命令行界面。
三、系统调用
系统调用: 操作系统内核提供一系列预定功能,通过一组称为系统调用的接口呈现给编程人员,系统调用把应用程序的请求传给内核,系统调用相应的内核函数完成所需的处理,将处理结果返回给应用程序。系统调用是内核的一部分。
系统调用举例: 编写一个从一个文件读取数据并复制到另一个文件的简单程序(蓝色部分为一系列系统调用)。
应用程序接口(applicatino interface, API): API是一系列适用于程序员的函数,包括传递给每个函数的参数以及其返回的程序员想得到的值。可以理解为API是系统调用的封装,一个API操作往往包含多个系统调用,单程序员不需要知道API调用了哪些,即细节被隐藏了起来。
API例子: Windows32API中的ReadFile()方法
API与系统调用的关系: 处理一个调用open()系统调用的用户应用程序
操作系统传递参数的三种方法:
- 通过寄存器来传递参数。
- 将参数存在内存的块和表中,将块的地址通过寄存器来传递。
- 参数tongg程序压入堆栈,通过操作系统弹出。
四、系统调用类型
系统调用的类型及内容
进程控制
- 结束,中止
- 加载,执行
- 创建进程,终止进程
- 获取进程属性,设置进程属性
- 等待时间
- 等待事件,信号事件
- 分配和释放内存
文件管理
- 创建文件,删除文件
- 打开文件,关闭文件
- 读,写,重新定位
- 获取文件属性,设置文件属性
设备管理
- 请求设备,释放设备
- 读,写,重新定位
- 获取设备属性,设置设备属性
- 逻辑上连接或断开设备
信息维护
- 获取时间或日期,设置时间或日期
- 获取系统数据,设置系统数据
- 获取进程,文件或设备属性
- 设置进程,文件或设备属性
通信
- 创建,删除通信连接
- 发送,接收消息
- 传输状态信息
- 附加或断开远程设备
五、系统程序
系统程序: 系统程序提供了一个方便的环境,以开发程序和执行程序。一小部分系统程序只是系统调用的简单接口,其它的可能是相当复杂的。分为如下几类:文件管理、状态信息、文件修改、程序语言支持、程序执行和装入、通信。
操作系统和系统程序的关系: 可以从计算机逻辑层次来理解,最底层是硬件,上面就是操作系统,接着是系统程序,最后应用程序。系统程序是操作系统除去内核之外的东西。
六、操作系统设计与实现
七、操作系统结构
简单结构(Simple Structure)
早期的操作系统并没有很好的架构,有些甚至没有区分用户模式和系统模式,导致系统不稳定。
分层结构(Layered approcah)
将操作系统分为多个层次,最底层的是硬件,最高层为用户接口,每一层都只是依靠更底层的功能来实现的,这样形成一个层次化结构。
优点: 简化了构造和调试。
缺点: 层次之间耦合性高,层次之间很难界定。另一个问题就是层次结构的效率较低,一个系统调佣可能要陷入多个层再返回,增加了很多花销。
微内核(Microkernels)
将所有非基本部分从内核中移走,并将它们实现为系统程序或用户程序,从而得到更小的内核。微内核通常包括最小的进程管理、内存管理以及通信功能。
微内核的主要功能是使客户程序和运行在用户空间的各种服务之间进行通信。通信以消息传递形式提供。
举例: 如果客户程序希望访问一个文件,那么它必须与文件服务器进行交互。客户程序和服务器决不会直接交互,而是通过微内核的消息传递。
优点:
- 便于扩充操作系统。
- 操作系统容易移植。
- 更好的安全性和可靠性。
缺点:
由于系统功能总开销的增加而导致系统性能的下降(各个服务之间缺少通信,只能依靠微内核的信息传递,导致效率下降)。
模块(Modules)
采用面向对象的特点,将各个功能模块化,每一个模块之间使用接口进行通讯,需要的时候可以将一部分的内容加载到内核中进行操作。它类似于层次结构,但是模块之间没有上下层的依赖关系,模块之间可以相互调用,更加灵活。它类似于微核,但是必要的时候会将内容加载到内核中,比微内核更有效率。
八、虚拟机
虚拟机: 虚拟机的核心思想就是将一套硬件设备抽象成多套。采用CPU调度和虚拟内存的技术,制造每一个进程都有自己单独的处理器和内存的“假象”。
优点: 对于操作系统设计员,可以再虚拟机进行系统开发,而不必进行中断,停止当前操作系统;对于用户来说,每个虚拟机完全独立于其他虚拟机,所以不同系统资源有完全的保护,无需考虑安全问题。
虚拟机如何实现资源共享?
有两种方法:
- 可以通过共享小型磁盘来共享文件,这种方案模拟了共享物理磁盘,但通过软件实现。
- 可以通过定义一个虚拟机的网络,每台虚拟机通过虚拟网络通信来传递消息。同样,该网络是按照物理通信网络来模拟的,但是是通过软件实现的。
虚拟机实例(Java虚拟机)
Java虚拟机(Java Virtual Machine): Java对象用类结构来描述:Java程序由一个类或多个类组成。对于每个Java类,Java编译器会生成与平台无关的字节码(bytecode)输出文件(.class),它可运行在任何JVM上。
JVM是一个抽象计算机的规范。它包括类加载器和执行与平台无关的字节码的Java解释器。类加载器从Java程序和JavaAPI中加载编译过的.class文件。以便为Java解释器所执行。
九、系统生成(System Generation)
就是为特定的目标配置(不是设计)特定的操作系统,通常需要考虑这样问题:
- 使用什么CPU?
- 有多少可用内存?
- 有什么可用设备?
- 需要什么操作系统选项或是使用什么参数值?
十、系统启动
引导程序: 绝大多数计算机系统都有一小块代码,称为引导成功逆袭或引导装载程序,这段代码可以定位操作系统内核,将它装入内存开始执行。