1.1 从Hello World说起
介绍书本的目标读者
1.2 万变不离其宗
讨论范围:兼容x86的32位CPU的PC
介绍硬件方面的内容,略
1.3 站得高,望得远
层次鸟瞰
应用软件->运行库->操作系统->硬件
接口鸟瞰(对应)
- 应用程序编程接口(API)
- 系统调用接口(System call Interface)
- 硬件接口(硬件规格,Hardware Specification)
1.4 操作系统做什么
- 提供抽象接口
- 管理硬件资源
1.4.1 不要让CPU打盹
- 多道程序(Multiprogramming)
- 分时系统(Time-sharing System)
- 多任务系统(Multi-tasking)
- 抢占式(Preemptive)
1.4.2 设备驱动
关系
- 运行库和应用程序
- 请求统一接口
- 操作系统
- 提供统一接口(硬件驱动模块负责)
- 要求硬件符合接口和框架
- 硬件
- 根据被要求的接口和框架开发驱动
实例
- 以读取文件为例
- (应用程序)使用read系统调用
- (操作系统)文件系统判断位置,向硬盘驱动请求部分逻辑扇区的信息
- (硬件驱动)向硬盘发送命令(例如读写I/O端口寄存器)
1.5 内存不够怎么办
原始分配
- 地址空间不隔离,易改写其它程序数据,不安全
- 内存使用效率低,缺少有效内存管理,数据大量换入换出
- 运行地址不确定,分配的空间地址不确定,不便于编写程序
1.5.1 关于隔离
- 程序需要简单的执行环境,不介入复杂的存储器管理
1.5.2 分段
- 机制:把一段程序所需空间大小的虚拟空间映射到某个物理空间
- 操作系统:设置映射函数
- 硬件:完成地址转换
- 优点:地址隔离,物理地址透明
- 缺点:内存使用效率低
1.5.3 分页
- 机制
- 地址空间划分为固定大小的页
- 法一:页大小由硬件决定
- 法二:页大小由操作系统决定,硬件支持多种大小(同一时刻,大小固定)
- 虚拟地址划分后,得到虚拟页(VP,Virtual Page)
- 常用数据和代码装入内存,不常用的装入磁盘
- 物理内存中的页是物理页(PP,Physical Page),页的所在空间决定
- 磁盘中的页是磁盘页(DP,Disk Page),页的所在空间决定
- 地址空间划分为固定大小的页
- 页错误
- 过程
- 硬件捕获
- 操作系统接管
- 读出DP装入内存
- 内存页和VP建立映射
- 效果
- 地址隔离
- 内存使用率提升
- 物理地址透明
- 过程
- MMU(Memory Management Unit)
- 效果:转换地址
- 位置:一般集成在CPU
1.6 众人拾柴火焰高
1.6.1 线程基础
- 线程
- 亦称轻量级进程(Lightweight Process,LWP)
- 程序执行流最小单位
- 多线程优势
- 利用等待时间
- 避免因计算时间长而未响应
- 逻辑要求并发
- 充分利用CPU
- 数据共享高效
- 线程访问权限
- 私有的
- 局部变量
- 线程局部存储(Thread Local Storage,TLS)
- 函数传入参数
- 私有的
- 线程调度与优先级
- 线程调度:在处理器上切换不同的线程的行为
- 时间片:线程可执行的时间
- 调度算法
- 优先级调度
- 轮转法
- 设置线程优先级
- Windows:SetThreadPriority函数
- Linux:pthread库
- IO密集型线程
- CPU密集型线程
- 饿死
- 优先级改变
- 用户指定
- 等待的频繁程度
- 饿死
- 可抢占线程和不可抢占线程
- 抢占:用尽时间片就剥夺继续执行的权力
- Windows实现
- 标准,有明确API
- Linux实现
- 贫乏,把执行实体都称为任务(Task)
- 方法
- fork:复制当前进程
- 本任务返回新任务pid,新任务返回0
- 共享一个写时复制(Copy on Write,COW)
- exec:使用新可执行映像覆盖当前可执行映像
- clone:创建子进程,从指定位置开始执行
- fork:复制当前进程
- 使用
- 产生新任务
- fork创建一个新任务,新任务调用exec执行新的可执行文件
- 产生新线程
- clone产生一个可以共享当前内存空间和文件等的任务(实际就是线程)
- 产生新任务
1.6.2 线程安全
- 原子操作
- API支持,如Interlocked API
- 同步与锁
- 同步:一个线程访问数据未结束,其它线程不得访问该数据
- 锁:访问时获取锁,访问后释放锁
- 二元信号量
- 适合只能被唯一一个线程独占的资源
- 别人可以代替释放
- 多元信号量(简称信号量)
- 允许多个线程并发访问
- 别人可以代替释放
- 互斥量
- 适合只能被唯一一个线程独占的资源
- 别人不能代替释放
- 临界区
- 只可被本进程使用,其他进程无法获取
- 适合只能被唯一一个线程独占的资源
- 别人不能代替释放
- 读写锁
- 专用于:读取频繁但是偶尔写入
- 前面的方法此时效率太低,因为不允许共同读取
- 获取方式
- 共享
- 独占
- 状态
- 自由:共享和独占都行
- 共享:只能以共享方式获取该锁
- 独占:不能获取该锁
- 专用于:读取频繁但是偶尔写入
- 条件变量
- 操作
- 等待:线程等待这个条件变量,可能多个线程都在等待
- 唤醒:所有等待这个条件变量的线程都被唤醒
- 作用
- 让许多线程一起等待某个事件的发生
- 操作
- 二元信号量
- 可重入
- 表示函数没有执行完成,又一次进入该函数执行
- 情况
- 多个线程同时执行
- 函数自身(可能多层调用后)调用自身
- 特点
- 不使用函数外的静态或全局非const变量
- 不返回静态或全局非const变量指针
- 仅依赖调用方提供的参数
- 不依赖单个资源的锁
- 不调用不可重入的函数
- 过度优化
- 使用volatile关键字阻止过度优化
- 无法阻止CPU动态调度换序
- barrier指令
- 阻止CPU将该指令前的指令交换到barrier之后
- 使用volatile关键字阻止过度优化
1.6.3 多线程内部情况
- 内核提供线程支持
- 内核线程由多处理器或调度实现并发
- 三种模型
- 一对一模型
- 用户线程和内核线程一一对应
- 一般使用API或系统调用创建的均为一对一的线程
- 多对一模型
- 将多个用户线程映射到一个内核线程
- 优点
- 上下文切换快速
- 线程数量几乎无限制
- 缺点
- 一个用户线程阻塞,则其它线程无法进行
- 多对多模型
- 多个用户线程映射到少数但不止一个内核线程上
- 结合前两者优点
- 一对一模型
1.7 本章小结
回顾了软硬件基本结构,如CPU和外围部件的连接,SMP和多核,软硬件层次结构,如何利用CPU与设备驱动,操作系统,虚拟空间,物理空间,页映射,线程等概念
标签:温故而知新,操作系统,接口,硬件,程序员,修养,线程,内存,CPU From: https://www.cnblogs.com/Carykd/p/17483086.html