正如fucking real world,总有貌似搞不完的工作,浩瀚无际的信息向我们迎面而来。而我们的脑袋只有一个,无法多去处理那些纷繁的事务,需要进行规划和执行,可以像上班一样一天只做一件事,也可以像上学一样一天切换多节课。
计算机面临的问题与我们相同,只有一个处理器核心(多核大多也被抽象成单核来利于编程),所以前人们就需要用并行和同步这两个概念去应对处理现实的那些缤繁的问题
并行对于我们并不直观。我们大脑是一个非常精妙的系统,所采取的并行策略是一明一暗两条线,我们日常感知的明线是线性的,于是就和计算机中并行的概念冲突了,所以概念并不直观。时间这个概念亦是,所以对于问题我们先要在脑中抽象出这样一个这么一些概念,然后去映射到编程当中,这个过程由于反直觉,会产生一些常见的问题,例如竞争条件、死锁和活锁。
我们也并不孤独,处理并发思路构建与前人的智慧之上。根据系统层级,和实现方式,有三大类
- 基于进程
内核自动管理多个逻辑流
每个进程有其私有的地址空间(也就是说进程切换的时候需要保存和载入数据) - 基于事件
由程序员手动控制多个逻辑流
所有的逻辑流共享同一个地址空间
这个技术称为 I/O multiplexing - 基于线程
内核自动管理多个逻辑流
每个线程共享地址空间
属于基于进程和基于事件的混合体
用强大的逻辑和抽象把并行能够执行之后还有一个非常重要的问题,那就是数据的同步,并行任务逻辑往往会交织,所以需要一些方法去保证并行中数据的同步,主要有
- 共享变量
- 临界区 Critical Section
- 信号量
这个领域也有着两个经典的模版问题
- 生产者-消费者问题
- 读者-写者问题
给这个纷杂的世界一些假设和先验,世界的运行就变得有逻辑可循