【精品】Linux网络编程 并发服务器精品ppt课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《【精品】Linux网络编程 并发服务器精品ppt课件.ppt》由会员分享,可在线阅读,更多相关《【精品】Linux网络编程 并发服务器精品ppt课件.ppt(78页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux网络编程并发服务器2第六单元 并发服务器6.1服务器的分类6.2多进程并发服务器6.3多线程服务器3服务器分类按连接类型分类面向连接的服务器(如TCP)面向无连接的服务器(如UDP)按处理方式分类迭代服务器并发服务器4绑定地址监听连接接收连接处理连接断开连接接收请求处理请求返回响应TCP迭代服务器绑定地址监听连接接收连接创建子进程关闭连接套接字处理连接关闭连接套接字终止子进程关闭监听套接字服务器主进程服务器子进程TCP并发服务器迭代服务器vs.并发服务器5迭代服务器vs.并发服务器迭代服务器一次响应一个客户。并发服务器同时响应多个客户。多进程多线程I/O多路复用:单进程,select
2、函数对监听套接字描述符、各个客户端套接字描述符进行监视。用一个新进程/线程去响应一个客户端。8第六单元 并发服务器6.1服务器的分类6.2多进程并发服务器6.3多线程服务器96.2多进程并发服务器6.2.1进程基础6.2.2进程创建6.2.3进程终止6.2.4多进程并发服务器10进程:可以认为是一个程序的一次运行。程序每次运行都是一个进程。一个动态实体,是独立的任务。它拥有独立的地址空间、执行堆栈、文件描述符等。各个进程之间既相互独立又相互影响独立:未经允许,进程之间无法访问,一个进程的崩溃不会造成其他进程的崩溃。影响:进程间可以通过某些机制进行通信,如IPC。“进程”基本概念111每个进程都
3、有一个非负整数作为唯一的进程ID,也称为PID。pstree命令可查看进程家族关系。init是第一个用户进程,PID为1除init外,每个进程都只有一个父进程(PPID),可以有一个或多个子进程。“进程”基本概念212父进程与子进程1程序执行后会产生一个进程,默认情况下只有一个进程。当程序代码中包含fork/vfork创建进程函数时,进程将创建一个新进程,称为子进程,原进程成为父进程。如果程序代码不对父进程和子进程要执行的代码相区分的话,父进程继续执行,子进程将默认执行fork/vfork以后的代码。对于子进程这是毫无意义的,所以一般都会对父子进程要执行的代码进行区分(这里注意程序代码还是同一
4、个文件,只是用if结构进行区分)13父进程与子进程2进程之间应该是独立的。一个程序中刚创建的子进程也需要有自己的资源。Linux支持三种资源拷贝方式:共享:父子进程共享通用资源,相互影响,vfork。直接拷贝:父子进程各有一份相同的资源,费时间。写时复制(copyonwrite):虚拟内存拷贝过程费时,所以只有两个进程中的任一个试图修改某内存页时,才进行对该内存页的拷贝,否则将一直共享,fork。服务器按照处理方式可分为几类?并发服务器有几种方式?三种资源拷贝方式是什么?156.2多进程并发服务器6.2.1进程基础6.2.2进程创建6.2.3进程终止6.2.4多进程并发服务器16#includ
5、e#includepid_tfork(void)返回:父进程中返回子进程PID,子进程返回0,出错返回-1。创建进程fork17fork后,子进程和父进程继续执行fork()函数后的指令,至于先后次序,要根据内核使用的进程调度算法,一般来说是新进程优先。父子进程对资源采用写时复制(copyonwrite)方式。父进程中调用fork之前打开的所有描述字在函数fork返回之后子进程会得到一个副本。fork后,父子进程均需要将自己不使用的描述字关闭。创建进程fork18#include#includepid_tvfork(void);该系统调用基本上与fork相同,在BSD3.0中开始出现,主要为解
6、决fork进行复制时昂贵的开销。两者的基本区别在于当使用vfork()创建新进程时,父进程将被暂时阻塞,而子进程则可以借用父进程的地址空间,直到子进程退出,至此父进程才继续执行。创建进程vfork19进程练习fork调用举例pid_tid;id=fork();if(id0)perror(“fork”);exit(1);elseif(id=0)/子进程代码exit(0);else/父进程代码其他代码;说明:fork之前都是父进程执行的代码,调用fork成功后,父子进程都将继续执行调用fork以后的所有代码,直到exit或main函数return。左边例子中,执行次序:父进程:1赋值id2对if-
7、else-else语句选择执行3其他代码子进程:1fork成功后,赋值id2对if-else-else语句选择执行,由于有exit(0),所以子进程退出,否则子进程将继续执行其他代码。期间遇到exit或main函数return都会各自退出进程20进程练习/home/linuxnet/6/fork.cpid_tid;id=fork();if(id0)perror(fork);exit(1);elseif(id=0)printf(hello%dn,getpid();exit(0);else printf(“hello%dn,getpid();printf(%dprintthissentencen,
8、getpid();说明:创建子进程后,子进程和父进程都是独立的进程,两者执行的先后次序与系统的进程调度策略有关。216.2多进程并发服务器6.2.1进程基础6.2.2进程创建6.2.3进程终止6.2.4多进程并发服务器22进程的终止存在两个可能:父进程先于子进程终止此时子进程称为孤儿进程,系统会安排init进程领养该孤儿进程。子进程先于父进程终止子进程终止时,系统内核为子进程保留一定的状态信息(进程ID、终止状态、CPU时间等)并向其父进程发送SIGCHLD信号;缺省情况下,父进程忽略该信号,或者提供一个该信号发生时即被调用的函数。父进程可以调用wait或waitpid函数时,获取这些信息。如
9、果父进程不及时调用wait则子进程成为僵尸进程。终止进程23终止进程(续)#includevoidexit(intstatus);本函数终止调用进程。关闭所有子进程打开的描述符,向父进程发送SIGCHLD信号,并向父进程返回终止状态。24#include#includepid_twait(int*stat_loc);参数:stat_loc存储子进程的终止状态(一个整数);返回:成功被终止子进程的PID成功;出错-1。如果没有终止的子进程,但是有一个或多个正在执行的子进程,则该函数将堵塞,直到有一个子进程终止或者wait被信号中断时,wait返回并释放子进程所有资源。获取子进程终止信息25使用w
10、ait()函数可能会出现一个问题SIGCHLD服务器父进程服务器父进程服务器子进程服务器子进程服务器子进程服务器子进程服务器子进程服务器子进程客户客户FINFINFINSIGCHLDSIGCHLD由于由于Linux信号不排队,在信号不排队,在SIGCHLD信号同时到来后,信号同时到来后,服务器信号处理程序中调用了服务器信号处理程序中调用了wait函数,其只执行一次,函数,其只执行一次,这样将留下这样将留下2个僵尸进程。可以使用个僵尸进程。可以使用waitpid函数解决这个函数解决这个问题。问题。获取子进程终止信息26pid_twaitpid(pid_tpid,int*stat_loc,into
11、ptions);可以指定等待某个或具有某些特征的进程。pid参数意义如下:-1:要求知道任何一个子进程的返回状态(等待第一个终止的子进程);0:要求知道进程号为pid的子进程的状态;0)printf(“child%dterminatedn”,pid);想想如果仅是将wait进行循环调用结果会如何?获取子进程终止信息练习编程:创建子进程,在子进程中输出Imchild,父进程等待子进程结束后中输出Imparent。296.2多进程并发服务器6.2.1进程基础6.2.2进程创建6.2.3进程终止6.2.4多进程并发服务器30多进程并发服务器状态图服务器客户connect()函数listenfd客户/
12、服务器状态图(调用accept函数返回前)连接请求31多进程并发服务器状态图(cont.)服务器客户connect()函数listenfd客户/服务器状态图(调用accept函数返回后)connfd连接建立32多进程并发服务器状态图(cont.)服务器(父进程)客户connect()函数listenfd客户/服务器状态图(调用fork函数后)connfd连接建立服务器(子进程)listenfdconnfdfork()函数33多进程并发服务器状态图(cont.)服务器(父进程)客户connect()函数listenfd客户/服务器状态图(父进程关闭连接套接字,子进程关闭监听套接字)连接建立服务器
13、(子进程)connfd34服务器等待接收客户的连接请求一旦连接成功则显示客户地址,接着接收客户端的名称并显示;然后接收来自该客户的字符串,每当收到一个字符串时,显示该字符串,并将字符串按照恺撒密码的加密方式(K=3)进行加密,再将加密后的字符发回客户端;之后,继续等待接收该客户的信息,直到客户关闭连接。要求服务器具有同时处理多个客户请求的能力。客户端首先与相应的服务器建立连接;接着接收用户输入的客户端名称,并将其发送给服务器;然后继续接收用户输入的字符串,再将字符串发送给服务器,同时接收服务器发回的加密后的字符串并显示。之后,继续等待用户输入字符串,直到用户输入Ctrl+D,客户关闭连接并退出
14、。多进程并发服务器实例35编程创建/home/linuxnet/6目录mpserver.cP58client.cP60makefile见右编译make(边写边make)运行每个程序占用一个终端服务器:./mpserver客户端:./client127.0.0.1根据提示输入信息多运行几个客户端SMP=mpserverC=clientall:$(SMP)$(C)$(SMP):$(SMP).cgcc$-o$(C):$(C).cgcc$-o$clean:rm-f$(SMP)$(C)36服务器思路main函数socket/bind/listen-监听套接字循环accept-连接套接字fork创建子进程
15、,子进程负责处理与客户端通信process_cli父进程继续下次循环,接受下一个客户端连接process_cli函数显示客户端IP,recv接收客户端name并显示,循环接收客户端信息将其中的字母进行+3后发回给客户端关闭连接注意:fork后父子进程要分别将自己不使用的描述符关闭。37客户端思路main函数socket/connect(IP设置方法参照以前例子)调用process函数处理与服务器通信close断开连接process函数从键盘读name并发送给服务器循环调用getMessage从键盘读信息并发送给服务器,直至接收到Ctrl+D退出循环接收服务器信息并显示getMessage函数提
16、示信息,从键盘输入信息并返回,该信息可从参数sendline或返回值获得。voidprocess(FILE*fp,intsockfd)/从键盘读name并发送给服务器charsendlineMAXDATASIZE,recvlineMAXDATASIZE;intnum;printf(Connectedtoserver.n);printf(Inputclientsname:);if(fgets(sendline,MAXDATASIZE,fp)=NULL)printf(nExit.n);return;send(sockfd,sendline,strlen(sendline),0);循环:1.调用ge
17、tMessage从键盘读信息并发送给服务器,直至接收到Ctrl+D退出循环2.接收服务器信息并显示printf(nExit.n);getMessage函数:从键盘读信息char*getMessage(char*sendline,intlen,FILE*fp)printf(Inputstringtoserver:);return(fgets(sendline,MAXDATASIZE,fp);循环1.调用getMessage从键盘读信息并发送给服务器,直至接收到Ctrl+D退出循环2.接收服务器信息并显示while(getMessage(sendline,MAXDATASIZE,fp)!=NULL
18、)send(sockfd,sendline,strlen(sendline),0);if(num=recv(sockfd,recvline,MAXDATASIZE,0)=0)printf(Serverterminated.n);return;recvlinenum=0;printf(ServerMessage:%sn,recvline);41第六单元 并发服务器6.1服务器的分类6.2多进程并发服务器6.3多线程服务器426.3多线程服务器6.3.1线程基础6.3.2线程基础函数6.3.3给新线程传递参数6.3.4多线程并发服务器6.3.5线程安全函数43虽然多进程并发服务器模式很多年来都使用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 【精品】Linux网络编程 并发服务器精品ppt课件 Linux 网络 编程 并发 服务器 ppt 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内