《程序员的自我修养》- 第一章 - 温故而知新 - 笔记

发布时间 2023-06-15 15:47:23作者: Carykd

1.1 从Hello World说起

介绍书本的目标读者

1.2 万变不离其宗

讨论范围:兼容x8632位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创建一个新任务,新任务调用exec执行新的可执行文件
        • 产生新线程
          • clone产生一个可以共享当前内存空间文件等的任务实际就是线程

1.6.2 线程安全

  • 原子操作
    • API支持,如Interlocked API
  • 同步
    • 同步:一个线程访问数据未结束,其它线程不得访问该数据
    • :访问时获取锁,访问后释放
      • 二元信号量
        • 适合只能被唯一一个线程独占资源
        • 别人可以代替释放
      • 多元信号量(简称信号量
        • 允许多个线程并发访问
        • 别人可以代替释放
      • 互斥量
        • 适合只能被唯一一个线程独占资源
        • 别人不能代替释放
      • 临界区
        • 只可本进程使用,其他进程无法获取
        • 适合只能被唯一一个线程独占资源
        • 别人不能代替释放
      • 读写锁
        • 专用于:读取频繁但是偶尔写入
          • 前面的方法此时效率太低,因为不允许共同读取
        • 获取方式
          • 共享
          • 独占
        • 状态
          • 自由:共享和独占都行
          • 共享:只能以共享方式获取该锁
          • 独占:不能获取该锁
      • 条件变量
        • 操作
          • 等待:线程等待这个条件变量可能多个线程都在等待
          • 唤醒:所有等待这个条件变量线程都被唤醒
        • 作用
          • 让许多线程一起等待某个事件的发生
  • 可重入
    • 表示函数没有执行完成,一次进入该函数执行
    • 情况
      • 多个线程同时执行
      • 函数自身(可能多层调用后)调用自身
    • 特点
      • 不使用函数外的静态或全局非const变量
      • 不返回静态或全局非const变量指针
      • 仅依赖调用方提供的参数
      • 不依赖单个资源的锁
      • 不调用不可重入的函数
  • 过度优化
    • 使用volatile关键字阻止过度优化
      • 无法阻止CPU动态调度换序
    • barrier指令
      • 阻止CPU将该指令前的指令交换到barrier之后

1.6.3 多线程内部情况

  • 内核提供线程支持
    • 内核线程由多处理器或调度实现并发
  • 三种模型
    • 一对一模型
      • 用户线程和内核线程一一对应
      • 一般使用API系统调用创建的均为一对一的线程
    • 多对一模型
      • 多个用户线程映射到一个内核线程
      • 优点
        • 上下文切换快
        • 线程数量几乎无限
      • 缺点
        • 一个用户线程阻塞,则其它线程无法进行
    • 多对多模型
      • 多个用户线程映射到少数但不止一个内核线程
      • 结合前两者优点

1.7 本章小结

回顾了软硬件基本结构,如CPU和外围部件的连接,SMP和多核,软硬件层次结构,如何利用CPU与设备驱动,操作系统,虚拟空间,物理空间,页映射,线程等概念