并发 - 草稿

用户头像
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 加入

还未添加个人简介

评论

发布
暂无评论
并发-草稿