本文简介
1 操作系统概述
1.1 什么是操作系统
- 操作系统帮助用户和应用程序管理和使用计算机资源
- 向上给应用程序提供服务
- 向下管理硬件和外设
- 操作系统是应用程序的软件执行环境
1.2 操作系统的发展历史
- 寒武纪
- 1946年出现计算机,由操作员管理和操作机器
- 装卡片
- 装纸带
- 扳开关
- 编译器出现
- 把程序语言翻译成机器码
- 50年代初
- 计算机每次执行一个任务
- CPU等待操作员的缓慢操作
- 出现了监控程序,自动完成
- 输入、输出
- 加载、运行程序
- 操作系统雏形
- 寒武纪三叶虫
我国在1958年开发了104计算机,可以自检、标准子程序库、自动更换地址
- 1946年出现计算机,由操作员管理和操作机器
- 泥盆纪鱼类时代和二叠纪两栖动物时代
- 50~60年代,OS从手工操作和监控程序进化到了“批处理”和“多道程序”
- 批处理
- 一批作业连续处理
- 单道处理
- OS只能管理内存中的一个作业
- 多道处理
- OS只能管理内存中的多个作业
- 允许把多个程序装入内存
- 可以交替在CPU中运行
- 处理器共享需要对程序隔离,防止一个程序崩溃涉及其他程序
- 批处理
- 50~60年代,OS从手工操作和监控程序进化到了“批处理”和“多道程序”
- 侏罗纪与白垩纪的恐龙时代
- 1961年出现兼容时间共享系统
- 多个用户在同一时间使用同一台电脑
- 多人多任务的操作系统
- 贝尔实验室以C语言为基础开发了小巧灵活的Unix操作系统
- 早期版本开放免费,广泛应用
- 成为小型机操作系统的起点
- 成为分时操作系统的典范
- 始祖鸟
- 1961年出现兼容时间共享系统
- 古近纪哺乳动物时代
- 70年代出现了个人PC
- DOS
- Windows
- 第一个带 GUI 界面的个人计算机原型
- PARC
- 带有图标、弹出式菜单和重叠窗口的图形交互界面GUI
- 使用鼠标
- 古近纪的哺乳动物
- 70年代出现了个人PC
- 第四纪智人时代
- 21世纪,Inter网和移动互联网
- 服务器领域
- 个人终端
- 数据中心
- 各类操作系统
- 面向服务的OS - Linux
- 超大吞吐量
- 安全、可靠
- 虚拟机:虚拟出多台计算机
- 面向个人的操作系统
- Windows
- Linux
- Chrome OS
- 面向智能终端
- iOS
- Android
- 嵌入式操作系统
- RT-Thread
- SylixOS
- LiteOS
- Linux是第四纪出现的智人
- 面向服务的OS - Linux
- 21世纪,Inter网和移动互联网
- 二十一世纪神人时代
- 大数据、人工智能、机器学习、高速移动互联网络、AR/VR 对操作系统等系统软件带来了新的挑战
- 有效支持和利用这些技术是未来操作系统的方向
- 与人工智能充分融合,并分布式特征的操作系统即将到来
- 打通从数据中心、服务器、桌面、移动端、边缘设备等的整个 AI 和物联网 (IoT, Internet of Things) 的生态
1.3 操作系统的系统调用接口
- 操作系统的接口形式就是应用程序二进制接口ABI
- 操作系统不能只提供面向单一编程语言的函数库的编程接口 (API, Application Programming Interface)
- 它的接口需要考虑对基于各种编程语言的应用支持,以及访问安全等因素,使得应用软件不能像访问函数库一样的直接访问操作系统内部函数,更不能直接读写操作系统内部的地址空间。
- 为此,操作系统设计了一套安全可靠的接口,我们称为系统调用接口 (System Call Interface)。
- 系统调用接口通常面向应用程序提供了API的描述,但在具体实现上,还需要提供ABI的接口描述规范。
API 与 ABI 的区别
应用程序二进制接口 ABI 是不同二进制代码片段的连接纽带。ABI 定义了二进制机器代码级别的规则,主要包括基本数据类型、通用寄存器的使用、参数的传递规则、以及堆栈的使用等等。ABI 与处理器和内存地址等硬件架构相关,是用来约束链接器 (Linker) 和汇编器 (Assembler) 的。在同一处理器下,基于不同高级语言编写的应用程序、库和操作系统,如果遵循同样的 ABI 定义,那么它们就能正确链接和执行。 应用程序编程接口 API 是不同源代码片段的连接纽带。API 定义了一个源码级(如 C 语言)函数的参数,参数的类型,函数的返回值等。因此 API 是用来约束编译器 (Compiler) 的:一个 API 是给编译器的一些指令,它规定了源代码可以做以及不可以做哪些事。API 与编程语言相关,如 libc 是基于 C 语言编写的标准库,那么基于 C 的应用程序就可以通过编译器建立与 libc 的联系,并能在运行中正确访问 libc 中的函数。
-
系统调用接口为应用程序提供的值得了解的功能列表:
功能 说明 与程序的关系 - 一个运行的程序可以创建另一个程序的实例吗?
- 需要等待另外一个程序执行完成吗?
- 操作系统能停止或恢复另一个正在运行的程序吗?通讯 - 一个运行的程序如何与连接到计算机的设备通信并通过它们与物理世界通信? 资源 - 多个运行的程序如何同步互斥地对共享资源进行访问?
- 一个运行的程序可以要求更多(或更少)的内存空间吗?输入输出 - 一个运行的程序如何持久地存储用户数据?
- 一个运行的程序如何能输出字符信息?
- 如何能获得输入字符信息? -
比较重要的操作系统接口或抽象
功能 说明 进程(即程序运行过程)管理 复制创建进程 fork
退出进程 exit
执行进程 exec 等线程管理 - 线程(即程序的一个执行流)的创建、执行、调度切换等。
- 线程同步互斥的并发控制
- 互斥锁 mutex
- 信号量 semaphore
- 管程 monitor
- 条件变量 condition variable 等。进程间通信 - 管道 pipe
- 信号 signal
- 事件 event 等虚存管理 - 内存空间映射 mmap
- 改变数据段地址空间大小 sbrk
- 共享内存 shm 等文件I/O操作 - 对存储设备中的文件进行读 read 、写 write 、打开 open 、关闭 close 等操作 外设I/O操作 - 外设包括键盘、显示器、串口、磁盘、时钟 … 但接口均采用了文件 I/O 操作的通用系统调用接口。 -
操作系统对计算机硬件重要组成的抽象和虚拟化
- 文件 (File) 是外设的一种抽象和虚拟化。特别对于存储外设而言,文件是持久存储的抽象。
- 地址空间 (Address Space) 是对内存的抽象和虚拟化。
- 进程 (Process) 是对计算机资源的抽象和虚拟化。而其中最核心的部分是对CPU的抽象与虚拟化
1.4 操作系统抽象
1.4.1 执行环境
- 执行环境给软件提供资源
- 直接运行在裸机硬件 (Bare-Metal) 上的操作系统,其执行环境是计算机的硬件
- 函数库 -> 计算机硬件
- 函数库 -> 操作系统内核 -> 计算机硬件
- 函数库 -> Java 虚拟机 -> 操作系统内核 -> 计算机硬件
- 函数库 -> Java 虚拟机 -> 操作系统内核 -> Hypervisor/VMM -> 计算机硬件
1.4.2 普通控制流
程序的控制流 (Flow of Control or Control Flow) 是指以一个程序的指令、语句或基本块为单位的执行序列。程序运行时能以多种简单的控制流(顺序、分支、循环结构和多层嵌套函数调用)组合的方式,来一行一行的执行源代码(以编程语言级的视角),也是一条一条的执行汇编指令(以汇编语言级的视角)。对于上述的不同描述,我们可以统称其为 普通控制流 (CCF,Common Control Flow,简称 控制流)
1.4.3 异常控制流
控制流脱离了其所在的执行环境,并产生执行环境的切换。 我们把这种“突变”的控制流称为异常控制流 (ECF, Exceptional Control Flow) 。
1.4.4 控制流上下文(执行环境的状态)
控制流在执行完某指令时的物理资源内容,即确保下一时刻能继续正确执行控制流指令的物理资源内容称为控制流的上下文(Context) ,也可称为控制流所在执行环境的状态
- 如果一个控制流属于某个函数,那么这个控制流的上下文简称为函数调用上下文
- 如果一个控制流属于某个应用程序,那么这个控制流的上下文简称为应用程序上下文
1.4.5 异常控制流
- 中断
- 外设 中断 (Interrupt) 由外部设备引起的外部 I/O 事件如时钟中断、控制台中断等
- 产生中断后,操作系统需要进行中断处理来响应中断请求,这会破坏被打断前应用程序的控制流上下文,所以操作系统要保存与恢复被打断前应用程序的控制流上下文。
- 异常
- 处理器执行指令期间检测到不正常的或非法的内部事件(如除零错、地址访问越界)
- 陷入
- 程序中使用请求操作系统服务的系统调用而引发的有意事件。
1.5 进程
- 进程 (Process)
- 一个正在运行的程序实例
- 站在计算机系统和操作系统的角度来看,进程是应用程序的一次执行过程。