多线程随笔

多线程随笔——什么是多线程?

多线程是比较难理解的编程技术之一。多年来我一直想深入理解,往往事与愿违。好在一直坚持去理解,日积月累有些收获。接下来在一系列随笔中,介绍自己的心得,与大家共勉,有不对的地方,可以给我发邮件11626088@qq.com,不甚感激。

谈及多线程,有太多的高频词汇:单线程(single thread)、多线程(multi-thread)、 同时(concurrent)、并行(parallel)、同步(sync)、异步(async)、锁(lock)等等。为了不孤立看待这些词汇,得理解这些词汇的内涵,更重要的是它们的外延。

这个小节,我从更高的抽象层次,说说什么是多线程。

多线程是有限资源的高效利用。这样的模型在现实生活中比比皆是:比如餐厅的翻牌率,餐桌的数量固定,翻牌率越高,接待的顾客量就越多;酒店的入住率,酒店的房间数固定,入住率越高,入住的客人就越多;车流量,道路的车道以及出口固定,合理安排车辆出行,车流量得到提升,就能通行更多的车辆;货物吞吐量,港口物理资源固定,吞吐量越高,港口资源就得以高效利用,就能收到而且发出更多的货物;河道的航运能力,河道水量固定,合理安排船只航行,就能提升航运,通行更多船只;铁路输送能力,铁轨固定,在合理安排下,输送能力提高,物运输量就越大。综合来看,有两个关注点:一是资源有限,二是高效利用。资源有限好理解,高效利用稍微难理解。其实高效利用或者说合理利用,说白了,就是某种算法。想想,上面例举的例子,通过提高算法,就能高效合理利用资源。

在计算机领域,多线程就是有限资源的高效利用。计算机的有限资源是指CPU和内存,CPU和内存的高效利用,离不开算法。算法会贯穿一系列随笔讲解,我们先来理清楚计算机的资源。
计算机资源分两种,一种是过程(process),一种是存储(memory)。过程是动态的,跟计算有关,以时间为维度,随着时间的流逝,过程就减少。比如CPU处理、河道的航运、高速路承载的车流,随着时间的流逝,它们的处理能力就减少。存储是静态的,不参与处理,跟计算无关,比如内存、码头、车位等,它们不直接参与计算,只是存储计算的结果或为计算提高数据。

如何高效利用这些有限的资源呢,聪明的人类通过时间切片来实现,在时刻T1,CPU给A1使用,在时刻T2,CPU给A2使用,在时刻T3,CPU给A3使用,……。正如在时刻T1,B处公路可供A1车辆使用,在时刻T2,A1已经驶离,A2车辆可以驶入B处,在时刻T3,A2车辆驶离,A3车辆驶入,……,通过时间切片,车道能同时通很多的车辆,这里的同时,是指时间T >= sum(1、T2、T3,……),只要时间T较小,人的感知就是同时通过很多辆车。通过时间切片,CPU得以高效利用,这正是多线程的基础,时刻T1,CPU给线程Th1使用,时刻T2,CPU给线程Th2使用,时刻T3,CPU给线程Th3使用,……。如果没有时间切片,在很长时间内,CPU只能做同样事情,非常浪费CPU资源,这也正是单线程的局限。通过多线程,充分利用CPU,CPU就能同时做很多事。

要想提高CPU的处理能力,即在时间T内,提高CPU的处理能力,只有两个办法,其一是提高CPU的时钟频率,在更短的时间内,能运行更多的线程,处理更多的事,其二是增加CPU的核数。通过简单的线性相加,多个CPU就比单个CPU能运行更多的线程。现在的计算机,由于提高CPU的时钟频率受到技术瓶颈限制,正是通过多核CPU来提高性能。

多核CPU之间是怎么通信的呢?毕竟计算机世界里,数据很重要,两个CPU之间要彼此知道对方的数据。其实是通过内存共享来实现。何为内存共享?,说白了,就是大家读写同一内存,CPU1把数据写入某块内存,CPU2就可以读取该块内存数据,实现CPU1与CPU2数据通信。

CPU有自己的高速缓存(cache line),分为L1、L2、L3,不是以存储为目的,而是为了提高运算,CPU从高速缓存读写数据比从内存读写数据快几个数量级。CPU运算时,先从高速缓存中查找需要的数据,如果存在,就直接使用,如果不存在,从内存中读取,并缓存取来,供下次使用,运算结束,不是直接把运算结果更新到内存,而是缓存起来,达到一定的量后,再更新内存。

由于多个CPU通过内存共享来实现通信,在读写同块内存时,一定有冲突,就像同一个停车位,你我硬是同时停进车入位,一定会有车辆剐蹭,如果不及时制止,剐蹭就会升级为碰撞。而CPU有自己的高速缓存,不是即刻读写内存,更加大了读写内存时间跨度,加大了冲突。怎么避免这样的冲突,有一系列的算法:比较更新(compare and swap,简称CAS)、volatile、锁(lock)、多版本并行控制(multiple version concurrent control,简称MVCC),……,接下来的几节,我会对每种算法做深入介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值