如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
多线程和多进程的区别小结很想写点关于多进程和多线程的东西我确实很爱他们。但是每每想动手写点关于他们的东西却总是求全心理作祟始终动不了手。今天终于下了决心写点东西以后可以再修修补补也无妨。一.为何需要多进程或者多线程为何需要并发这个问题或许本身都不是个问题。但是对于没有接触过多进程编程的朋友来说他们确实无法感受到并发的魅力以及必要性。我想只要你不是整天都写那种intmain到底的代码的人那么或多或少你会遇到代码响应不够用的情况也应该有尝过并发编程的甜头。就像一个快餐点的服务员既要在前台接待客户点餐又要接电话送外卖没有分身术肯定会忙得你焦头烂额的。幸运的是确实有这么一种技术让你可以像孙悟空一样分身灵魂出窍乐哉乐哉地轻松应付一切状况这就是多进程/线程技术。并发技术就是可以让你在同一时间同时执行多条任务的技术。你的代码将不仅仅是从上到下从左到右这样规规矩矩的一条线执行。你可以一条线在main函数里跟你的客户交流另一条线你早就把你外卖送到了其他客户的手里。所以为何需要并发因为我们需要更强大的功能提供更多的服务所以并发必不可少。二.多进程什么是进程。最直观的就是一个个pid官方的说法就进程是程序在计算机上的一次执行活动。说得简单点下面这段代码执行的时候expandsourceviewplaincopytoclipboardprint进入main函数这就是一个进程进程pid会打印出来然后运行到return该函数就退出然后由于该函数是该进程的唯一的一次执行所以return后该进程也会退出。看看多进程。linux下创建子进程的调用是forkexpandsourceviewplaincopytoclipboardprintiamthechildprocessmyprocessidis15806theexitpid15806iamtheparentprocessmyprocessidis15805theexitpid15805这是gcc测试下的运行结果。关于fork函数功能就是产生子进程由于前面说过进程就是执行的流程活动。那么fork产生子进程的表现就是它会返回2次一次返回0顺序执行下面的代码。这是子进程。一次返回子进程的pid也顺序执行下面的代码这是父进程。为何父进程需要获取子进程的pid呢这个有很多原因其中一个原因看最后的wait就知道父进程等待子进程的终结后处理其task_struct结构否则会产生僵尸进程扯远了有兴趣可以自己google。如果fork失败会返回-1.额外说下atexitprint_exit需要的参数肯定是函数的调用地址。这里的print_exit是函数名还是函数指针呢答案是函数指针函数名永远都只是一串无用的字符串。某本书上的规则函数名在用于非函数调用的时候都等效于函数指针。说到子进程只是一个额外的流程那他跟父进程的联系和区别是什么呢我很想建议你看看linux内核的注解有兴趣可以看看那里才有本质上的了解总之fork后子进程会复制父进程的task_struct结构并为子进程的堆栈分配物理页。理论上来说子进程应该完整地复制父进程的堆栈以及数据空间但是2者共享正文段。关于写时复制由于一般fork后面都接着exec所以现在的fork都在用写时复制的技术顾名思意就是数据段堆栈一开始并不复制由父子进程共享并将这些内存设置为只读。直到父子进程一方尝试写这些区域则内核才为需要修改的那片内存拷贝副本。这样做可以提高fork的效率。三.多线程线程是可执行代码的可分派单元。这个名称来源于执行的线索的概念。在基于线程的多任务的环境中所有进程有至少一个线程但是它们可以具有多个任务。这意味着单个程序可以并发执行两个或者多个任务。简而言之线程就是把一个进程分为很多片每一片都可以是一个独立的流程。这已经明显不同于多进程了进程是一个拷贝的流程而线程只是把一条河流截成很多条小溪。它没有拷贝这些额外的开销但是仅仅是现存的一条河流就被多线程技术几乎无开销地转成很多条小流程它的伟大就在于它少之又少的系统开销。当然伟大的后面又引发了重入性等种种问题这个后面慢慢比较。还是先看linux提供的多线程的系统调用intpthread_createpthread_trestricttidpconstpthread_attr_trestrictattrvoidstart_rtnvoidvoidrestrictargReturns0ifOKerrornumberonfailure第一个参数为指向线程标识符的指针。第二个参数用来设置线程属性。第三个参数是线程运行函数的起始地址。最后一个参数是运行函数的参数。expandsourceviewplaincopytoclipboardprint这个多线程的例子应该很明了了主线程做自己的事情生成2个子线程task1为分离任其自生自灭而task2