我对多线程与编程效率的认知
来源:互联网 发布:牛仔面料的网络丝 编辑:程序博客网 时间:2024/04/19 00:55
因为项目里多线程用的很多,所以也小小深入的研究了下多线程与编程效率问题。一直想写这篇文章,但是没时间写。现在我来谈谈我的认知。
引用网上一个浅显的例子来解释多线程:
CPU是一个挖隧道的工人。有两种开挖隧道的方法:
1. 只在山的一头挖,直到挖到山的另一头,从而打通隧道,完成任务。这是单线程。
2. 在山的两头向中间挖,同时开工,最后在山的中间接通,从而打通隧道,这感觉肯定比第一种方法快多了,这就是多线程。
但是,是这样简单的吗?当然不是。如果我们只有1个人,也就是只有1个CPU,如果只跑这2个任务,那么,这个工人只有山的两头跑,这头挖一会,再去挖那一头,以实现上面第二种多线程方案。但是,这样的效率远不如单线程高,因为来回跑是要花费额外时间的。这就好比线程的调度和上下文切换。
那么,我们是不是可以说,在单CPU的机器中,多线程反而降低了效率呢?
答案很明显,当然不是。以上的假设只是在单CPU单核、纯计算、没IO的理想CPU状态,单个线程肯定比多个线程快,因为省去了线程切换的开销。但真实的环境基本都有IO操作,所以线程会有阻塞的存在(比如为了等待硬盘操作,某一线程被挂起),因此,当某个任务被阻塞了,如果程序是单线程的,那么,整个程序就停下了。如果是多线程,那么其他没有阻塞的线程还可以继续执行,所以就快了。可以说,从性能上,如果没有线程阻塞,那么单CPU上的多线程就没有任何意义了。
我们在加上现实的环境。现代操作系统都是多用户多任务的系统。因此,CPU时间是由操作系统进行分配。因为除了你的程序外,系统上海由其他若干任务(包括操作系统本身)在跑,所以你的程序不会连续时间在跑。因此,多线程是相当有必要的。是提高程序效率的最好途径之一。但是不是任何情况下都要多线程呢?当然也不是。这也需要根据情况来看。
再举个编程上的例子。假设有一个数据库。在同一时间内,有很多用户需要访问这个数据库。那么,我们怎么设计这个数据库连接呢?这就需要分情况:
如果这么多用户都访问数据库中的同一个表(或者仅2~3个表),由于数据库锁的设计成同一时间只允许一个连接访问某一个表。因此,在这种状态下,设计成单线程是最好的。因为很多用户的访问会在单线程内形成一个队列,轮流去查询这个表。如果设计成多线程连接数据库,那么,这么多线程还是会等待,轮流去查询这个表。但是由于有线程的上下文切换时间以及调度时间存在,所以,多线程效率毫无疑问远不如单线程高。
但是如果如此多的用户去访问很多不同的表,那么,根据上面的原理,效率无疑比单线程高多了。
回到一开头CPU挖山的例子。我们套上正确的多线程的思想,那么,此例应该如下:
如果一个机器人代表CPU,那么这个机器人一天所做的事情,并不都是只挖山。它还有许多事情要做,比如砍柴,烧水,钓鱼,挖山等等。
如果按以上划分是4条线程,每一个线程大概占用1/4 CPU时间。如果你把挖山这一任务多设几次,比如设定成挖山共有3条线程。那么挖山的CPU占用率将达到1/2,这就是所谓的提高了效率。
现实中的CPU 在大部分时候的闲置状态的。因此开多条线程能提高效率,倒不如说成是充分利用了CPU执行时间。
- 我对多线程与编程效率的认知
- 我对编程的认知
- 我对多线程编程的理解与联想
- 我对DDD的认知(一)
- 我对Hibernate缓存的认知
- 我对Hibernate缓存的认知
- 我对大数据算法的认知
- 对交换机与路由器的认知
- 对数据库与SQL的认知
- 调查问卷:测试你对多核多线程的认知程度
- 刚子扯谈:我对黑客精神的一些认知
- 我对互联网营销时代的发展认知
- 转载:我对大数据算法的认知
- 对事务的认知
- 对线程的认知
- 我认知的acm
- 近期对java编程的一些自我认知
- 我对效率类 App 的理解
- (转)C#中使用指针转换数据类型[C#/unsafe]
- 数据建模与业务建模
- 关于VC里触发断点的另一种方法
- 当心文字在线编辑太久而丢失!!!
- python 历史
- 我对多线程与编程效率的认知
- 函数重载与C++对#include的理解
- Spring.NET学习笔记18——整合NHibernate(基础篇) Level 300
- 精确计算硬盘分区大小
- “地热”怎么说
- 开博客
- 00
- “随便/还行”英语怎么说
- 雷军:为什么马云马化腾创业那么容易成功 自己却需要煎熬数年