麻烦解释一下linux下进程和线程有什么区别和联系,linux下多线程和多进程通信的实现方法,请通俗解释

Linux下多线程和多进程程序的优缺点,各个适合什么样的业务场景~

  IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。
  如果是UNIX/linux环境,采用多线程没必要。
  多线程比多进程性能高?误导!
  应该说,多线程比多进程成本低,但性能更低。
  在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。
  多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。
  多线程是平面交通系统,造价低,但红绿灯太多,老堵车。
  我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。
  高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。

  多线程的优点:
  无需跨进程边界;
程序逻辑和控制方式简单;
所有线程可以直接共享内存和变量等;
线程方式消耗的总资源比进程方式好;
多线程缺点:
  每个线程与主程序共用地址空间,受限于2GB地址空间;
线程之间的同步和加锁控制比较麻烦;
一个线程的崩溃可能影响到整个程序的稳定性;
到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU
  
  多进程优点:
  每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
通过增加CPU,就可以容易扩充性能;
可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大
多线程缺点:
  逻辑控制复杂,需要和主程序交互;
需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
多进程调度开销比较大;
最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题……
  方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。
  

Linux 下多线程和多进程程序的优缺点,各自适合什么样的业务场景
  IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。
  如果是UNIX/linux环境,采用多线程没必要。
  多线程比多进程性能高?误导!
  应该说,多线程比多进程成本低,但性能更低。
  在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。
  多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。
  多线程是平面交通系统,造价低,但红绿灯太多,老堵车。
  我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。
  高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。

兄弟看到你这么高的分我就找了些资料:也算是对昨天学的知识总结一下吧
一、先说概念不管是windows还是linux下的进程和线程概念都是一样的,只是管理进程和线程的方式不一样,这个是前提,到时候你可别问我windows下进程和线程啊。这个涉及到操作系统原理。下面给你解答。
说道进程不得不提作业这个名词 ,我想兄弟你电脑里不会有一个程序吧对不?当你的系统启动完毕后你看看你的任务管理器里是不是有很多进程呢?那么多程序是怎么调如内存呢?能理解吗?这里要明白程序和进程的关系,程序是你磁盘上的一个文件,当你需要它时进入内存后才成为进程,好比QQ在磁盘上就是一个文件而已,只有进入了内存才成为进程,进程是活动的。QQ要扫描你文件啊,记录你聊天记录啊,偷偷上传个啥东西什么的你也不知道对不,他是活动的。这个能明白吗?
再看作业,这个作业可不是你写作业的那个作业啊。系统一看好家伙你个QQ那么大的家伙你想一下子进入内存啊?没门!慢慢来嘛,系统就把QQ程序分为好几块,这几块不能乱分的,要符合自然结构就是循环啦选择啦这样的结构,你把人家循环结构咔嚓截断了,怎么让人家QQ运行啊?这就是作业要一块一块的进入内存,同时要为作业产生JCB(JOB CONTROL BLOCK)作业控制块,你进入内存不能乱跑啊,要听系统的话,你要是进入系统自己的内存。框一下,内存不能读写 对话框就出来了,严重点直接蓝脸给你!你懂得。这是window下的,linux下直接给你报错!没事了就!所一系统通过jcb控制进程。JCB包含了进程号优先级好多内容,你打开你的windows任务管理器看看进程是不是有好多属性啊?那就是PCB(PRCESS,CONTROL BLOCK)同理作业也包含那些内容只是多少而已。下面写出进程特点:
1、进程是分配计算机资源最小的单位。你想啊人是要用程序干活的吧?你把程序调入内存成了就成了进程,所以说进程是分配资源的最小单位。你在linux下打开终端输入top命令看是不是有好多进程?
2、进程有操作系统为作业产生。有“父进程”产生“子进程”之间是父子关系,并可以继续向下产生“子进程”。还拿QQ来说,你双击QQ.exe。QQ启动了输入账号密码打开主界面了。这时候你要聊天,QQ进程赶紧产生个“儿子”说 “儿子你去陪主人聊天去吧。这样子进程产生了。突然你想看美女要传照片这时候那个”儿子“有”生“了一个”儿子“说”儿子“你去传照片。那个“儿子领到任务去传照片了。这时你想关了QQ,QQ提示你说”你还有个“儿子”和“孙子”还在干活呢你真要结束吗?你蒽了确定。QQ对他“儿子”(你聊天窗口)说:”儿子啊对不起了,主人要关闭我你也不能活啊“咔嚓一下”儿子“死了,儿子死之前对他儿子说:“儿子啊你爷爷不让我活了,你也别活了咔嚓孙子也死了。最后世界安静了。这就是进程的父子关系。能明白吗?记住:进程之活动在内存中。不能使用CPU,只管分配资源。
再说线程:线程也产生在内存中并且在内存中存在相当长的时间,但它的活动区域主要在CPU中,并且运行和灭亡都存在于CPU中,可以这么说,线程是程序中能被系统调度进入CPU中最小程序单位,它能直接使用进程分配的CPU的资源。
还拿QQ来说当你要传文件时QQ总要判断一下文件的扩展名吧,ok这时那个”儿子“赶紧对它爸爸说我需要一个线程判断扩展名QQ赶紧对一个管这个的线程说:”快点去CPU里计算下那个扩展名是什么然后向主人报告计算完了就“死了”消亡了,但是它的线程还在内存中!还等着你下一次传文件然后计算然后消亡!
线程之间是相互独立的。一个在CPU,一个在内存里还能有关系吗对不?CPU在每一个瞬间只能进入一个线程,当线程进入CPU时立即产生一个新的线程,新线程仍停留在内存中,就好比上面那个传文件还会等着你再传文件再计算扩展名。
线程相对线程是独立的,但它在内存中并不是独立的,这就好比你不开QQ能用QQ传输文件吗?它只存在与进程分配的资源中,也就是说计算扩展名这个线程只能停留在QQ这个进程中,不能跑到别的进程里!!相当于程序产生了新的进程和线程,进程向CPU申请资源,再有线程来使用,他们都是为程序服务的只是分工不同!
因为你没提问linux下是怎么管理进程和线程的所以我就不回答了,这个问题我建议你还是看看《笨兔兔的故事》里面讲到了linux是怎么管理进程和线程的。挺幽默的比我说得还好。
你第二个问题说实话我回答不了你!我想你现在连进程和线程还没理解第二个你更理解不了了你说对不?我猜的其实你用C/C++不管是在windows下编程还是在Linux下编程思想都是一样的对吧,如果你理解了在windows下线程间通信,在linux更没问题了!
参考资料:黑客手册2009合订本非安全第一二季244页,245页,328页,329页,398页,399页
浅谈操作系统原理 (一 二三)
ubuntu中文论坛 笨兔兔的故事
http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=267518
希望我的回答你能理解

这玩意还真通俗不了,区别还是很多的,而且每条都能说上大半天。。。可以先说下联系。首先Linux包括内核线程、进程、用户线程这三个概念,内核线程是在linux内核中的概念,进程通常是都是用户空间中的概念,但是由于在内核中为用户空间创建进程的时候,和创建内核线程是基本一样的,所以可以说或者可以看成一个进程对应一个内核线程,但还有内核线程不是用于服务进程的。而用户线程不是内核的概念,换句话说用户线程对于内核来说一无所知,所以从这个角度说进程和用户线程一点关系都没有。由于线程通常是由线程库提供的,例如posix线程库、cthread线程库等,这些线程库是用户空间动态链接库,所以哪个进程调用这个库,线程以及线程管理、调度程序就在哪个进程里,不同进程调用的库所带来的线程、线程管理都相互无关。这就是联系了。现在说区别,讨论区别要分类看,首先是调度:进程调度由内核来调度,进程在内核里有内核线程来支持,一个内核线程自然包含一套数据结构来存储相关信息;用户线程是库文件支持的,所以数据结构定义、调度函数都在库里,当然为了提高用户线程的被调度的权限以及实时性等优势,有的线程库已经通过一些方式让内核知道用户线程的存在,这是更远的话题了。再看内存:最常说的一句话就是进程有独立的内存空间而线程没有,含义是每个进程有自己的一套页表,一套页表就意味着一个完整的内存空间,比如32位操作系统里就是2G或者3G的空间(视不同的CPU和操作系统内核实现方式),由于进程在内核里有自己的地位,所以更换进程就能更换整个页表;线程在内核里没有地位,所以只要进程没换,线程换了,页表还是没变,所以大家的空间一样,这个时候只能靠程序员自己去保护各个线程以及线程库的能力,举个例子:我变了一个程序a.exe和另一个程序b.exe,让b的源码里有个函数叫abc(),在a的源码里我不可能直接调用abc(),因为编译完了,即使我告诉编译器abc()函数在b.exe里的地址给a源码,在运行时a.exe进程空间里的那个地址放的绝对不是b里的abc()函数,这时只能使用远程调用,一个远程调用的过程基本上和一次网络上两个机子传递一次数据包差不多,可见对于操作系统来说a和b进程里的东西与两台机子上的东西一样,相互隔离相互独立。这两类区别还会引申出很多细节上的区别,但都归根于这两点。希望对你有帮助

区别和联系:
1、进程是独立运行的实体,有独立的资源分配;
2、同一进程的线程之间共享进程的资源;
3、所有的进程至少有一个执行线程;
4、线程的创建和切换代价比进程的小;

线程间的通信方法:
1、同一进程的线程之间通信的最简单办法就是使用全局变量;
2、不同进程的线程之间通信需要通过下面进程间的通信来实现;

进程间的通信方法:
1、管道
2、信号量
3、共享内存
4、消息队列
5、套接字

什么是Linux线程?
专业点的说法,线程被定义为一个独立的指令流,它本身的运转由操作系统来安排,但是,这意味着什么呢?对软件开发者来说,解释线程最好的描述就是"procedure"可以独立于主程序运行。再进一步,设想一个包含了大量procedure的主程序,然后想象所有这些procedure在操作系统的安排下一起或者独立的运行,这就是对于多线程程序的一个简单描述。问题是,它是如何实现的呢?在弄懂线程之前,第一步要搞清楚Unix进程。进程被操作系统创建,并需要相当多的"开支",进程包含如下程序资源和程序执行状态信息:进程ID,进程群组ID,用户ID,群组ID环境工作目录程序指令寄存器栈堆文件描述符信号动作共享库进程间通信工具(例如消息队列,管道,信号量,共享内存)

Unix进程Unix进程内部的线程

线程使用和在进程内的生存,仍由操作系统来安排并且独立的实体来运行,很大程度上是因为它们为可执行代码的存在复制了刚刚好的基本资源。这个独立的控制流之所以可以实现,是因为线程维护着如下的东西:栈指针寄存器调度属性(例如规则和优先级)等待序列和阻塞信号线程拥有的数据

所以,总的来说,Unix环境里的线程有如下特点:它生存在进程中,并使用进程资源;拥有它自己独立的控制流,前提是只要它的父进程还存在,并且OS支持它;它仅仅复制可以使它自己调度的必要的资源;它可能会同其它与之同等独立的线程分享进程资源;如果父进程死掉那么它也会死掉--或者类似的事情;它是轻量级的,因为大部分的开支已经在它的进程创建时完成了。因为在同一进程内的线程分享资源,所以:一个线程对共享的系统资源做出的改变(例如关闭一个文件)会被所有的其它线程看到;指向同一地址的两个指针的数据是相同的;对同一块内存进行读写操作是可行的,但需要程序员作明确的同步处理操作.

程序的一次执行叫一个进程,每个进程有独立的堆栈段、代码段、数据段。而且进程是系统进行资源分配和调度的最小单位,多进程之间是拥有独立的内存单元的。

线程是进程的一个实体,是CPU调度和分派的基本单位,可以和隶属与同一个进程的其它线程共享进程所拥有的全部资源。同一个进程中的多个线程可以并发执行,多线程之间拥有共享的内存单元,这样以提高执行效率。

这样说吧,一个程序至少包含一个进程,一个进程至少包含一个线程。

进程的创建:fork()
线程的创建:pthread_create()

进程间通信主要是管道、消息队列、信号量等等,搜缩关键字IPC一大把,这里就不说了。

同一进程的线程间通信主要是全局变量,上面说了,这些线程之间拥有共享的内存单元嘛,也就是共享的数据段。

而不同进程的线程间的通信,主要是借助了进程间通信的机制实现了啊

linux进程分为linux进程分配
答:3.如果使用并行的方式下载,那么这些文件就会一次同时下载多个文件,而不是等待上一个下载完后才继续下载接下来的,大大的提高了下载效率。linux进程调度详解?linux进程调度:无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理...

在LINUX内核中,进程标识符PID为1,2 ,3,4,5的进程的名称是什么?基本功 ...
答:pid=1 :init进程,系统启动的第一个用户级进程,是所有其它进程的父进程,引导用户空间服务。pid=2 :kthreadd:用于内核线程管理。pid=3 :migration,用于进程在不同的CPU间迁移。pid=4 :ksoftirqd,内核里的软中断守护线程,用于在系统空闲时定时处理软中断事务。pid=5 :watchdog,此进程是看门狗...

linux ps命令显示一个特定的进程信息,如下说明
答:使用ps获取有关系统当前进程的更完整信息的常用方便方法是使用以下方法:ps -aux | less ps显示的进程可以限制为属于任何给定用户的进程,方法是通过grep(一种用于搜索文本的过滤器)输出输出。例如,属于具有用户名adam的用户的进程可以使用以下内容显示:ps -ef | grep adam Linux 下 取进程占用 cpu ...

在linux中进程的状态都有哪些?在什么情况下发生转化
答:进程状态包括以下五种:(1)TASK_RUNNING(运行态):进程是可执行的;或者正在执行,或者在运行队列中等待执行。(2)TASK_INTERRUPTIBLE(可中断睡眠态):进程被阻塞,等待某些条件的完成。一旦完成这些条件,内核就会将该进程的状态设置为运行态。(3)TASK_UNINTERRUPTIBLE(不可中断睡眠态):进程被...

linux进程的查看和调度
答:在RHEL等系统中,cond_resched()的主动让出CPU策略是内核抢占的常见做法。而内核抢占时机的把握,如在中断处理前的检查或从非抢占模式切换到抢占模式时,都体现了Linux调度的精细之处。深入理解Linux的进程调度机制,对于优化系统性能、提升应用响应速度至关重要。通过熟练掌握这些原理,你将能更好地掌控进程...

unix/linux系统有几类进程,试说明后台进程的作用或执行过程
答:4. Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态, 不可处理signal, 因为根本没有时间片运行代码 5. Linux进程状态:Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。不可被kill, 即不响应任务信号, 无法用SIGKILL杀死 建议你搜索一本免费的书《linux就该这么...

Linux系统中的进程调度介绍
答:而进程调度究竟有多重要呢? 首先,我们需要明确一点:进程调度是对TASK_RUNNING状态的进程进行调度(参见《linux进程状态浅析》)。如果进程不可执行(正在睡眠或其他),那么它跟进程调度没多大关系。所以,如果你的系统负载非常低,盼星星盼月亮才出现一个可执行状态的进程。那么进程调度也就不会太重要。哪个进程可执行,就让...

linux怎么看进程
答:linux怎么查看正在运行的进程呢,下面就让我们来看看吧。1、打开linux系统,在linux的桌面的空白处右击。2、在弹出的下拉选项里,点击打开终端。3、在终端窗口中输入ps -ef来查看所有正在运行的进程。4、也可以使用ps axu来查看。

linux 下 进程和线程的区别
答:二者的联系:一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。二者的区别:主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程...

linux进程启动时间linux进程启动
答:启动:nohup./standalone.sh 查看Jboss启动进程:tail-fnohup.out 5,查看该服务器上启动了多少个Jboss,可以讲不要的进程杀掉kill-9PID。6,如果觉得后台启动麻烦,可以使用前台启动的方式,不过当你ctrl+C时,就会停止Jboss。linux怎么查看某个进程执行的文件路径?linux下进程运行后,进程信息存储在/...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网