我对多线程与编程效率的认知

来源:互联网 发布:牛仔面料的网络丝 编辑:程序博客网 时间:2024/04/19 00:55

 

因为项目里多线程用的很多,所以也小小深入的研究了下多线程与编程效率问题。一直想写这篇文章,但是没时间写。现在我来谈谈我的认知。

引用网上一个浅显的例子来解释多线程:

CPU是一个挖隧道的工人。有两种开挖隧道的方法:

1.      只在山的一头挖,直到挖到山的另一头,从而打通隧道,完成任务。这是单线程。

2.      在山的两头向中间挖,同时开工,最后在山的中间接通,从而打通隧道,这感觉肯定比第一种方法快多了,这就是多线程。

但是,是这样简单的吗?当然不是。如果我们只有1个人,也就是只有1CPU,如果只跑这2个任务,那么,这个工人只有山的两头跑,这头挖一会,再去挖那一头,以实现上面第二种多线程方案。但是,这样的效率远不如单线程高,因为来回跑是要花费额外时间的。这就好比线程的调度和上下文切换。

那么,我们是不是可以说,在单CPU的机器中,多线程反而降低了效率呢?

 

答案很明显,当然不是。以上的假设只是在单CPU单核、纯计算、没IO的理想CPU状态,单个线程肯定比多个线程快,因为省去了线程切换的开销。但真实的环境基本都有IO操作,所以线程会有阻塞的存在(比如为了等待硬盘操作,某一线程被挂起),因此,当某个任务被阻塞了,如果程序是单线程的,那么,整个程序就停下了。如果是多线程,那么其他没有阻塞的线程还可以继续执行,所以就快了。可以说,从性能上,如果没有线程阻塞,那么单CPU上的多线程就没有任何意义了。

我们在加上现实的环境。现代操作系统都是多用户多任务的系统。因此,CPU时间是由操作系统进行分配。因为除了你的程序外,系统上海由其他若干任务(包括操作系统本身)在跑,所以你的程序不会连续时间在跑。因此,多线程是相当有必要的。是提高程序效率的最好途径之一。但是不是任何情况下都要多线程呢?当然也不是。这也需要根据情况来看。

 

再举个编程上的例子。假设有一个数据库。在同一时间内,有很多用户需要访问这个数据库。那么,我们怎么设计这个数据库连接呢?这就需要分情况:

如果这么多用户都访问数据库中的同一个表(或者仅2~3个表),由于数据库锁的设计成同一时间只允许一个连接访问某一个表。因此,在这种状态下,设计成单线程是最好的。因为很多用户的访问会在单线程内形成一个队列,轮流去查询这个表。如果设计成多线程连接数据库,那么,这么多线程还是会等待,轮流去查询这个表。但是由于有线程的上下文切换时间以及调度时间存在,所以,多线程效率毫无疑问远不如单线程高。

但是如果如此多的用户去访问很多不同的表,那么,根据上面的原理,效率无疑比单线程高多了。

 

回到一开头CPU挖山的例子。我们套上正确的多线程的思想,那么,此例应该如下:

如果一个机器人代表CPU,那么这个机器人一天所做的事情,并不都是只挖山。它还有许多事情要做,比如砍柴,烧水,钓鱼,挖山等等。

如果按以上划分是4条线程,每一个线程大概占用1/4 CPU时间。如果你把挖山这一任务多设几次,比如设定成挖山共有3条线程。那么挖山的CPU占用率将达到1/2,这就是所谓的提高了效率。

现实中的CPU 在大部分时候的闲置状态的。因此开多条线程能提高效率,倒不如说成是充分利用了CPU执行时间。

 

 

原创粉丝点击