研究一个操作系统,或者说设计一个操作系统,需要从多个角度去了解操作系统。第一是通过考察所提供的服务(用户角度);第二是通过考察为用户和程序员提供的接口(程序员角度);第三是研究系统的各个组成部分及其相互关系(操作系统设计人员)。
主要内容:
*操作系统为用户、进程和其他系统提供的服务;
*组织操作系统的不同方法;
在本节介绍操作系统提供的服务和操作系统的设计和实现。
1、操作系统服务
操作系统提供一个环境以执行程序。它向程序和这些程序的用户提供服务。这些服务帮助用户更高效地完成任务,同时确保系统高效率运行。
*用户界面(User Interface, UI);
*程序执行:系统必须能将程序装入内存并运行程序。程序必须能结束执行,包括正常结束和部正常结束(指明错误)。
*I/O操作:运行程序可能需要I/O,这些I/O可能涉及文件或设备。为了提高效率和进行保护,用户通常不能直接控制I/O。因此,操作系统必须提供进行I/O操作的方法。
*文件系统操作;
*通信:在许多情况下,一个进程需要与另一个进程交换信息。这种通信有两种主要形式。一种是发生在同一计算机(同一操作系统)运行的两个进程之间;另一种是运行在由网络连接起来的不同的计算机上的进程之间。通信可以通过共享内存来实现,也可通过消息交换技术来实现(对于消息交换,消息包通过操作系统在进程之间移动)。
*错误检测:操作系统需要知道可能出现的错误。错误可能发生在CPU或内存硬件(如内存错误或电源失败)、I/O设备(如网络连接出错、打印机缺纸)和用户程序中(如算术溢出、试图访问非法内存地址)。对于每种类型的错误,操作系统应该采取适当的动作以确保正确和一致的计算。
*资源分配:当同时有多个用户或多个作业运行时,系统必须为它们中的每一个分配资源。例如,为了更好地使用CPU,操作系统需要采用CPU调度算法以考虑CPU的速度、必须执行的作业、可用的寄存器数和其他因素。
*统计:需要记录哪些用户使用了多少和什么类型的资源。
*保护和安全。
A、操作系统的用户界面:
#命令行界面(Command-Line Interface, CLI),采用文本命令,并用一定方法输入。
命令解释程序(Shell)的主要作用是获取并执行用户指定的下一条命令。执行这些命令有两种常用方法。一种方法是命令解释程序本身包含代码以执行这些命令;另一种方法是由系统程序实现大多数命令,命令解释程序用命令来识别文件以装入内存(Unix系统)。
#图形用户界面(Graphical User Interface),视窗系统,具有定位设备来指挥I/O、从菜单选择、选中部分并用键盘输入文本(像素Pixel)。
B、系统调用:
系统调用提供了操作系统提供的有效服务界面。由操作系统实现提供的所有系统调用所构成的集合即应用程序接口(Application Programming Interface,API)。一般应用程序开发人员根据API来设计程序。API是一系列适用于应用程序员的函数,包括传递给每个函数的参数及其返回的程序员想得到的值。有三种应用程序员常用的API:适用于Windows系统的Win32 API,适用于POSIX系统的POSIX API(包括几乎所有UNIX、Linux、Max OSX版本),以及适用于运行于Java虚拟机程序的Java API。
对于程序员,通过API操作系统接口的绝大多数细节被隐藏起来,并被执行支持库所管理。API、系统调用接口和操作系统之间的关系(处理一个Open()系统调用):
向操作系统传递参数的三种方法:
*寄存器参数传递;
*通过程序放入堆栈中;
*采用块或堆栈的方法。
C、系统调用类型:
系统调用大致可以分为五大类:
*进程控制:
#结束,放弃
#装入,执行
#创建进程,终止进程
#取得进程属性,设置进程属性
#等待时间
#等待事件,唤醒事件
#分配和释放内存
*文件管理:
#创建文件,删除文件
#打开,关闭
#读、写、重定位
#取得文件属性,设置文件属性
*设备管理:
#请求设备,释放设备
#读、写、重定位
#取得设备属性,设置设备属性
#逻辑连接或断开设备
*信息维护:
#读取时间或日期,设置时间或日期
#读取系统数据,设置系统数据
#读取进程、文件或设备属性
#设置进程、文件或设备属性
*通信:消息传递模型和共享内存模型
#创建、删除通信连接
#发送、接收消息
#传递状态消息
#连接或断开远程设备
D、系统程序:
系统程序提供了一个方便的环境,以开发程序和执行程序。它们可以分为如下几类:
*文件管理
*状态信息:系统信息,详细的性能、登录和调试信息以及系统设置(如Windows注册表)。
*文件修改
*程序语言支持:常用程序设计程序语言的编译程序、汇编程序、调试程序和解释程序通常与操作系统一起提供给用户。
*程序装入和执行:绝对加载程序,重定位加载程序,链接编辑器和覆盖式加载程序。
*通信:提供在进程、用户和计算机系统之间创建虚拟连接的机制。
2、操作系统设计和实现
A、设计目标:
需求可以分为两个基本类:用户目标和系统目标。
用户目标:方便和容易使用,学习代价低,可靠安全快速。
系统目标:容易设计、实现和维护,灵活、可靠、高效且没有错误。
B、机制(Mechanism)与策略(Policy):
机制决定如何做,策略决定做什么。Unix/Linux的接口设计有一句通用的格言“提供机制而不是策略”。操作系统的本质是什么?管理者?亦或服务者?但归根到底,操作系统是一个执行者。
执行用户程序,所谓为用户服务;执行中断,所谓为外设服务;系统调用,所谓为广大的程序员服务;执行内核线程,为操作系统自身服务。而这些所有,它们执行的核心,无非是在恰当的时机,让哪个对象(程序、线程、中断服务程序、中断的下半部分、系统调用)占有CPU。换句话说,Unix/Linux抽象出对这些对象的执行机制:
*程序的执行机制——进程
*内核函数的执行机制——线程
*中断服务程序的执行机制——中断信号触发
*中断下半部的执行机制——softirq, tasklet, 工作队列
*系统调用的执行机制——软中断(0x80中断触发)
如果说机制是一种框架,那么,策略就是填充框架的一个个具体的实体。机制提供的是一种开放而宽松的环境,而策略就是在这个环境下赖以生存的生命个体。比如,我们编写的一个程序,fork()以后,就成为一个个进程的生命个体。而操作系统所提供给我们创建、执行以及结束进程的各种原语fork()、exec()、exit()等是统管各种进程的机制。我们所创建进程的死活并不会影响机制本身。
C、实现:使用高级语言来实现操作系统。通过改善数据结构和算法来提高系统性能,同时监视系统性能,增加代码以计算并显示系统行为和测量。