《多线程与多进程的区别.docxVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《多线程与多进程的区别

进程: 子进程是父进程的复制品.子进程获得父进程数据空间、堆和栈的复制品。线程:相对与进程而言,线程是一个更接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。根本区别:用多进程每个进程有自己的地址空间,线程则共享地址空间。所以其他区别都是由此而来的:速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内。很想写点关于多进程和多线程的东西,我确实很爱他们。但是每每想动手写点关于他们的东西,却总是求全心理作祟,始终动不了手。今天终于下了决心,写点东西,以后可以再修修补补也无妨。?一.为何需要多进程(或者多线程),为何需要并发?这个问题或许本身都不是个问题。但是对于没有接触过多进程编程的朋友来说,他们确实无法感受到并发的魅力以及必要性。我想,只要你不是整天都写那种int main()到底的代码的人,那么或多或少你会遇到代码响应不够用的情况,也应该有尝过并发编程的甜头。就像一个快餐点的服务员,既要在前台接待客户点餐,又要接电话送外卖,没有分身术肯定会忙得你焦头烂额的。幸运的是确实有这么一种技术,让你可以像孙悟空一样分身,灵魂出窍,乐哉乐哉地轻松应付一切状况,这就是多进程/线程技术。并发技术,就是可以让你在同一时间同时执行多条任务的技术。你的代码将不仅仅是从上到下,从左到右这样规规矩矩的一条线执行。你可以一条线在main函数里跟你的客户交流,另一条线,你早就把你外卖送到了其他客户的手里。?所以,为何需要并发?因为我们需要更强大的功能,提供更多的服务,所以并发,必不可少。?二.多进程什么是进程。最直观的就是一个个pid,官方的说法就:进程是程序在计算机上的一次执行活动。说得简单点,下面这段代码执行的时候[cpp]?view plaincopyprint?int?main()????{????printf(”pid?is?%d/n”,getpid()?);????return?0;????}??进入main函数,这就是一个进程,进程pid会打印出来,然后运行到return,该函数就退出,然后由于该函数是该进程的唯一的一次执行,所以return后,该进程也会退出。?看看多进程。linux下创建子进程的调用是fork();???[cpp]?view plaincopyprint?#include?unistd.h ??#include?sys/types.h????#include?stdio.h ?????????void?print_exit()??{?????????printf(the?exit?pid:%d/n,getpid()?);??}????main?()???{??????pid_t?pid;??????atexit(?print_exit?);??????//注册该进程退出时的回调函数 ????????pid=fork();???????????if?(pid??0)???????????????????printf(error?in?fork!);???????????else?if?(pid?==?0)???????????????????printf(i?am?the?child?process,?my?process?id?is?%d/n,getpid());???????????else???????????{?????????????????printf(i?am?the?parent?process,?my?process?id?is?%d/n,getpid());?????????????????sleep(2);????????????????wait();?????????}????}???i am the child process, my process id is 15806the exit pid:15806i am the parent process, my process id is 15805the exit pid:15805这是gcc测试下的运行结果。?关于fork函数,功能就是产生子进程,由于前面说过,进程就是执行的流程活动。那么fork产生子进程的表现就是它会返回2次,一次返回0,顺序执行下面的代码。这是子进程。一次返回子进程的pid,也顺序执行下面的代码,这是父进程。(为何父进程需要获取子进程的pid呢?这个有很多原因,其中一个原因:看最后的wait,就知道父进程等待子进程的终结后,处理其task_struct结构,否则会产生僵尸进程,扯远了,有兴趣可以自己google

文档评论(0)

sf197103 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档