单线程和多线程的优缺点(windows平台)
今晚和⼀同事在车上闲聊起了关于linux下的多线程和单线程问题,最后总结后得到⼀个问题:在软实时的linux操作系统下(cpu单核和多核分两种情况说),对消息的处理,是采⽤多线程程序处理快呢,还是采⽤单线程程序处理快呢?
由于问题假设太多,⼀时想不清楚,回来差了⼀下资料,暂时得到了⼀个WINDOW平台下的类似例⼦,有参考价值,暂且存下。
单线程和多线程的优缺点
windows开发平台多线程处理的优点
同步应⽤程序的开发⽐较容易,但由于需要在上⼀个任务完成后才能开始新的任务,所以其效率通常⽐多线程应⽤程序低。如果完成同步任务所⽤的时间⽐预计时间长,应⽤程序可能会不响应。多线程处理可以同时运⾏多个过程。例如,⽂字处理器应⽤程序在您处理⽂档的同时,可以检查拼写(作为单独的任务)。由于多线程应⽤程序将程序划分成独⽴的任务,因此可以在以下⽅⾯显著提⾼性能:
多线程技术使程序的响应速度更快,因为⽤户界⾯可以在进⾏其他⼯作的同时⼀直处于活动状态。
当前没有进⾏处理的任务可以将处理器时间让给其他任务。
占⽤⼤量处理时间的任务可以定期将处理器时间让给其他任务。
可以随时停⽌任务。
可以分别设置各个任务的优先级以优化性能。
是否需要创建多线程应⽤程序取决于多个因素。在以下情况下,最适合采⽤多线程处理:
耗时或⼤量占⽤处理器的任务阻塞⽤户界⾯操作。
各个任务必须等待外部资源(如远程⽂件或 INTERNET 连接)。
例如,⽤于跟踪 WEB 页上的链接并下载满⾜特定条件的⽂件的 INTERNET 应⽤程序“ROBOT”。这种应⽤程序可以依次同步下载各个⽂件,也可以使⽤多线程同时下载多个⽂件。多线程⽅法⽐同步⽅法的效率⾼很多,因为即使在某些线程中远程 WEB 服务器的响应⾮常慢,也可以下载⽂件。
下⾯是多线程的例⼦
还在DOS时代,⼈们就在寻求⼀种多任务的实现。于是出现了TSR类型的后台驻留程序,⽐较有代表性的有SIDE KICK、VSAFE等优秀的TSR程序,这类程序的出现和应⽤确实给⽤户使⽤计算机带来了
极⼤的⽅便,⽐如SIDE KICK,们编程可以在不⽤进编辑程序的状态下,⼀边编辑源程序,⼀边编译运⾏,⾮常⽅便。但是,DOS单任务操作系统的致命缺陷注定了在DOS下不可能开发出真正的多任务程序。进⼊WINDOWS3.1时代,这种情况依然没有根本的改变,⼀次应⽤只能做⼀件事。⽐如数据库查询,除⾮应⽤编得很好,在查询期间整个系统将不响应⽤户的输⼊。
进⼊了WINDOWS NT和WINDOWS 9X时代,情况就有了彻底的改观,操作系统从真正意义上实现了多任务(严格地说,WIN9X还算不上)。⼀个应⽤程序,在需要的时候可以有许多个执⾏线程,每个线程就是⼀个⼩的执⾏程序,操作系统⾃动使各个线程共享CPU资源,确保任⼀线程都不能使系统死锁。这样,在编程的时候,可以把费时间的任务移到后台,在前台⽤另⼀个线程接受⽤户的输⼊。对那些对实时性要求⽐较⾼的编程任务,如⽹络客户服务、串⾏通信等应⽤时,多线程的实现⽆疑⼤⼤地增强了程序的可⽤性和稳固性。
=====================================================================================
坏处:增加了调度和管理的开销,带来了⼀些不确定性,需要复杂的同步机制,避免死锁等等。
好处:⼀定程度上提⾼响应速度,在多核的情况下还是更能充分利⽤CPU资源的。
=====================================================================================
单线程的也就是程序执⾏时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前⾯的处理好,后⾯的才会执⾏到。
多线程嘛,举个例⼦也就是说程序可以同时执⾏2个以上相同类似的操作,⽐如⼀些搜索代理或者发email的多线程软件,由于操作⼀次需要⽹络的返回信息花的时间⽐较长,⽽对cpu来说却是空闲的,如果是⼀个⼀个顺序执⾏,那么搜索⼏千个IP就会花上好久好久。⽽如果⽤多线程就可以在等待期间加⼊其他的搜索,然后等待,这样可以提⾼效率。不过多线程和多进程公⽤⼀些资源时要考虑的问题好像也是⼀样的,对于⼀些公共资源或者公共变量的访问和修改时要注意特别的,需要⼀些锁定什么的,还有顺序问题的考虑。
多线程编程的⽬的,就是"最⼤限度地利⽤CPU资源",当某⼀线程的处理不需要占⽤CPU⽽只和I/O,OEMBIOS等资源打交道时,让需要占⽤CPU资源的其它线程有机会获得CPU资源。每个程序执⾏时都会产⽣⼀个进程,⽽每⼀个进程⾄少要有⼀个主线程。这个线程其实是进程执⾏的⼀条线索,除了主线程外你还可以给进程增加其它的线程,也即增加其它的执⾏线索,由此在某种程度上可以看成是给⼀个应⽤程序增加了多任务功能。当程序运⾏后,您可以根据各种条件挂起或运⾏这些线程,尤其在多CPU的环境中,这些线程是并发运⾏的。多线程就是在⼀个进程内有多个线程。从⽽使⼀个应⽤程序有了多任务的功能。多进程技术也可以实现这⼀点,但是创建进程的⾼消耗(每个进程都有独⽴的数据和代码空间),进程之间通信的不⽅便(消息机制),进程切换的时间太长,这些导致了多
线程的提出,对于单CPU来说(没有开启超线程),在同⼀时间只能执⾏⼀个线程,所以如果想实现多任务,那么就只能每个进程或线程获得⼀个时间⽚,在某个时间⽚内,只能⼀个线程执⾏,然后按照某种策略换其他线程执⾏。由于时间⽚很短,这样给⽤户的感觉是同时有好多线程在执⾏。但是线程切换是有代价的,因此如果采⽤多进程,那么就需要将线程所⾪属的该进程所需要的内存进⾏切换,这时间代价是很多的。⽽线程切换代价就很少,线程是可以共享内存的。所以采⽤多线程在切换上花费的⽐多进程少得多。但是,线程切换还是需要时间消耗的,所以采⽤⼀个拥有两个线程的进程执⾏所需要的时间⽐⼀个线程的进程执⾏两次所需要的时间要多⼀些。即采⽤多线程不会提⾼程序的执⾏速度,反⽽会降低速度,但是对于⽤户来说,可以减少⽤户的响应时间。上述结果只是针对单CPU,如果对于多CPU或者CPU采⽤超线程技术的话,采⽤多线程技术还是会提⾼程序的执⾏速度的。因为单线程只会映射到⼀个CPU上,⽽多线程会映射到多个CPU上,超线程技术本质是多线程硬件化,所以也会加快程序的执⾏速度。
====================================================================================
如果线程出现死锁,唯⼀能证明的就是应⽤程序有问题,这并不是线程的缺点。
线程相对于进程的优点:
1、开销⼩
2、资源共享性好。
线程相对于进程的缺点:
1、共享资源需要耗费⼀定的锁资源,同步相对复杂。
2、⼀个线程崩溃可能导致整个进程崩溃,这个当然是⾃⼰的应⽤程序有问题
====================================================================================
CPU是以时间⽚的⽅式为进程分配CUP处理时间的,当⼀个进程以同步的⽅式去完成⼏件事情时,此进程必须完成了第⼀件事情以后再做第⼆件事,如此按顺序地向CPU请求完成要做的事情。在此单线程的⼯作模式下,如果把CUP看作是⼀共有100个时间⽚的话,CPU可能⼀直都只是花了其中的10个时间⽚来处理当前进程所要做的事情,只是⽤到了CPU的10%的时间⽚,⽽其他时间都⽩⽩浪费了,当然,实际上CPU的⼯作模式还是做完⼀件事以后再去做另⼀件事,只是CUP的处理速度⾮常快,很快就处理完成所请求的情事。
为了提⾼CPU的使⽤率,采⽤多线程的⽅式去同时完成⼏件事情⽽互不⼲扰,如当前进程要完成三件事情1、2、3,那么CPU会分别⽤10%的时间来同时处理这3件事情,从⽽让CPU的使⽤率达到了30%,⼤⼤地提⾼了CPU的利⽤率。多线程的好处在处理⼀些特殊的场合其优势尤其明显。⽐如下载
⽂件,你要⼀边下载⼀边显⽰进度⼀边保存,在这种情况下,如果没有⽤多线程的话,没有意外的话⼀般都会把主线程阻塞,⽐如进度条的进度根本没有随着已下载的量⽽变化,堪⾄是整个窗体都动不了,⽤多线程就可以很好地解决这个问题。
这⾥有⼀个⽣活实例可能更好地去理解多线程:回去看你⼥朋友做饭,正常的话她都会把洗好的菜(⾁)先放到锅⾥煮,然后⼀边洗别的菜或处理别的事情,如:洗碗、收拾桌台准备开饭,⼈还是⼀个⼈,但她同时做⼏件事情,这样就可以⼤⼤地提⾼效率。总的⼀句话就是:CPU还是要花同样多的时间去完成所有的事情,但多线程可以让CPU掺插地同时做多件事情,在视觉上让⽤户觉得计算机在同时帮他处理多件事情,更好地改善⽤户体验。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论