什么是并发(concurrency)
当你在餐厅品味美食的时候,电话铃声突然骚然了你美好的心情。此时有以下选择。
A. 如果心情郁闷,没接电话,继续吃饭。此时的你就不支持并发。
B. 如果是美女打过来的电话,立马接通吃饭,跟美女畅谈一番,谈好约会日期挂掉电话,哼着小曲继续吃完剩下的美食。此时的你就支持并发。两件事情都没有耽误。
C. 如果是同事打来的电话, 接通电话后一遍回答同事的问题咨询,一遍继续咀嚼着送入口中的美食。 恭喜你,此时你已经达到了并发更高的境界:并行能力(parallelism)。
所以如果具有B和C的能力的人或者物,是具有并发能力的。并行技术可以看作是并发的一个至高境界,就像你已经练成了乾坤大挪移的第七层。他们的关系如下图所示。
并发与并行的主要区别是否在“同时”。 并发是你在做某件事情的时候,可以暂停处理当前事情来处理某件新的事情,完成后再继续处理之前的事情,由于来回切换速度很快,在用户看来接近是同时进行的。 并行是两个人同时在做两件事情。只有多个核的系统才能实现并行,每个核做一件事情。如果单核的系统,只能支持并发执行。
作为一个云操作系统平台,需要同一时间内能够处理数以千计的任务量,那是怎么实现的? 那就依赖于进程,线程,绿色线程等技术。
什么是进程和线程
如果使用电脑办公的话,大家每天都在与进程或者线程打交道。 比如打开一个浏览器上网, 同时为了增加情调又打开播放器听一些轻音乐。 这每打开一个程序就会启动一个进程,甚至一个浏览器进程中还会启动一些线程或者子进程来处理其中的视频,搜索等业务。所以说当你打开电脑的一瞬间,你已经开始使用进程和线程了。 每个进程和线程都在做自己的事情,让你感觉你可以使用电脑同时并发做很多事情,多么美妙的事情啊。
那么进程和线程的关系可以用下图来说明。
操作系统可以看成是一个包含多个进程的容器,其中每个进程都是包含多个线程的容器。所以在操作系统中,进程可以在一个操作系统内实现多个任务的并发执行。 如打开一个音乐播放器,同时打开一个浏览器查询资料。 然而线程可以实现一个进程内的并发执行。比如一个线程用于音乐播放器的界面的呈现,另一个线程用于播放音乐。 正是进程和线程的分工合作, 我们用户能够感受到并发的完成多件事情。
只有进程就满足了吗
进程和线程是有显著的不同的。系统分配了进程后, 会同时给进程分配一个临时的存储空间(Memory)。 打个比方, 比如你是系统创建的一个进程,完成去超市购物的任务,然后分配一个购物车就是一个存储空间。 此购物车仅用于你自己使用,不认识的人是不能共享使用的。 因此进程之间是不能够共享内存空间(Memory)的。 除非是通过类似IPC等高级技术来共享内存空间。
与进程不一样的是,线程是进程申请由系统创建的。一个进程内部可以创建多个线程,这些线程可以共享该进程的内存空间(Memory),这个线程之间就可以更快速的共享数据。比如你为了更快的购物,带了你女朋友去购物,这就相当于你创建了一个线程-女朋友来帮你购物。 女朋友当然可以使用你的购物车,这就是共享了内存空间。如下图所示。
如果所有任务都使用线程来完成, 整个系统资源会被数以千计的进程耗光,因为每启动一个进程都会分配内存空间。当然超时的购物车也会被用完了。
因此大部分情况跟下需要在进程内使用线程来实现不同任务的并发处理。 你可以多找几个朋友来帮你购物,又不耗费更多的购物车。
线程能实现更细粒度的并发
线程可以由操作系统在内核中创建,也可以在用户程序中创建。 从操作系统中申请的是原生线程(Native Thread),相当于是租赁的房子,只能拥有使用权,但是没有该房屋的支配权,不能随意买卖。 在用户程序创建的线程一般称之为绿色线程(Green Thread),相当于你自己买了套房子,可以使用,还可以拥有该房屋的支配权,可以决定是否买卖。
原生线程
原生线程可以实现进程内部的并发处理。 每当一个任务来临的时候,进程向操作系统申请一个线程来处理这个任务。
举个有趣例子解释下下,系统启动了一个“做饭”的进程, 并申请了一个厨房作为内存空间。 进程又申请了两个厨师线程来做饭。 厨师A负责炒菜做饭。厨师B负责洗菜,切菜,准备食材。 厨师B准备好食材,厨师A就开始做饭,两个线程分别完成自己的事情,实现并发,如图A。
在某一个时刻,可能会出现以下两个问题。
a) 如果厨师A做饭速度很快,在某一个时刻厨师B没有准备好食材。 那厨师A只能等待厨师B准备好才能继续,此时厨师A一直在等待。
b) 由于对厨师A没有支配权所有无法临时让他去帮助准备食材。
c) 此时可能考虑到增加效率,需要再招聘一个厨师C线程进行准备食材。 这就增加了支出成本。
下面介绍的绿色线程即将解决这些问题。
绿色线程
“绿色线程”这个名称是指Sun Microsystem的绿色团队,他们在90年代设计了最初的Java线程库。但是其他一些编程语言Go、Haskell,Rust或者Python等都实现了与绿色线程等价的功能。
绿色线程是相当于是一个线程内的模拟线程,并不是真正的线程。其关系可以用下图表示。
接着上面的例子,绿色线程我们可以看作是一个“规划”。如下图所示。
a) 绿色线程不是操作系统创建的。 而是由有用户程序创建的, 能够由于绝对的支配权。 因此可以让厨师A做饭也可以准备食材。
b) 厨师A在等待期间可以切换到规划2上面去,准备食材。等准备好食材, 又切换到规划1上继续做饭,这样不断切换可以做两件。
c) 由于厨师A可以帮助厨师B准备食材,所以可以不需要一个厨师C, 这样就减少了开销。
并发对云平台意义重大
一个稳定可靠的云平台,需要有较高的及时响应和处理能力。 所以并发能力是衡量云平台能力的重要指标。当前国内的有华为云,阿里云,腾信云等;国外有亚马逊, 微软等云提供商, 都支持了不同程度的并发能力来解决越来越多的业务处理。 作为国内重要的云供应商,烽火通信从2010年就在云计算重点布局,早已基于开源OpenStack平台架构推出了FitOS云平台,具有如下特点。
1. 基于开源CentOS操作系统的多核处理技术,能够实现高并发和并行的处理能力。
2. 不同模块使用不同进程处理任务,每个模块都使用线程和绿色线程来实现更细粒度的并发处理能力,极大的提高了响应效率和系统的可伸缩能力。
3. 加入线程同步和进程僵死检测机制,让系统更可靠更性能。
经过多年的研发积淀和优化,FitOS云平台能够满足私有云,电信云等不同场景的业务需求。目前,烽火云产品已累计部署110+数据中心,管理7000+节点,储存容量逾600PB,提供客户很好的体验。