【操作系统】 第二章 操作系统结构 冲鸭!!
第二章 操作系统结构
2.1 操作系统的服务 P38
- 操作系统负责提供一个环境以执行程序,向程序和使用程序的用户提供一定的服务。
- 服务包含许多有用的函数。
操作系统有一组服务,用于提供用户功能:
- 程序执行 – 系统能将程序装入内存并运行,结束包括正常或不正常结束。
- I/O 操作 – 用户通常不能直接控制I/O 设备,操作系统必须提供进行I/O 操作的方法。
-
文件系统操作 – 程序需要读、写、创建、删除文件。
通信 – 进程间交换信息一种发生在同一台计算机上运行的两个进程之间,另一种发生在由计算机网络连接起来的不同计算机上的进程之间。通信通过共享内存或消息传递来实现。 - 错误检测 –错误可能发生在CPU和内存中、 I/O 设备中、用户程序中,对于每种错误,操作系统应采取适当行动,以确保正确和一致的计算
- 资源分配 – 当多个用户登录到系统上或多个作业同时执行时,系统必须为每个进程分配资源
- 统计– 跟踪记录哪些用户使用了多少和什么类型的计算机资源。这种记录用于记帐或建立使用统计数据
- 保护 – 确保所有对系统资源的访问都是受控制的,特别是在多用户计算机系统中
2.2 用户与操作系统的界面 P40
- 用户与操作系统的界面
- 命令行界面
- 图形用户界面
命令解释程序
- 在 MS-DOS中称为==命令行解释程序==
- UNIX中称为外壳(shell) (cf. kernel)
- 作用:获取并执行用户指定的下一条命令。
- 文件的创建、删除、列出、打印、复制、执行。
执行命令的方法:
-
命令解释程序本身包含代码
- 命令的数量决定了命令解释程序的大小 -
由系统程序实现命令
- rm file.txt
- 搜索名为rm的文件,将文件装入内存,并用参数file.txt来执行。
图形用户界面(GUI)
- GUI提供基于鼠标的窗口和菜单系统作为接口。
2.3 系统调用(给程序员用的) P43
-
系统调用 提供了进程与操作系统之间的接口
- 调用通常以汇编语言指令的形式提供。
- 有些语言 (e.g. C, C++)已经取代了汇编语言而直接用于系统编程,允许直接调用系统调用,这时系统调用通常类似预定义的函数或子程序调用。(Win32 application programming interface (API) for Microsoft Windows。) -
例:从一个文件读取数据并复制到另一个文件
-
一般根据应用程序接口(API)设计程序
-
API是一系列适用于程序员的函数,含参数及返回值
- win32 API
- POSIX API
- Java API -
例:处理一个调用open( )系统调用的用户应用程序
运行程序向操作系统传递参数通常用三种方法
- 通过 寄存器 来传递参数
- 将参数存放在内存的块或表中,并将 块的地址 作为参数传递给寄存器
- 参数也可放在或压到 堆栈 中,并通过操作系统弹出堆栈。
2.4 系统调用类型 P46
- 进程控制
- 包括分配释放内存 - 文件管理
- 设备管理
- 信息维护
- 通信
进程控制
- 正常中断 (退出)
- 非正常中断 (终止)
- 创建进程 (fork, exec),终止进程
- 等待时间,事件,信号, etc.
- 分配释放内存 (malloc, free)
文件管理
- 创建,删除文件
- 打开, 关闭
- 读,写,重定位
- 获取,设置文件属性
设备管理
- 请求,释放设备
- 读,写,重定位
- 获取,设置设备属性
信息维护
- 获取,设置时间或日期
- 获取,设置系统数据
- CPU 等级, 内存大小, 空闲内存
- 用户数,操作系统版本,当前用户数 - 获取,设置目标属性
- 进程
- 文件
- 设备
通信
- 两种通信模型: 消息传递(左) or 共享内存(右)
2.5 系统程序 P51
-
系统程序 提供一个方便的环境,以开发和执行程序 (cf. Fig 1.1)
- 硬件
- 操作系统
- 系统程序
- 应用程序 - 绝大多数用户所看到的操作系统是由系统程序而不是实际系统调用定义的。
系统程序划分
系统程序可分为:
- 文件管理
- 状态信息
- 文件修改 (e.g. text editors)
-
程序语言支持
- 编译器, 汇编器, 链接程序,解释程序,调试程序 -
程序装入和执行
- 绝对加载程序、重定位加载程序、链接编辑器 -
通信
- 邮件,浏览器, etc.
2.6 操作系统的设计与实现 P52
- 设计目标
- 机制和策略
- 实现
设计目标
- 系统设计受到硬件选择和系统类型的影响
- 用户目标 —— 容易使用、容易学习、可靠、安全、快速
- 系统目标 —— 容易设计、实现和维护、灵活、可靠、没有错误且高效
- 不同的要求能形成对不同环境的不同解决方案
实现
- 操作系统的传统实现方式是用汇编语言编写,现在大多使用高级语言如C或者C++
-
使用高级语言的优点:
- 代码编写更快
- 更为紧凑
- 更容易理解和调试
- 更容易从一个硬件移植到另一个硬件上 - 反对观点认为:采用高级语言实现的操作系统降低了速度、增加了存储要求。
- 然而:
- 现代编译器能对大型程序进行复杂的分析并采用高级优化技术以生成优化代码。
- 操作系统的重要性能改善很可能是由于更好的数据结构和算法,而不是由于优秀的汇编语言代码。
- 在系统编写完成并能正常工作之后,可以找出瓶颈子程序,并用相应的汇编语言子程序代替。
2.7 操作系统结构 P54
- 现代操作系统庞大而复杂,必须要设计一个 好的结构 以便能正常工作并能容易修改。
- 通常是将这一任务分成小模块而不只是一个单块系统
简单结构
- MS-DOS – 利用最小的空间提供最多的功能
- 内存大小从256到 640KB, OS 占用 48 到 128 KB- 以较小、简单且功能有限的系统形式启动
- 没有被划分成模块
MS-DOS 层次结构
UNIX 系统结构
- UNIX – 最初受硬件功能的限制
-
由两个独立部分组成:
- 系统程序
-
内核
- 包括物理硬件之上和系统调用接口之下的所有部分
- 提供文件系统、CPU调度、内存管理和其它操作系统功能
- 大多数的功能都结合放在这一层
分层方法
- 操作系统分成若干层,每层建立在较低层之上。
- 最底层 (层 0) 是硬件; 最高层 (层 N) 是用户接口
- 选择了分层后,每层只能利用较低层的功能(或操作)和服务。
- 简化了调试和系统验证,设计与实现
- 不必知道如何实现这些操作,只需知道这些操作做什么
- 与其它方法相比,分层法效率较差。
- 每层为系统调用增加了额外开销 (参数或数据的修改与传递)
微内核
- 随着UNIX操作系统的扩充, 内核变得更大且更难管理
- 将所有非基本部分从内核中移到 用户空间
- 哪些服务保留在内核内?
- 最小的进程和内存管理
- 通信功能
- 通信以消息传递形式提供
优点
- 便于扩充.
- 方便操作系统从一种硬件平台设计移植到另一种硬件平台设计.
- 更好的可靠性 (内核运行更少的代码).
- 更好的安全性.
举例
- Mach (mid-1980s, CMU)
- Tru64 UNIX (formerly Digital UNIX)
- Apple MacOS X Server - QNX (real-time OS)
- Windows NT (hybrid structure)
- 华为鸿蒙系统
模块
- 用面向对象编程技术来生成模块化的内核
- 内核有一组核心部件,以及在启动或运行时对附加服务的动态链接。
虚拟机
- 虚拟机 : 应用程序将它们的一切下层当成硬件的一部分而看作一个层次整体。
- 操作系统创建一种幻觉,以至于进程认为有自己的处理器和自己的(虚拟)内存。
-
物理计算机共享资源以创建虚拟机
- CPU 调度能共享出CPU以造成一种每个用户都有自己的处理器的感觉。
- 假脱机(spooling) 和文件系统能提供虚拟读卡机和虚拟行式打印机。
- 一个普通的用户分时终端提供虚拟机操作员终端的功能。
虚拟机优缺点
- 每个虚拟机完全与其他虚拟机相隔离,由于各种系统资源完全被保护,就不存在安全问题.
- 没有直接资源共享 - 虚拟机系统是用于研究和开发操作系统的很好工具,虚拟机允许进行系统开发而不必中断正常的系统操作
- 虚拟机实现困难,因为需提供与底层机器完全一样的拷贝需要大量的工作.
虚拟机
- Java 虚拟机
- VMware 虚拟机
2.8 系统生成 p63
- 操作系统通常设计成能运行在某类计算机上,对于某个特定的计算机场所,必须要配置和生成系统,这一过程称为系统生成(system generation,SYSGEN)。
- SYSGEN程序采用自动或者交互方式获得有关硬件系统的特定配置信息,包括:
- CPU类型?安装什么选项 (扩展指令集、浮点运算操作等)
- 内存大小
- 设备,包括设备号码、设备中断号、设备类型和模型、以及任何特别的设备特点
- 操作系统选项和参数值 (缓冲区大小、CPU调度算法、支持的进程最大数量等)
系统生成的三种方式
- 修改源代码并编译
- 用系统描述创建表,并从预先编译过的库中选择模块
- 构造完全由表驱动的系统
系统启动
- 引导 —— 开机时,装入内核以启动系统
- 引导程序 —— 存在ROM中的一小段代码,能定位内核,将它装入内存并开始执行。(ROM:只读存储器)
小结 P64
- 操作系统提供什么服务
- 如何提供服务
- 系统调用
- 进程控制、文件管理、设备管理、信息维护、通信 - 系统程序
- 系统调用
- 设计操作系统的方法
- 生成
- 启动
作业 P65
2.3 给出三种向操作系统传递参数的常用方法。
- 通过寄存器来传递参数
- 寄存器传递参数块的首地址
- 参数通过程序存放或压进堆栈中,并通过操作系统弹岀堆栈。
2.7 命令解释器的用途是什么?为什么它经常是与内核分开的?是否可能采用操作系统提供的调用接口为用户开发一个新的命令解释器?
答案:命令解释器从用户或文件中读取命令并执行,一般而言把他们转化成系统调用。它通常是不属于内核,因为命令解释会有所变动。用户能够利用由操作系统提供的系统调用接口开发新的命令解释器。这命令解释器允许用户创建、管理进程和确定它们通信的方法(例如通过管道和文件)。所有的功能都被用户程序通过系统调用来使用,这个也可能有用户开发一个新的命令行解释。