并发意味着程序在运行时有多个执行上下文,对应着多个调用栈。
- cpu时间轮片调度算法
MMU
MMU是虚拟内存管理单元(位于cpu内部的一个硬件)
- 所有程序使用的是虚拟地址
- 物理地址无法直接使用
- mmu映射的最小单位是4kb
并发包含以下几个主流的实现模型:
- 多进程
- pcb:进程控制块
- 独立的进程地址空间,安全性更好。
- 进程是最小的系统资源分配单元,拥有独立的进程地址空间。
- 初始态、就绪态、运行态、挂起态(等待cpu以外的其他资源,主动让出cpu)、停止态
- 僵尸进程是子进程结束,父进程还没有回收子进程期间,子进程属于僵尸进程。
- 孤儿进程是父进程先于子进程结束,子进程归属init来回收。
- 多线程
- 节省内存空间
- 线程是最小的执行单位
- 进程创建线程后,共用进程地址空间。原有进程变成线程。
- 基于回调的非阻塞/异步IO
- 协程
- 程序中有大量阻塞场景时,可以充分利用cpu
- 较线程更轻量级,节省了函数栈帧调度、内核空间和用户空间切换系统资源的开销。
在工程上,有两种最常见的并发通信模型:共享数据和消息
同步
-
同步的必要性:当多个控制流(线程、进程)同时访问同一个共享资源时,需要加同步机制。防止发生与时间有关的错误。
-
同步的方法:
- 添加锁机制,协调多个控制流。
- 操作系统提供给线程同步使用的所有锁,均为建议锁,不具有强制性
- golang中有互斥锁Mutex
- golang中有读写锁RWMutex