TCP/IP网络编程笔记-ch10.多进程服务器端

      最后更新:2022-02-03 01:20:46 手机定位技术交流文章

      文章目录

      • 函数
        • 创建进程
        • 销毁僵尸进程1 wait
        • 销毁僵尸进程2 waitpid
        • 注册信号signal函数
        • alram函数
        • 信号处理函数sigaction
      • 知识点
      • 进程概念及应用
        • 并发服务器端的实现方法
        • 进程
          • **进程**
          • **进程ID**
          • "通过fork函数创建进程"
        • 进程和僵尸进程
          • 产生僵尸进程的原因
          • 销毁僵尸进程1:利用wait函数
          • 销毁僵尸进程2:利用waitpid函数
        • 信号处理
          • 向操作系统求助
          • 信号与signal函数
        • 基于多任务的并发服务器
          • 基于进程的并发服务器模型
          • 通过fork函数复制文件描述符
        • 分隔TCP的I/O程序
          • 分隔I/O程序的优点
      • 实例

      函数

      创建进程

      销毁僵尸进程1 wait

      调用此函数时,若已有子进程终止,子进程终止时传递返回值(exit函数的参数值、main函数的return返回值)将保存到该函数的参数所指内存空间。
      函数参数指向单元中还含有其他信息,通过下列宏进行分离。

      使用:

      注意:

      销毁僵尸进程2 waitpid

      使用:

      调用waitpid函数时,程序不会阻塞。

      注册信号signal函数

      例如:

      alram函数

      调用该函数后,seconds秒后将产生SIGALRM信号,若向该函数传递0,则之前对SIGALRM信号的预约将取消。如果通过该函数预约信号后未指定该信号对应处理参数,则(通过调用signal函数)终止进程,不进行任何处理。

      信号处理函数sigaction

      它类似于signal函数且能完全代替后者。它的稳定是因为:
      signal函数在UNIX系列不同操作系统中可能存在区别,但sigaction函数完全相同

      sa_handler成员保存信号处理函数的指针值(地址值)。sa_mask和sa_flags的所有位均初始化为0即可。
      使用例:

      知识点

      进程概念及应用

      按之前学习到的内容,我们可构建按序向第一个客户端到一百个客户端提供服务的服务器端。如果每个客户端的平均服务时间为0.5秒,则第100个客户端会对服务器产生相当大的不满。
      为了解决这种问题,需要使用多进程服务器端。

      并发服务器端的实现方法

      具有代表性的并发服务器端实现模型和方法

      进程

      进程

      定义:

      网上下载游戏安装到硬盘中,此时游戏是程序而非进程,当游戏进入运行状态时,开始运行程序,游戏被加载到主内存并进入运行状态,此时才可称为进程。同时运行多个该游戏,则会生成相当数量的进程,也会占用相应进程数的内存空间。

      进程是程序流的基本单位,若创建多个进程,则操作系统将同时运行。有时一个程序运行过程中也会产生多个进程。多进程服务器即其中的代表。

      进程ID

      无论进程如何创建,所有进程都会从操作系统分配到ID,此ID即"进程ID",值为大于2的整数。(1分配给操作系统启动后的(用于协助操作系统)首个进程)

      观察Linux中正在运行的进程:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lVS4ulUO-1643793849814)(https://note.youdao.com/yws/res/3/WEBRESOURCE08938302b15b4362a82be257336c63c3)]

      “通过fork函数创建进程”

      fork函数创建调用的进程副本,复制正在运行的、调用fork函数的进程,两个进程都将执行fork函数调用后的语句。因为通过同一进程复制相同的内存空间,之后的程序要根据fork函数的返回值加以区分。

      区分:

      父进程(Parent Process)指苑锦城,即调用fork函数的主体,而"子进程"(Child Process)是通过父进程调用fork函数时复制出的进程。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoLvMj0R-1643793849814)(https://note.youdao.com/yws/res/9/WEBRESOURCE02d3c6f8835bd0a051f09879f08da059)]

      进程和僵尸进程

      进程销毁和进程创建同等重要。若没有认真对待进程销毁,它们将变成"僵尸进程"来占用系统中的重要资源,这是给系统带来负担的原因之一。

      产生僵尸进程的原因

      下两个示例为调用fork函数产生子进程的终止方式:

      向exit函数传递的参数值和main函数的return语句产生值都会传递给操作系统,而操作系统不会销毁子进程,直到保存着把这些值传递给产生该子进程的父进程。
      处于这种状态下的进程即为僵尸进程。将子进程变为僵尸进程的正是操作系统。而销毁僵尸进程的方法也显然易见:

      所以父进程必须负责收回自己产生的子进程。

      后台处理:

      销毁僵尸进程1:利用wait函数

      销毁僵尸进程2:利用waitpid函数

      信号处理

      现在已经解决了进程创建和销毁的问题,但还有个问题:

      向操作系统求助

      子进程终止的识别主题是操作系统,我们引入**信号处理(Signal Handing)**机制,“信号"是在特定事件发生时由操作系统向进程发送的信息。为响应该消息,执行与消息相关的自定义操作的过程称为"处理"或"信号处理”。

      信号与signal函数

      signal函数见函数区域

      信号注册后,发生注册信号时,操作系统将调用该信号对应函数。

      alarm函数见函数区域

      sigaction函数见函数区域.

      可以利用信号处理技术来消灭僵尸进程:

      基于多任务的并发服务器

      基于进程的并发服务器模型

      之前的回声服务器端只能向一个客户端提供服务,接下来对其进行扩展,使其能同时向多个客户端提供服务。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQcW7y2T-1643793849814)(https://note.youdao.com/yws/res/6/WEBRESOURCE7d2254ef613811b6fdd44df321e7cf96)]

      如上图所示,每当有客户端请求服务时,回声服务器端都创建子进程提供服务。请求服务的客户端若有5个,则创建5个子进程提供服务。
      为完成这些任务,需以下过程:

      子进程传递套接字描述符的方法:
      子进程会复制父进程拥有的所有资源,不需要另外经过传递文件描述符的过程。

      通过fork函数复制文件描述符

      父进程将2个套接字(一个是服务器套接字,一个是与客户端连接的套接字)文件描述符复制给子进程。

      文件描述符的复制:
      套接字属于操作系统,进程拥有代表相应套接字的文件描述符,复制该文件描述符。(复制套接字后,统一端口对应多个套接字)

      注意:
      一个套接字存在2个文件描述符时,只有2个文件描述符都终止(销毁)后,才能销毁套接字。

      分隔TCP的I/O程序

      分隔I/O程序的优点

      我们已经实现的回声客户端的数据回声方式如下:

      传输数据后需等待服务器端返回的数据,因为在程序代码中重复调用了read和write函数,只能这么写的原因之一是:程序在1个进程中运行,现在可创建多个进程,因此可以分隔数据收发过程。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kYkOXvh-1643793849814)(https://note.youdao.com/yws/res/7/WEBRESOURCE382e025ce26efbd93ce488d20a77b607)]

      由上图可知

      这样为什么能简化程序实现?

      分隔I/O程序的另一个好处是:可以提高频繁交换数据的程序性能。如图:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LH3kD2ez-1643793849815)(https://note.youdao.com/yws/res/3/WEBRESOURCEe8c0c2192fd1b0ea31518e54d53b9583)]

      实例

      fork函数的调用:
      在这里插入图片描述

      创建僵尸进程实例:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zYIIZYZk-1643793849816)(https://note.youdao.com/yws/res/9/WEBRESOURCEc24d05185d03d8ac2493d49a947f9de9)]

      后台处理&实例:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBeSrjxf-1643793849816)(https://note.youdao.com/yws/res/3/WEBRESOURCE4c490682029ef13504f86f344a558e83)]

      wait函数销毁僵尸进程实例:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knC9Xa8a-1643793849816)(https://note.youdao.com/yws/res/a/WEBRESOURCE8b2fc8185ab3507dd437ab6187eaa5ba)]

      waitpid函数销毁僵尸进程实例:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLEuE2e2-1643793849816)(https://note.youdao.com/yws/res/7/WEBRESOURCE0c1844141d68978dfa96c19981925947)]

      信号处理相关示例:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cW6dZvDL-1643793849817)(https://note.youdao.com/yws/res/5/WEBRESOURCE4bcec7d3039d5b6155041bf61ac50fe5)]

      siaction函数:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XN7379W6-1643793849817)(https://note.youdao.com/yws/res/f/WEBRESOURCEebbb4c77e1a27da9a61a82246a0c1c9f)]

      信号处理技术消灭僵尸进程:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WpRTUBKi-1643793849818)(https://note.youdao.com/yws/res/7/WEBRESOURCE9a0119d452367ef4a8ef2547de2ed0a7)]

      实现并发服务器:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0QBBdUSd-1643793849818)(https://note.youdao.com/yws/res/6/WEBRESOURCE79b12edcb19e497f4084cde3bb2b11f6)]

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/17819.html

          热门文章

          文章分类