并发的三种模式
- 进程: 每个逻辑控制流都一个进程,由内核进行调度和维护.因为进程有独立的虚拟地址空间,和其他进程通信,必须使用进程间通信的方式(IPC)
- I/O多路复用: 应用程序在一个进程的上下文中显示的调度它的逻辑流。数据到达文件描述符后,主程序显示从一个状态切换到另外一个状态。因为主程序是一个单独的进程,所有的流都共享一个地址空间
- 线程:线程是运行在一个单一进程上下文中的逻辑流,由内核进行调度,相当于像进程流一个由内核进行调度,想I/O多路复用一样共享一个虚拟地址
进程并发
- 优点: 使用进程并发,逻辑非常清晰,共享文件表,但是不共享用户地址空间.一个进程不可能不小心覆盖另一个进程的虚拟地址。
- 缺点: 独立的地址空间使得进程共享状态变得非常困难.为了共享信息,必须显示的使用IPC机制,进程的创建和销毁都非常耗时
多路复用I/O
- 优点: 基于I/O多路复用的事件驱动服务器是运行在单一进程的上下文中的,每个逻辑流都可以访问进程的全部地址空间.使用流之间共享数据变得很容易
- 缺点: 编码复杂,随着并发颗粒度的减小,复杂度还会上升。
基于线程的并发编程
同进程一致
线程内存模型
- 全局变量: 虚拟内存的读/写区域只包含每个全局变量的一个实例,任何线程都可以引用
- 本地变量: 每个线程栈都包含它自己的的所有本地变量的实力.即使多个线程执行同一个线程例程也是如此
- 本地静态变量: 同全局变量一致
线程同步
- 使用信号量
- 使用锁
参考视频
- CMU教授的视频教程 - Lecture23:并发编程
- CMU教授的视频教程 - Lecture24:同步(基础)
- CMU教授的视频教程 - Lecture25:同步(进阶)
- CMU教授的视频教程 - Lecture26:线程级并行
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。