并发 - 草稿
并发专题总结
目的:
主要处理问题:
线程间协调:共享资源读写,线程间同步。
线程资源:启动多个线程执行,线程生命周期控制,线程本身资源的控制,线程重用。
共享资源修改
加锁,原子修改 CAS,
各种锁:优化控制粒度
线程同步:
阻塞,唤醒。
锁升级:偏向锁,轻量级锁,重量级锁。
java:notify,wait, park,unpark
线程生命周期控制
linux:内核线程与用户线程。
应用:
重用:线程池
线程数:合理的线程数:cpu 核心数*(1/(1-io 处理占比))
线程本身是一个资源。线程过多系统会奔溃。//go 把线程拿掉。用有限线程执行。全局线程池。
=====
从要解决的问题本身出发
---解决方案--》具体技术上的 api.
--解决方案本身的特点:优缺。适用条件。
解决方案本身也在进化:相同语言,不同语言,框架都在进化中。
====
复习 java 多线程
go 多线程比对。
os 的线程,锁等控制
并发编程基础支持-os。
第一层:
硬件多核:提供并行能力,给并发也带来问题。
os 封装调度机制:
进程,线程都是 os 封装的逻辑,硬件 cpu 只认地址与指令。
进程环境:内存,进程结构
线程:堆栈,结构。
os 支持 cpu 的分片,来轮动调度不同的进程与线程。
os 对线程支持 api:控制线程--创建,销毁,唤起,阻塞。资源锁定。cas 修改。
并发编程问题与方案:
问题,方案,方案评价,方案落地:java,go
=====
高级方案:协程。
==========
os:线程切换。
os 切换:
将 cpu 调到某个线程的堆栈上执行。
====Go 并发==
协程
go:
G,P,M
P:维护一个任务队列,默认 cpu 核数个 P
G: go runtine, 看做一个任务。函数堆栈+上下文信息
M:OS 线程。
分配过程:
go goruntie ,将 G 访问某个 P 的队列
P:有一个执行 M
M:从 P 的任务队列取,执行,执行完,继续去。
P 队列的偷:M 将归属的 P 的队列执行完了,从其他 P 偷取一般给本 P.继续执行。
因此:类比:P 就是一个线程池,默认一个线程,阻塞时可以添加多个线程。
G:Task
M:线程。
优化:线程池的队列可以偷取。
M 执行时如果阻塞,会给当前 P 分配一个新的 M. P_M=1:N
M 空闲多余在销毁。
编程接口上隐藏了线程概念。编程简单了,线程的控制权上交了。类似 java 与 c++比,接管了内存释放。
go 并发的通道 chan 与线程协调。
线程间通信用队列,替代了共享资源。
不进行并发的修改。用消息队列的模式替代共享资源。
http 压力测试代码
chan 作为结果的相互处理。
chan 也可以作为相互的通知模式--ready
也有共享变量:
如果全局的 result 需要多个线程读:用锁。
线程协调:等待组。--chan 作为协调。
context:
=======================================================================
编程语言发展的逻辑:越来越高级,程序员控制的东西越来越少。
====
====
评论