首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

进程与线程!该如何处理

2012-04-17 
进程与线程!!!!!!在linux1当我们程序设计的时候什么情况下考虑用线程而不用进程来设计程序?2当程序设计的

进程与线程!!!!!!
在linux
1当我们程序设计的时候什么情况下考虑用线程而不用进程来设计程序?
2当程序设计的时候如果用进程和线程都可以选用的话,那在哪些实际情况下考虑用进程?哪些情况用线程会更好一点??

最好能结合例子,不要纯概念~~~

[解决办法]
liulili问的问题都不是一两句话说的清的,呵呵,先赞一下你的好学

LINUX下的线程到底是个啥样子的呢?
其实在linux操作系统中,内核空间是通过进程模拟线程的,在用户空间用pthread创建线程。线程又称为轻量级进程 (LWP),是程序执行的最小单位。
线程也具有一段可执行的程序、专用的系统堆栈空间、私有的task_struct(我们知道LINUX每个进程都有这样一个结构),但是没有自己的存储空间
那它们有什么区别呢?
线程不能够单独执行,它必须运行在处于活动状态的进程中;多个线程共享同一进程除cpu以外的所有资源,各线程间允许任务协作和数据交换。创建线程比进程开销小,多线程间通信也比多进程间的通信过程简单。简而言之,线程只不过是进程的一个执行上下文
通常单独一个程序运行时,缺省的包含一个主线程,主线程以函数地址的形式(如main函数)提供程序的启动点,这就是单进程单线程的情况。若在main函数中创建多个线程,则该程序运行时,操作系统为每个线程分配不同的CPU时间片,并根据线程优先级进行调度。由于每个时间片时间很短,看上去好象各个线程是并发执行的,实际上同一时刻只有一个线程在运行,这就是单进程多线程的情况。若用fork函数创建多个进程,而每个进程只采用默认的一个主线程,则程序运行时,由内核调度操作系统,将cpu分配给各个进程使用,这就是多进程的情况。
OK,了解了进程与线程的区别,那么我们再来看看它们各有什么好处?
对单CPU来说,,采用多进程单线程(每个进程只创建一个线程)和单进程多线程(一个进程创建多个线程)模型来设计程序,后者(多线程)的上下文切换开销就比前者要小的多。但是多线程也有一些缺点:首先它们会相互干扰,另外有些库函数不支持多线程,OK此时多线程调用此库函数就会结果未知了,此时大家常用做法就是线程锁来同步多线程库函数的调用,另外多线程的健壮性不好,一个COREDUMP,全部完完
对于一个LINUX下开发人员来说,多线程多进程模式都是必须掌握的

再后简单的分析一下两者的性能差别,说的不对别丢臭鸡蛋

我们说的性能一般是指CPU, 内存(空间)与程序运行时间(时间)是三个最重要资源
当你创建大量的进程或者线程时,多线程的建立不会产生额外的内存占用,因为采用的是内存共享机制,而多进程会多占用内存,在重复量大的时候多进程的速度要快于多线程,不过它是以多占内在为前提的,"空间换时间",而多线程因为共享所以会有同步,这就会带来同步的开销
但是多线程的创建开销非常小,如果采用一个请求就创建一个线程(进程)的模式,这时多线程在创建的优势就体现出来了,而且创建多线程不要担虑内存不足,但是这里有个极限,随着线程数的增加性能上并不会线性增加,有此反而会降低,这是为什么呢?因为线程数增加,加大CPU的任务量,增加了上下文切换的开销,所以我的经验是多线程一般线程数与CPU个数相等性能最优

可见当待完成的任务量较大而系统设备性能较好时,可以通过创建多个进程在最短的时间内完成任务;当系统的内存较小而对实时性的要求不高时,倾向于创建多线程

不知道这说了这么多,对你有没帮助
呵呵






[解决办法]
我只熟悉Linux下的进程与线程,也只对Linux说一下我的观点,供参考:

我是这么理解的,进程是系统用来管理资源分配的实体,而线程是进程内的执行流实体。所以同一进程内的线程共用了进程内的系统资源(包括内存空间及文件句柄等)。
这样,启动一个新线程的代价远远小于启动一个新进程的代价,因为不需要重新分配新的资源(如分配内存空间)。所以当你需要频繁的启动任任务来处理某一事件时可以考虑使用多线程,但如果用进程池的话,这个多线程的好处也不那么明显了。
线程共用了进程内的所有资源,这是一把双刃剑,一方面线程间的通讯看似变得更简单了,因为可以通过直接改写内存里的数据就可以做到,而不需要进程间通讯必须显示使用不同的IPC。而另一方面,每一个线程内部的动作都可能对其它线程的执行造成影响,这样藕合性更强了,出错的风险也大大加大了,而不同的进程运行在各自的世界里,一个进程的执行不会影响其它的进程。这里可以打个比方,多线程就是一条多车道的公路,而多进程是多条单车道的公路。多车道的公路里随便一辆车乱搞就出影响整条公路,而多条单车道的公路不会出现这样的问题。

整的来说,我觉得大多数时候优先考虑多进程,多线程看似省了IPC可以简单的很多,但也带来很多其它的复杂性。



热点排行
Bad Request.