乐趣区

操作系统实战

操作系统实战

临界资源

保护临界资源 / 进行通信

  • 线程间同步
  • 互斥量和 读写锁 自旋锁 条件变量
  • 进程间同步
  • 共享内存 域套接字

重要概念

  • 用户态与内核态
  • 上下文切换
  • 协程

线程同步之互斥量

互斥量()可以保证多线程的指令按顺序执行,避免两个线程的指令交叉执行(即 原子性

  • 原子性是指一系列操作指令不可被中断执行,要么全部执行,要么全部没有执行,不存在部分执行的情况
  • 互斥量是最简单的线程同步的方法
  • 互斥量(互斥锁)是处于两态之一的变量:解锁 加锁
  • 两个状态可以保证资源访问的串行

操作系统直接提供了互斥量的 API,可使用 API 完成资源的加锁,解锁的操作

pthread_mutex_t

线程同步之自旋锁

  • 自旋转也是一种多线程同步的变量
  • 使用自旋转的线程会反复检查锁的变量是否可用
  • 自旋转不会让出 CPU,是一种 忙等待 的状态(死循环等待锁被释放)
自旋锁避免了进程或线程的 ** 上下文切换 ** 的开销

操作系统内部很多地方使用的是自旋锁
自旋锁不适合在单核 CPU 使用

pthread_spinlock_t

线程同步之读写锁

当临界资源属于 多读少写 的情况,可以采用效率更高的同步方法: 读写锁 读多写少场景相比互斥量性能提出几倍

  • 读写锁是一种特殊的 自旋锁
  • 允许多个读者同时访问资源以提高读性能(读 不改变临界资源的值)
  • 对于写操作则是 互斥 的

pthread_rwlock_t
pthread_relock_rdlock
pthread_rwlock_wrlock

线程同步之条件变量

在生产消费场景中面临以下情况
1 缓冲区小于 0 时,不允许消费者消费,消费者必须 等待
2 缓冲区满时,不允许生产者往缓冲区生产,生产者必须 等待
当生产者生产一个产品时,唤醒 可能等待的消费者
当消费者消费一个产品时,唤醒 可能等待的生产者

pthread_cond_t 配合 互斥量(锁)使用
pthread_cond_wait
pthread_cond_signal

  • 条件变量是一种相对复杂的线程同步方法
  • 条件变量允许线程睡眠,直到满足某种条件
  • 当满足条件时,可以向该线程信号,通知唤醒

线程同步方法总结

1 互斥锁 最简单的线程同步方法,会 阻塞线程
2 自旋锁 避免 上下文切换 的一种线程同步方法,属性 忙等待 CPU
3 读写锁 为 多读少写 的资源设计的线程同步方法,显著提高性能
4 条件变量 相对复杂的多线程同步方法,配合互斥量,更灵活的使用场景

使用 fork 系统调用创建进程

java python 等语言底层也是通过 fork 创建进程

  • fork 系统调用是用于创建进程的
  • fork 创建的进程初始状态与父进程一样
  • 系统会为 fork 的进程分配新的资源
  • fork 系统调用无参数 fork 会返回两次,分别是 子进程 id0

进程同步之共享内存

进程的线程共享进程资源,理论上进程之间由于操作系统的进程管理机制(进程 - 页表 - 物理内存),进程间的内存空间是相互独立的,(进程默认是不能访问进程空间之外的内存空间)但进程可以通过 共享内存 打破这样的限制

  • 共享存储允许不相关的进程访问同一片物理内存
  • 共享存储是两个进程之间共享和传递数据最快的一种方式
  • 共享内存 未提供同步机制,需要借助其他机制管理访问

共内存是高性能后台开发中最常用的进程同步方式

共享内存实现流程

1 申请共享内存
2 连接到进程空间
3 使用共享内存
4 脱离进程空间 & 删除

退出移动版