操作系统概述
1 什么是操作系统
没有一个完整、精确、公认的定义
是系统软件
- 用户角度上,os是一个控制软件
- 管理应用程序
- 为应用程序提供服务
- 杀死应用程序
- 资源管理
- 管理外设、分配资源
操作系统层次架构 - 应用程序之下
- 硬件之上
应用软件:办公软件、视频播放软件
- 操作系统位于应用软件之下,为应用软件提供服务支撑
shell : 对外接口等
kernel:操作系统内部组件:
- CPU调度器
- 物理内存管理
- 虚拟内存管理
- 文件系统管理
- 中断处理与设备驱动(和底层硬件直接打交道)
OS kernel的特征:
- 并发(一个时间段,多个CPU)
- 计算机系统中同时存在多个运行的程序,需要OS管理和调度
- 共享
- “同时”访问
- 互斥共享
- 虚拟
- 利用多道程序设计技术,让每个用户都觉得有一个计算机专门为他服务
- 异步
- 程序的执行不是一贯到底,而是走走停停,向前推挤的速度不可预知
- 但只要运行环境相同,OS需要保证程序运行的结果也要相同
2 为什么学习操作系统
3 如何学习操作系统
4 操作系统实例
unix(apple)、linux(android\windows)
5 操作系统的历史
随着硬件、计算机体系结构等变化
- 早期计算机使用纸带传输程序和数据
操作系统只起到加载作用
数据传到计算机上去,再传出来(机械简单的过程) - CPU等硬件快速发展,计算机速度得到提升,性能未得到充分利用
- 批处理阶段(并发)
- 内存的容量越来越大、CPU执行多个程序(多道程序设计,1个CPU)
- 为了更好的利用计算机资源,并且更好的和用户交互,出现了分时系统(把时间分为很小的一段,人感知不到,中断帮助os实现分时)
- 个人电脑操作系统
- 网络的快速发展,出现了分布式操作系统(计算存储工作通过数据中心来完成,中间通过internet来连接在一起)
- 未来发展趋势:多台计算机围绕1个人工作
6 操作系统的结构
汇编语言与机器绑定,不具移植性
C语言有移植性
-
简单操作系统:MS-DOS(1981-1994)
- 部分模块的单体内核
- 功能比较弱
- 易受攻击、破环
- 受制于硬件
-
Unix ,采用C语言
-
微内核的设计,尽可能把内核功能移到用户空间,内核中只放基本的,松耦合,但如果文件管理和内存管理交互要通过内核,性能不高
-
学术界还有一种更极端的方式——外核。把内核分为2部分,一部分跟硬件打交道完成硬件资源的复制;一部分与具体应用打交道,在第一部分之上。速度得到提高
-
虚拟机监控器(VMM):将单独的机器接口转换成很多的幻象,每个这些接口(虚拟机)是一个原始计算机系统的有效副本,并完成所有的处理器指令(虚拟出n个计算机系统(完整的计算机),使得在一台物理计算机上有多台的计算机系统给上曾使用,一台变多台)
操作系统之下是vmm,vmm之下才是硬件
7 启动、中断、异常和系统调用
7.1 计算机启动
开机主要是开上面3个
os最开始放在os,不在内存
DISK:存放os
BIOS:基于I/O处理系统(按电源后检测各种外设,去加载相应的软件执行)
- 第一步从特定的地址开始执行
- POST(加电自检)
- 寻找显卡(屏幕)和执行BIOS(键盘鼠标)
- 把Bootloader(加载os)从硬盘放到内存中去,最初在在硬盘的第一个主引导扇区
第1个扇区为512个字节
7.2 操作系统与设备和程序交互(中断异常系统调度)
面向外设通过中断和IO进行处理
面向应用程序通过系统调用和异常来启动相应的功能
定义:
- 系统调用(来源于应用程序)
应用程序主动向操作系统发出服务请求(应用程序向操作系统发送指令) - 异常(来源于不良的应用程序)
非法指令或其他换的处理状态(如内存出错)(应用程序在执行过程中出现异常,需os来完成相应的功能) - 中断(来源于外设)
来自不同的硬件设备的计时器和网络的中断
应用程序为什么要通过os与硬件联系?
- 在计算机运行中,内核是被信任的第三方(应用程序不可信任,os可信任)
- 只有内核可以执行特权指令
- 为了方便应用程序(os使得应用软件屏蔽底层的device,os向上提供一个简洁的接口,使应用软件更具移植性)
中断异常系统调用的差异
- 源头:
- 中断:外设
- 异常:应用程序意想不到的行为(访问了不该访问的地址空间;资源未得到满足,但os悄悄准备好了)
- 系统调用:应用程序请求操作提供服务(读写文件)
- 处理时间
- 中断:异步 (应用程序不知道导致中断的事件什么时候产生)
- 异常:同步(除0就会产生异常)
- 系统调用:同步(发出请求是同步的)或异步(返回是可能是同步也可能异步。应用程序发出请求后马上去做其他事情,返回就是异步的;发出请求后等待就是同步的)
- 响应状态
- 中断:持续,对用户应用程序是透明的
- 异常:杀死或重新执行意想不到的应用程序指令
- 系统调用:等待和持续后继续执行
中断和异常处理机制
- 中断是外设的事件
- 异常是内部CPU的事件
- 中断和异常迫使CPU访问一些被中断和异常服务访问的功能
中断
-
硬件:
- 设置中断标记(CPU初始化)
- 将内部外部事件设置中断标记
- 中断事件的ID
中断事件的ID值程序访问的中断向量地址
中断就是打断了正在执行的程序去执行更为紧急的事件,对此需要对硬件和软件进行一定的保护(保存和恢复机制),以此保障处理完中断后还能继续执行原来的程序
- 设置中断标记(CPU初始化)
-
软件:
- 保存当前处理状态
- 中断服务程序处理
- 清除终端标记
- 恢复之前保存的处理状态
异常:异常编号
- 保存现场
- 异常处理
- 杀死产生了异常的程序
- 重新执行异常指令(os进行弥补工作,处理异常)
- 恢复现场
软件系统感知不到异常,不知道什么时候会异常
系统调用
应用程序调用printf(),会出发系统调用write()
- 程序访问主要是通过高层次的API接口而不是直接继续进行系统调用
用户态:os运行过程中CPU所处的一个状态,只能执行部分指令(机器指令、访问IO)
内核态:os运行过程中CPU所处的一个状态,能执行所有指令(特权,IO。。。)
当系统调用时,会实现从用户态到内核态的转变,控制权从应用程序交到os,os可以对发出的系统调用做出标识识别,以完成具体的服务
应用程序发出: - 函数调用,在一个栈空间内实现参数的传递和返回
- 系统调用,os和应用程序有各自的堆栈,切换堆栈转换状态都需要开销,开销的回报就是安全可靠
验证参数是说,os不信任应用软件,要进行验证
开销是值得的必须的