程序设计—多进程还是多线程

来源:互联网 发布:贵阳网络宽带选哪家好 编辑:程序博客网 时间:2024/05/01 10:30

 

多任务编程可以说是未来编程的发展趋势,目前单核CPU的速度已接近极限,今后更多的是采用多核CPU的技术,在多核CPU情况下,软件必须按多任务设计才能充分利用多核CPU的优势。

一、程序、进程与线程

程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。

线程则是进程的一个实体,CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。

二、多核与多处理器

多处理器系统与多核系统的主要区别是多核系统只有一个物理处理器,这个物理处理器包含两个或更多个核,而多处理器系统有两个或更多个物理处理器。多核系统也共享计算资源,在多处理器系统中这些资源常常是被复制的,如L2高速缓存和前端总线。多核系统与多处理器系统性能相似,但成本常常要低得多,原因是多核处理器比多个相同的单个处理器价格要低,也不需要支持多个处理器的母板,如多处理器插头。

三、多任务

像多处理器系统一样,多核系统能同时执行多个计算任务。这一点在如Windows XP多任务操作系统(OS)中很有利,此时可以同时运行多个应用程序。多任务指OS在两个任务间快速切换的能力,表面上看,这些任务同时执行。当运行在多核系统上时,多任务OS能真正同时执行多个任务,而不只是表面上看起来是。例如,在双核系统上,两个应用——National Instruments LabVIEW Microsoft Excel,各自都能同时访问一个独立的处理器核,因此,提高了如进行数据记录的应用程序的整体性能。

四、多线程

多线程将多任务思想延伸到应用程序,所以可以将一个单独应用程序内的具体操作分成具体线程,各线程都能并行运行。这样,OS就不仅能在不同应用程序间,也可在一个应用程序的每个线程间划分处理时间。

注意多线程是为了同步完成多项任务,一些不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。使用线程有以下几点好处:

1.        更高效地使用CPU

在很多应用程序中,资源可以同时调用。完成这种调用常常需要花费很长时间。在单线程应用中,同步调用有效阻止或防止了应用程序内的任何其他任务的执行,直到该调用完成。多线程避免了这种情况的发生。当一个线程出现同步调用时,其他不依赖此调用的程序部分在其他线程下运行。应用程序继续执行,而不是等到此同步调用完成后再继续执行。这样,如果应用程序的任何一个线程准备运行,则CPU都可运行该线程,所以,多线程应用最大程度提高了CPU效率。

2.        系统可靠性更高

通过将应用程序分成不同的执行线程,可以避免次要操作影响最重要操作的执行。最常见的例子是用户接口可能对时间更关键的操作的影响。屏幕更新或响应用户事件经常会降低应用程序的执行速度。给用户接口线程赋予的优先权比其他对时间要求更关键的操作事件的优先权要低些,就能保证用户接口操作不会阻止CPU执行更重要的操作,如采集数据或过程控制。

3.        提高多核系统的性能

多线程最诱人的优点之一是可以利用多核系统完备的计算能力。在几个线程都同时准备运行的多线程应用程序中,每个核可以运行不同的线程,应用程序实现了真正的并行任务执行。这样不仅增强了CPU使用效率更高和系统可靠性更高这两个优点,而且使性能得到彻底提高。

4.        使用线程还可以把占据长时间的程序中的任务放到后台去处理

5.        用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以

弹出一个进度条来显示处理的进度

6.        程序的运行速度可能加快

由于创建新进程必须加载代码,而线程要执行的代码已经被映射到进程的地址空间,所以创建、执行线程的速度比进程更快。

7.        在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用。

在这种情况下可以释放一些珍贵的资源如内存占用等等。

8.        还有一个进程的所有线程共享进程的地址空间和全局变量,所以简化了线程之间的通

讯。所以在设计需要大量通信的应用程序时,可以利用多线程编程来解决。

五、多进程与多线程的简单比较

1.        多进程

优点:内存隔离,单个进程的异常不会导致整个应用的崩溃。方便测试,编程简单。

    缺点:进程间调用,通讯和切换均比多线程大,耗资源。

使用场所:目标子动能交互少,如果资源和性能许可,可以设计由多个子应用程序来组合完成目的。

2.        多线程 

优点:提高系统的并行性,并且开销小。数据共享方便(不需要进程间的通信)

缺点:没有内存隔离,单个现成的崩溃会导致整个应用程序的退出,发生采内存等bug时,定位及其不方便。编程复杂;调试困难;线程执行的随机性可能导致逻辑混乱,甚至发生死锁现象;

使用场所:在存在大量IO,网络等耗时操作,或者需要和用户交互时,使用多线程有利于提高系统的并行性和用户界面快速响应从而提高友好性。

六、设计时应注意的事项

1.        尽量避免长驻内存的进程,例如那些很少用到的功能,或周期性很长(10分钟以上),

把它们的功能提取出来,做成一个小的应用程序。需要的时候再把它们拉起来(如通过crontab配置,或直接system)。

2.        把目标设计成子功能系统的组合可用提高重用的易用性和维护性。

把目标根据功能划分不同的子系统,子系统间遵循特定的协议(文本或XML),由通讯联系起来,协作完成目标。

典型的案例就是UNIXLINUX的工具使用。如:$ cat veglist fruitlist | sort > clist,用cat打开文件,协议是字符流,通过管道(通讯手段)传给sort进行排序,把排序的结果流重定向到文件中。这种自由组合协作风格应用思想和编程思路也是吸引众多UNIX拥护者的原因之一吧。

     在软件设计中,选择多进程还是多线程还跟很多因素有关,例如对数据实时处理的性能要求、对健壮性和安全性要求、是否要求跨平台(包括操作系统和数据库)及是否需要分布部署。因此,在设计中应充分考虑各种因素以求做到最大利用系统资源。

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击