- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux并发编程初探
接下来的几个章节的中,我们将一起来学习Linux下的多线程编程。多线程与多进程是Linux并发程序的两种编程方式,多线程由具备于效率较高、内存代价较小、共享数据简等多种优点,是嵌入式并发程序编写的首选。
编写并发程序的主要目的是提高CPU的使用效率,从而加快程序对业务的处理能力。我们的应用程序,很多时候其实并不需要100%使用CPU,甚至连1%的CPU资源用不满,但依然需要使用并发编程,来实现程序的加速,因为我们程序经常因为要等待某些资源 如IO操作 而被挂起,串行处理这些事务,程序将99%的时间浪费在等待中,所有速度上不去。我们举个实例来详解并发编程是如何提高程序效率的:
有一个程序,需要向外发送数据包,每发一个数据包,等待对方回应后,再发下一个包,如此循环,直至所有数据发送完毕。假使:
1 发送一包数据消耗时间为1t,数据包在网络上传输的时间为5t,对方接收并数据包并做回应为1t。
2 程序需同时对远端两个不同的客户端发同样的数据。
3 数据包的总量为10个。
如果不使用并发编程,我们来计算一下发送所有数据到两个客户端的总时间:
首先,不难计算,发两个包的时间间隔为:
1t 发送端消耗时间 + 5t 数据网络传输时间 + 1t 接收端响应时间 + 5t 回应包传输时间 12t
则:处理完所有数据需要的时间为:12t x 10 x 2 240t,无论程序是处理完一个客户端再处理下一个,还是做同一包数据先发一再发二的分时处理,时间都大体相等。
如果使用并发编程,我们使用我两个进程来分别处理不同的客户端,则每个线程的发送完所有数据有时间为:12t x 10 120t。由于两个进程是并发执行的,所有程序处理完两个客户端数据所有的时间还是120t,这比非并发处理的方式要快1倍。如此类推,当需要处理的客户端更多时,我们增加同样多的线程数来处理,那么程序所花时间依然还是120t,而不是非并发方式的120t x n 客户端个数 ,其加速效果更加显著。
为什么产生这样的效果呢,因为上面的例子中有一个非常重要的前提:就是程序中有等待,没有100%使用CPU。程序发送一个包只消耗1t的cpu时间,但在等待数据传到对方再返回应包这件事情上,我们却花费了11t的时间,而这个时候,程序是根本不能拿CPU做任何用的,11倍的时间浪费在无所事事的等待上,而并发编程使用多线程充分利用了CPU,当某个线程在等待的时候,另一个线程则用CPU来发送数据,因而能够产生显著的加速作用。
如果CPU的使用率已经很高甚至接近饱和,则并发程序将起不到程序加速的作用甚至拖慢程序的执行,因为操作系统在进行任务调度的时候,也是消耗CPU时间的。我们再举个例子:
假使程序做某个重复操作,该操作本身花费的CPU时间为90t,操作完成后需有5t的时间来做某种条件等待才能做下一个,操作系统做一次线程调试所花费的时间为10t,CPU每秒能够运行100t时间,操作重复的次数为2n。
不难计算,每个操作之间的时间间隔为:
文档评论(0)