今晚和一同事在车上闲聊起了关于linux下的多线程和单线程问题,最后总结后获得一个问题:在软实时的linux操做系统下(cpu单核和多核分两种状况说),对消息的处理,是采用多线程程序处理快呢,仍是采用单线程程序处理快呢?linux
因为问题假设太多,一时想不清楚,回来差了一下资料,暂时获得了一个WINDOW平台下的相似例子,有参考价值,暂且存下。数据库
多线程处理的优势
同步应用程序的开发比较容易,但因为须要在上一个任务完成后才能开始新的任务,因此其效率一般比多线程应用程序低。若是完成同步任务所用的时间比预计时间长,应用程序可能会不响应。多线程处理能够同时运行多个过程。例如,文字处理器应用程序在您处理文档的同时,能够检查拼写(做为单独的任务)。因为多线程应用程序将程序划分红独立的任务,所以能够在如下方面显著提升性能:
多线程技术使程序的响应速度更快,由于用户界面能够在进行其余工做的同时一直处于活动状态。
当前没有进行处理的任务能够将处理器时间让给其余任务。
占用大量处理时间的任务能够按期将处理器时间让给其余任务。
能够随时中止任务。
能够分别设置各个任务的优先级以优化性能。
是否须要建立多线程应用程序取决于多个因素。在如下状况下,最适合采用多线程处理:
耗时或大量占用处理器的任务阻塞用户界面操做。
各个任务必须等待外部资源(如远程文件或 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上,超线程技术本质是多线程硬件化,因此也会加快程序的执行速度。并发
====================================================================================ide
若是线程出现死锁,惟一能证实的就是应用程序有问题,这并非线程的缺点。
线程相对于进程的优势:
一、开销小
二、资源共享性好。
线程相对于进程的缺点:
一、共享资源须要耗费必定的锁资源,同步相对复杂。
二、一个线程崩溃可能致使整个进程崩溃,这个固然是本身的应用程序有问题性能
====================================================================================优化
CPU是以时间片的方式为进程分配CUP处理时间的,当一个进程以同步的方式去完成几件事情时,此进程必须完成了第一件事情之后再作第二件事,如此按顺序地向CPU请求完成要作的事情。在此单线程的工做模式下,若是把CUP看做是一共有100个时间片的话,CPU可能一直都只是花了其中的10个时间片来处理当前进程所要作的事情,只是用到了CPU的10%的时间片,而其余时间都白白浪费了,固然,实际上CPU的工做模式仍是作完一件事之后再去作另外一件事,只是CUP的处理速度很是快,很快就处理完成所请求的情事。
为了提升CPU的使用率,采用多线程的方式去同时完成几件事情而互不干扰,如当前进程要完成三件事情一、二、3,那么CPU会分别用10%的时间来同时处理这3件事情,从而让CPU的使用率达到了30%,大大地提升了CPU的利用率。多线程的好处在处理一些特殊的场合其优点尤为明显。好比下载文件,你要一边下载一边显示进度一边保存,在这种状况下,若是没有用多线程的话,没有意外的话通常都会把主线程阻塞,好比进度条的进度根本没有随着已下载的量而变化,堪至是整个窗体都动不了,用多线程就能够很好地解决这个问题。
这里有一个生活实例可能更好地去理解多线程:回去看你女友作饭,正常的话她都会把洗好的菜(肉)先放到锅里煮,而后一边洗别的菜或处理别的事情,如:洗碗、收拾桌台准备开饭,人仍是一我的,但她同时作几件事情,这样就能够大大地提升效率。总的一句话就是:CPU仍是要花一样多的时间去完成全部的事情,但多线程可让CPU掺插地同时作多件事情,在视觉上让用户以为计算机在同时帮他处理多件事情,更好地改善用户体验。
了解了多线程的好处之后,就要了解应该在什么样的状况下使用多线程技术。由于并非说全部状况下用多线程都是好事,由于多线程的状况下,CPU还要花时间去维护,CPU处理各线程的请求时在线程间的切换也要花时间,因此通常状况下是能够不用多线程的,用了有时反而会得不偿失。大多状况下,要用到多线程的主要是须要处理大量的IO操做时或处理的状况须要花大量的时间等等,好比:读写文件、视频图像的采集、处理、显示、保存等。