多处理器时代:单线程变成多线程(并发场景)
单处理器多线程下也能并发,那么多处理器的复杂点。。。。。
并发:有两个人同时做一件事情,不管是并发进程还是并发线程。
并发是一段时间内有多个任务,并行是同一时间点有多个任务。
并发会导致每个人做的事情的完成先后顺序啥的不同。
操作系统是最早的并发程序之一。
实现多处理器的malloc/free
并发的基本单位:线程
执行流拥有独立的堆栈/寄存器
共享全部的内部
从状态机视角将单线程拓展成多线程
单线程:局部代表一个单线程,全局变量和其他东西代表共享的内容
多线程并发状态
并发程序的每一步都是不确定的
create:在状态机中加入一个栈帧的链表
join:等待,等所有线程完成时再返回,否则死循环
操作系统会自动把线程放置在不同的处理器上
在后台运行,可以看到CPU使用率超过了100%
如何证明线程确实会共享内存?
线程有着独立的堆栈。
多线程并发问题存在
(1)原子性
两个线程对一个事件操作,会导致BUG
两个线程同时支付100元,跟数据库中的原子性类似,会导致并发问题,余额有可能出现2^64-100,计算机内2的补码-100.
lock,unlock保证原子性,可以阻止线程并发
(2)顺序性
编译器对内存访问“eventually consistent”的处理导致共享内存作为线程同步工具的失效
(3)可见性(最大的麻烦)理解并发程序的执行
多处理器编程:放弃对“程序”的旧理解
不原子,能乱序,不立即可见