写点什么

并发 - 草稿

用户头像
superman
关注
发布于: 2020 年 08 月 05 日

并发专题总结

 

目的:

主要处理问题:

    

     线程间协调:共享资源读写,线程间同步。

     线程资源:启动多个线程执行,线程生命周期控制,线程本身资源的控制,线程重用。

 

共享资源修改

    加锁,原子修改 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:

 

=======================================================================

 

编程语言发展的逻辑:越来越高级,程序员控制的东西越来越少。

====

 

====

 

用户头像

superman

关注

还未添加个人签名 2018.07.20 加入

还未添加个人简介

评论

发布
暂无评论
并发-草稿