多进程多线程并发服务器课件.pptVIP

  1. 1、本文档共10页,可阅读全部内容。
  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文档。上传文档
查看更多

第5章并发服务器

并发服务器目录服务器分类nnnn进程与线程多进程服务器多线程服务器

服务器分类按连接类型分类面向连接的服务器(如tcp)nnn面向无连接的服务器(如udp)n按处理方式分类迭代服务器n并发服务器n

迭代服务器vs.并发服务器服务器主进程绑定地址绑定地址服务器子进程监听连接接收连接监听连接接收连接处理连接关闭监听套接字处理连接接收请求处理请求返回响应创建子进程关闭连接套接字终止子进程关闭连接套接字断开连接TCP迭代服务器TCP并发服务器

“进程”基本概念进程定义了一个计算的基本单元,可以认为是一个程序的一次运行。它是一个动态实体,是独立的任务。它拥有独立的地址空间、执行堆栈、文件描述符等。n每个进程拥有独立的地址空间,进程间正常情况下,互不影响,一个进程的崩溃不会造成其他进程的崩溃。nn当进程间共享某一资源时,需注意两个问题:同步问题和通信问题。

创建进程#includesys/types.h#includeunistd.hpid_tfork(void)返回:父进程中返回子进程的进程ID,子进程返回0,-1-出错fork后,子进程和父进程继续执行fork()函数后的指令。n子进程是父进程的副本。子进程拥有父进程的数据空间、堆栈的副本。但父、子进程并不共享这些存储空间部分。如果代码段是只读的,则父子进程共享代码段。如果父子进程同时对同一文件描述字操作,而又没有任何形式的同步,则会出现混乱的状况;父进程中调用fork之前打开的所有描述字在函数fork返回n之后子进程会得到一个副本。fork后,父子进程均需要将自己不使用的描述字关闭,有两方面的原因:(1)以免出现不同步的情况;(2)最后能正常关闭描述字

#includestdlib.h#includestdio.hmain(){inti,sum;sum=0;for(i=0;i=2;i++){sum=sum+i;printf(“i=%d\n,i);}printf(sum=%d\n,sum);}

intmain(void){pid_tpid;intstatus;if((pid=fork())==0){sleep(2);printf(childrunning.\n);printf(childsleeping.\n);sleep(2);printf(childdead.\n);exit(0);}elseif(pid0){printf(parentrunning.\n);printf(parentexit\n);exit(0);}else{printf(forkerror.\n);exit(1);}}

创建进程(cont.)#includesys/types.h#includeunistd.hpid_tvfork(void);在BSD3.0中开始出现,主要为了解决fork昂贵的开销。它n是完全共享的创建,新老进程共享同样的资源,完全没有拷贝。两者的基本区别在于当使用vfork()创建新进程时,父进程n将被暂时阻塞,而子进程则可以借用父进程的地址空间。这个奇特状态将持续直到子进程退出或调用execve()函数,至此父进程才继续执行。

intmain(void){pid_tpid;intstatus;if((pid=vfork())==0){sleep(2);printf(childrunning.\n);printf(childsleeping.\n);sleep(2);printf(childdead.\n);exit(0);}elseif(pid0){printf(parentrunning.\n);printf(parentexit\n);exit(0);}else{printf(forkerror.\n);exit(1);}}

运行的结果:

终止进程进程的终止存在两个可能:父进程先于子进程终止(init进程领养)子进程先于主进程终止nnnn对于后者,系统内核为子进程保留一定的状态信息:进程ID、终止状态、CPU时间等;当父进程调用wait或waitpid函数时,获取这些信息;(什么叫“僵尸进程”?)当子进程正常或异常终止时,系统内核向其父进程发送SIGCHLD信号;缺省情况下,父进程忽略该信号,或者提供一个该信号发生时即被调用的函数。n

终止进程(续)#includestdlib.hvoidexit(intstatus);本函数终止调用进程。关闭所有子进程打开的描述符,向父进程发送SIGCHLD信号,并返回状态。n

获取子进程终止信息#includesys/types.h#includesys/wait.hpid_twait(in

您可能关注的文档

文档评论(0)

113541236359 + 关注
官方认证
文档贡献者

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

认证主体成都谚晨心动科技文化有限公司
IP属地四川
统一社会信用代码/组织机构代码
91510104MAD14BYH9L

1亿VIP精品文档

相关文档