文章目录
- 0. 前言
- 2.1 操作系统的服务
- 2.2 操作系统的用户界面
- 2.3 系统调用(System Call)
- 2.3.1 系统调用的过程
- 2.4 系统调用类型
- 2.5 系统程序分类
- 2.6 操作系统设计和实现
- 2.7 操作系统结构
- 2.7.1 简单结构
- 2.7.2 分层方法
- 2.7.3 微内核
- 2.7.4 模块
- 2.8 操作系统的调试
- 2.9 虚拟机
0. 前言
操作系统提供环境以便执行程序。操作系统的内部结构差别很大,有许多不同的组织方式。
我们可以从多个方面来分析操作系统:
第一个方面注重系统提供的服务;第二个方面关注用户和程序员采用的接口;第三个方面是系统组件及其相互关系。
本章目标:
- 描述操作系统为用户、进程和其他系统提供的服务
- 讨论构建操作系统的各种方式
- 解释如何安装与定制操作系统以及如何启动操作系统
2.1 操作系统的服务
用户界面(一种是命令行界面;另一种是批界面,最为常用的是图形用户面)、程序执行、I/O操作、文件系统操作、通信、错误检测、资源分配、统计、保护和安全。
2.2 操作系统的用户界面
命令解释程序(CLI)被成为外壳(shell)、图形用户界面(GUI)
命令解释程序主要作用: 获取并执行用户指定的下一条指令。
2.3 系统调用(System Call)
系统调用提供操作系统服务接口。
- 操作系统作为用户和计算机的接口,需要向上提供一些简单易用的服务,主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成
- 系统调用是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。
- 操作系统内核提供一系列预定功能,通过一组称为系统调用的接口呈现给编程人员,系统调用把应用程序的请求传给内核,系统调用相应的内核函数完成所需的处理,将处理结果返回给应用程序。
向操作系统传递参数的三种方法:
- 通过寄存器来传递参数。
- 若参数数量比寄存器多,参数通常存在内存的块和表中,并将块的地址通过寄存器来传递。
- 参数也可以通过程序放在或压入堆栈中,并通过操作系统弹出。
例如:小红和小明一起去打印作业,按下打印按钮之后,打印内容并没有混淆。如果进程可以随便使用打印机,两个打印的作业就会混杂。
解决混淆的方法:操作系统提供系统调用功能,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统发出请求,操作系统会对各个请求进行协调管理。
应用程序通过系统调用请求操作系统的服务。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
2.3.1 系统调用的过程
高级语言——编译——汇编语言——处理系统调用 的相关代码传递系统调用参数——执行陷入指令(用户态)——执行系统调用相应服务程序(核心态)——返回用户程序
- 陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态
- 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
- 陷入指令是唯一一个只能在用户态执行,而不可在核心态执行的指令
2.4 系统调用类型
进程控制、文件管理、设备管理、信息维护、通信、保护
-
进程控制: 完成进程的 创建、撤销、阻塞、唤醒等功能。这种类型的系统调用用于创建和管理进程。例如,fork()在UNIX中用于创建新的进程,exit()用于结束进程,wait()用于使父进程等待其子进程的结束,exec()用于在进程中执行新的程序。
-
文件管理: 完成文件的 读、写、创建、删除等功能。这类系统调用使程序可以读写文件。例如,open()、read()、write()、close()等函数使程序可以打开、读取、写入和关闭文件。此外,还有一些用于管理文件的系统调用,如delete()用于删除文件,lseek()用于改变文件的读/写位置。
-
设备管理: 完成设备的请求、释放、启动 等功能。这类系统调用使程序可以管理和控制设备。例如,ioctl()函数可以用于对设备进行各种控制。
-
信息维护:这类系统调用用于获取和设置系统数据。例如,getpid()可以获取进程的ID,time()可以获取当前的系统时间。
-
通信:这类系统调用用于处理进程间的通信。例如,IPC机制(如信号、管道、消息队列、共享内存、信号量等)可以使用这类系统调用,如send()、receive()等。
2.5 系统程序分类
文件管理、状态信息、文件修改、程序语言支持、程序装入和执行、通信。
2.6 操作系统设计和实现
- 设计目标需求:用户目标和系统目标
- 用户目标:更容易学习,容易使用,可靠,安全和快速
- 系统目标:容易设计、实现和维护。灵活、可靠、高效且没有错误。
- 机制和策略:机制决定如何做,策略决定做什么
- 实现:用高级语言的缺点仅仅在于降低了速度和增加了存储要求
2.7 操作系统结构
现代操作系统庞大而复杂,为了正常工作并易于修改,应当认真设计。常用方法是将这种系统分成子系统或模块,而不只是一个单片系统。
2.7.1 简单结构
简单、小、功能有限
MS-DOS、原始的UNIX操作系统
2.7.2 分层方法
定义:操作系统分成若干层(级)。最底层(层0)为硬件,最高层(层N)为用户接口。每层只考虑较低层的功能和服务。
优点:每层都是利用较低层所提供的功能实现的,并为叫高层隐藏了一定的数据结构、操作和硬件的存在
缺点:分层法的主要困难涉及对层的详细定义;与其它方法相比效率较差
2.7.3 微内核
微内核方法将所有非基本部分从内核中移走,并将它们实现为系统或用户程序,这样得到了更小的内核。
微内核的主要功能是使客户程序和运行在用户空间的各种服务之间进行通信。
优点:便于扩充操作系统;很容易从一种硬件平台设计移植到另一种硬件平台设计;更安全、可靠。
缺点:由于系统功能总开销的增加而导致系统性能的下降。
2.7.4 模块
可加载的内核模块
大多数现代操作系统实现内核模块:采用面向对象的方法;每个核心组件是分开的;每部分与已知接口的其他部分通信;每部分根据需要加载到内核
总之,类似于层,但更灵活。
2.8 操作系统的调试
调试(debugging)是查找和更正系统(包括硬件和软件错误)。性能问题为臭虫(bug),因此调试也会包括性能优化,即通过解决处理瓶颈而改善性能。
故障分析、性能优化、DTrace
2.9 虚拟机
虚拟机(VirtualMachine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。