对于很多人来说,并发是一个离不开的话题。那么我们平常对并发的理解可能局限于某个方面。去很好的理解并发,对于软件开发很有帮助。怎样去更好的理解并发?
苹果下落,在我们认识牛顿定律之前。如果问苹果是下落的,我们都会说大家都知道,很清楚,很明白——了解但没引起关注。如果问为什么苹果下落。我们会举出很多相关的概念来说明苹果为什么下落——相似性,但却没有一个很清晰的概念。在万有引力之后,我们的认识已经有一定的高度,甚至对以后很多科技都很有帮助。
所以怎样去理解并发,我们不缺乏经验。那么我们缺乏的就是那么一个高度,可以理解为深度的认识。
可能有人会讲并发作为一种缺陷,一个问题。此时,我将他作为一种能力,称为并发能力。
其实提升并发能力,最主要的就是减少无效线程,减少线程时间。
抛出这样一句话,相信有很大一部分人很费解。并发跟线程有什么关系。并发,我们见得多的字眼可能是“同一时间访问量”。
在分析以上主题也是重点之前,我们先来看看电脑的线程运行的情况。相信有操作系统相关知识的人都知道,确切的说CPU在某一时刻处理唯一线程,在这条线程的时间片段用完会切换到处理其他线程,从而产生了多线程。
“同一时间访问量”是由多线程去引导处理才会有“同一时间访问量”这样一个概念。
首先说的是减少无效线程,是提升并发能力的手段之一。过多的线程切换回产生性能消耗,而且类似于图片产生的线程对于网页来说,并不是最主要的,我们可以认为是无效线程。其他网站对于本网站来说,可以认为是无效线程。减少无效线程从某一个方面来说也是减少线程时间。
如何减少线程时间。
1. 运算能力强
2. 粒度够小。避免死锁等情况。
3. 传输够快。含网络传输,I/O吞吐量。
现在已经清晰的认识到并发能力与线程有关。为什么减少线程时间,就是提升了并发能力。
我们已经知道同一时间访问量,严格的说不可能是同一时间,因为有线程的调度。如果许多线程能够快结束,又有心的线程加入,并不会影响性能,因此,我所说的提升并发能力,就必须减少线程时间。
下面从层次上来看减少线程时间。
页面,比如说我们的后台数据处理都非常快。但是页面文件很大的话,或者并发的带宽不够宽,导致传输数据花很长的时间,那么页面的线程可能在传说数据上花费大量的时间。这样就导致了并发能力的降低。因为线程被延长了。线程的延长影响了电脑处理软件的能力,也就是并发能力的降低。
解决方案:静态页面,分布式,页面优化,压缩,缓存,图片与页面服务器的分离等。
后台,后台是影响并发的非常关键的因素。架构足够烂,代码足够乱等等都是影响性能,从而间接影响并发。
架构决定着怎么去编码。这必然会影响运行时间。我跟几位朋友在争论时编译型快还是解释性快的时候,我的观点是解释性的,其实我并不支持我这一观点,但为什么这么说。因为编译型的要做更多的事情,也就是离核心越来越远。如果架构足够烂的网站还不如去用解释性去做网站。至少微软很多的东西就足够让性能降低非常明显。
其次是代码细节,比如说有个Array的对象arrObj做下面运算:
For(var i=0;i<arrObj.Count;i++){}
其实这段代码,我们看起来没有什么问题,其实他的问题大着呢。For的运行时间复杂度为O(n),其实arrObj.Count在for中的时间复杂度也为O(n),这样将会达到2个O(n)的时间复杂度。其实我们可以这样写,for(var i= arrObj.Count-1;i>=0;i--){}这样只有一个O(n)的时间复杂度。
所以,可能作为后台,大家谈得更多是性能,其实说性能还是在说并发能力。从架构和代码细节上入手将会有一个质量很高的,并发能力很强的软件。
数据库的并发,主要影响有几个方面:一、数据库的架构,二、锁,三、SQL语句。可能我们对数据的优化可能侧重于sql语句,其实不然。数据库的架构同样非常的重要,也是影响数据库操作时间的因素,从而影响并发能力。关于数据库优化的细节可以参照相关资料。