Socket编程之多进程模型

一、多进程模型概述

        基于最初的阻塞网络 I/O ,若服务器要为多个客户端提供支持,在较为传统的手段中,多进程模型是常用的选择,即为每个客户端都分配一个进程来处理其请求。 服务器的主进程主要负责对客户连接的监听,一旦与客户端的连接成功达成,accept() 函数便会返回一个“已连接 Socket”。此时,通过 fork() 函数创建一个子进程,实际上是把父进程的所有相关内容都进行复制,涵盖了文件描述符、内存地址空间、程序计数器以及执行的代码等等。 在这两个进程刚刚完成复制的时刻,几乎毫无差异。然而,会依据返回值来辨别是父进程还是子进程。倘若返回值为 0 ,那就是子进程;要是返回值为其他的整数,那便是父进程。 正因子进程会复制父进程的文件描述符,所以能够直接运用“已连接 Socket ”与客户端进行通信。 可以看到,子进程无需关注“监听 Socket”,仅需留意“已连接 Socket”;而父进程则相反,将客户服务交由子进程处理,故而父进程不必关心“已连接 Socket”,只需重视“监听 Socket”。

下面这张图描述了从连接请求到连接建立,父进程创建生子进程为客户服务。

二、多进程模型服务端代码

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
#include<sys/socket.h>
#include<netinet/ip.h>
#include<arpa/inet.h> 

#define SERROPT 8000  // 定义服务器端口号
#define SERIP "192.168.117.127"  // 定义服务器 IP 地址

int main(int argc, char* argv[])                                                                                                                                               
{
    // 创建一个套接字 
    // socket参数:1.协议类型 2.流式套接字 3.传 0(默认 TCP 协议)
    int lfd = socket(AF_INET, SOCK_STREAM, 0);  // 创建一个 TCP 套接字,返回文件描述符 lfd
    struct sockaddr_in seraddr, cliaddr;  // 定义服务器和客户端的地址结构体
    seraddr.sin_family = AF_INET;  // 设置服务器地址结构体的协议族为 IPv4
    seraddr.sin_port = htons(SERROPT);  // 设置服务器端口号,将主机字节序转换为网络字节序
    seraddr.sin_addr.s_addr=INADDR_ANY;  // 设置服务器的 IP 地址为任意可用地址
    bind (lfd, (struct sockaddr*)&seraddr, sizeof(seraddr));  // 将套接字与服务器地址绑定
    listen(lfd,64);  // 监听套接字,设置最大等待连接数为 64
    socklen_t clilen = sizeof(cliaddr);  // 客户端地址结构体长度
    while(1)  // 无限循环,持续接受客户端连接
    {
        int scfd = accept(lfd, (struct sockaddr*)&cliaddr, &clilen);  // 接受客户端连接,返回新的套接字描述符 scfd
        int pid =fork();  // 创建子进程
        if(pid == 0)  // 如果是子进程
        {
            close(lfd);  // 关闭父进程的监听套接字
            while(1)  // 子进程中的无限循环,用于处理与客户端的通信
            {
                char buf[1024];  // 定义接收缓冲区
                int rr = read(scfd, buf, sizeof(buf));  // 从客户端读取数据到缓冲区,返回读取的字节数
                write(STDERR_FILENO, buf, rr);  // 将读取的数据写到标准错误输出
                write(scfd, buf, rr);  // 将数据反射回客户端,证明客户端已接收
            }
        }
    }
    return 0;      
} 

Ip地址换成自己虚拟机Ip地址,运行服务器再创建一个终端输入命令(nc  你的ip地址  你设置的端口号)就可以连接到服务器进行通讯。

三、多进程模型注意事项及不足

注意事项:

  • 当子进程结束运行并退出后,尽管它不再处于活动状态,但内核仍会保留一些关于它的基本信息,比如进程的退出状态等。这些保留的信息会占用一定的内存空间,如果父进程不及时进行回收处理,子进程就会变成僵尸进程。僵尸进程持续累积会不断消耗系统的内存等资源,最终可能导致系统资源匮乏,影响整个系统的正常运行。
  • 为了避免子进程成为僵尸进程,父进程需要承担“善后”的责任。具体的处理方式有两种,即调用 wait() 函数和 waitpid() 函数。这两个函数可以让父进程获取子进程的退出状态等信息,并释放子进程所占用的系统资源。

不足之处:

  • 谈到使用多个进程来服务多个客户端的模式。在客户端数量较少,比如只有 100 个的时候,这种方式可能还能满足需求。但是当客户端数量大幅增加到一万个时,这种方式就会面临严重的问题。因为创建每个进程都会消耗系统的资源,比如内存、CPU 时间等。
  • 进程间上下文切换也是一个关键问题。当从一个进程切换到另一个进程时,不仅需要切换用户空间的资源,例如虚拟内存的映射、栈中的数据、全局变量的值等;还需要切换内核空间的资源,像内核堆栈的内容以及各种寄存器的值。这种大量且频繁的上下文切换会带来巨大的开销,导致系统性能显著下降。
  • 例如,假设有一个服务器同时处理多个文件下载的进程。当进程数量较少时,系统能够轻松应对。但如果同时有大量的下载请求,每个请求都创建一个进程,系统可能会因为资源消耗过度和频繁的上下文切换而变得缓慢甚至崩溃。
  • 再比如,在一个多进程的数据库服务器中,如果进程数量过多且上下文切换频繁,可能会导致查询响应时间延长,影响用户体验。

总之,多进程模型在处理少量客户端时可能可行,但在面对大规模客户端时存在诸多限制和问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/729424.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频云沉浸式音视频技术能力探索与建设

概述 随着传输技术、显示技术与算力的持续提升&#xff0c;用户对于音视频体验的需求在提高&#xff0c;各家设备厂商也在探索和推出对应的技术与产品。打造空间感的空间视频与空间音频是其中最为关键的2项技术&#xff0c;bilibili视频云在这两项技术领域也进行了相关代探索与…

redis.conf 参数详解,方便进行性能优化配置

以下是redis.conf中一些常见参数的详细说明&#xff1a; daemonize&#xff1a;是否以后台进程运行&#xff0c;默认为no&#xff1b; pidfile&#xff1a;如以后台进程运行&#xff0c;则需指定一个pid&#xff0c;默认为/var/run/redis.pid&#xff1b;bind&#xff1a;绑定主…

WPF——属性

一、属性 类最初只有字段与函数&#xff0c;字段为一个变量&#xff0c;访问权限可以是private&#xff0c;protected&#xff0c;public。而将字段设为private&#xff0c;不方便外界对类数据的操作&#xff0c;但是将字段设为public又怕外界对数据进行非法操作&#xff0c;于…

二叉树-二叉搜索树的最近公共祖先

目录 一、问题描述 二、解题思路 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 这个问题和之前做过的问题很相似&#xff1a; 深度优先遍历-在二叉树中找到两个节点的最近公共祖先-CSDN博客文章浏览阅读80次。java刷题&#xff1a;在二叉树中找到两个结点的最近公…

用于快速充电站的 AC/DC 转换器概述

电动汽车构成了未来实现可持续交通部门的有前途技术的主要部分。AC/DC 转换器是扩展和改进 EV 功能的骨干组件。本文概述了 AC/DC 转换器、充电站类型、传统两电平 (2L) AC/DC 转换器面临的问题以及使用多电平转换器 (MLC) 的重要性。 AC/DC 充电器示意图&#xff08;&#xff…

2024广东省职业技能大赛云计算赛项实战——Minio服务搭建

Minio服务搭建 前言 这道题是比赛时考到的&#xff0c;没找到具体题目&#xff0c;但在公布的样题中找到了&#xff0c;虽然很短~ 使用提供的 OpenStack 云平台&#xff0c;申请一台云主机&#xff0c;使用提供的软件包安装部署 MINIO 服务并使用 systemctl 管理 Minio是一个…

关于接口测试——自动化框架的设计与实现

一、自动化测试框架 在大部分测试人员眼中只要沾上“框架”&#xff0c;就感觉非常神秘&#xff0c;非常遥远。大家之所以觉得复杂&#xff0c;是因为落地运用起来很复杂&#xff1b;每个公司&#xff0c;每个业务及产品线的业务流程都不一样&#xff0c;所以就导致了“自动化…

Linux_理解进程地址空间和页表

目录 1、进程地址空间示意图 2、验证进程地址空间的结构 3、验证进程地址空间是虚拟地址 4、页表-虚拟地址与物理地址 5、什么是进程地址空间 6、进程地址空间和页表的存在意义 6.1 原因一&#xff08;效率性&#xff09; 6.2 原因二&#xff08;安全性&#xff09; …

MVC模式中控制器、视图和模型之间的关系如何?

mvc模式将应用程序逻辑与表示层分离&#xff0c;包括控制器、视图和模型三个组件&#xff1a;控制器&#xff1a;协调用户输入&#xff0c;获取模型数据&#xff0c;验证输入&#xff0c;执行业务规则。视图&#xff1a;显示模型数据&#xff0c;不包含业务逻辑。模型&#xff…

如何使用AI解决所有EXCEL公式问题

有个假设前提&#xff0c;你略懂EXCEL公式 知道单元格“ $C1” 和 ”C1”的区别&#xff0c;当然你也可以自行度娘或问AI。 AI使用文心一言免费版方便容易获取。 第一步也是唯一的一步&#xff0c;向AI准确描述你的需求 示例&#xff1a;学生的成绩分布在0-100分之间&#x…

echarts+vue2实战(一)

目录 一、项目准备 二、(横向分页)柱状图 2.1、动态刷新 2.2、UI调整 2.3、分辨率适配 三、(竖向平移)柱状图 3.1、平移动画 3.2、不同数值显示不同颜色 四、(下拉切换)折线图 4.1、切换图表和分辨率适配 4.2、UI调整 五、(三级分类)饼图 5.1、数据切换 六、圆环…

dial tcp 10.96.0.1:443: connect: no route to host

1、创建Pod一直不成功&#xff0c;执行kubectl describe pod runtime-java-c8b465b98-47m82 查看报错 Warning FailedCreatePodSandBox 2m17s kubelet Failed to create pod sandbox: rpc error: code Unknown desc failed to setup network for…

java8 将对象list中的某一个属性取出组成一个list

实体类 public class Sp {String spdm;String spmc;public Sp() {}public Sp(String spdm, String spmc) {this.spdm spdm;this.spmc spmc;}public String getSpdm() {return spdm;}public void setSpdm(String spdm) {this.spdm spdm;}public String getSpmc() {return sp…

太爱这种数据可视化效果,零售行业的都看过来

在当今数字化浪潮下&#xff0c;数据可视化已成为零售行业洞察市场趋势、优化运营决策的关键技术。奥威BI零售数据分析方案凭借其卓越的数据可视化效果&#xff0c;成为零售企业的得力助手。接下来就通过BI节假日分析报表来简单地感受一下。 注&#xff1a;该BI节假日分析报表…

反激开关电源输出电解电容选型及计算

电容高频模型&#xff1a;ESRESLC的串联 1、耐压&#xff1a;根据输出的电压来取&#xff0c;需留一定余量&#xff0c;比如5V输出可以选6.3V或者10V的电解电容 2、容量 纹波电压 电容充放电引起的纹波电压&#xff08;与电容容量存在着直接因果关系&#xff09; ESR引起的纹…

校园任务平台系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;任务咨询管理&#xff0c;用户管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;任务资讯公告&#…

Springboot 实体类赋默认值 @Value 失效? 那怎么搞?

这是最近一个小伙找上来问的问题&#xff0c; 我初一看还没看出来啥猫腻&#xff0c;后面认真一想&#xff0c;决定也写下来记录下&#xff0c;给其他初学者也知道下。 原先思路错误代码&#xff1a; 这个小伙想利用 Value 注解&#xff0c; 给这个属性 赋值&#xff0c;defaul…

js 实现将后端请求来的 Blob 数据保存到用户选择的任意目录

js实现将后端请求来的 Blob 数据保存到用户选择的任意目录 实现方式 实现方式 实现方式是使用 window 的 showSaveFilePicker 方法。Window 接口的 showSaveFilePicker() 方法用于显示一个文件选择器&#xff0c;以允许用户保存一个文件。可以选择一个已有文件覆盖保存&#xf…

快手电商:618大促开启以来,短视频挂车GMV同增66%

日前&#xff0c;快手电商发布618大促阶段战报。数据显示&#xff0c;在5月20日-6月18日活动期间&#xff0c;平台动销商家数同比增长26%&#xff0c;动销中小商家数同比增长28%&#xff0c;动销中小商家订单量同比增长25%。 从经营场域来看&#xff0c;泛货架场已成为快手电商…

纯css星空动画

让大家实现一个这样的星空动画效果,大家会怎么做? js,不! 其实使用css就能写 我也不藏着掖着,源码直接放下面了 <script setup></script><template><div class"box"><div v-for"i in 5" :key"i" :class"layer…