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 套接字,返回文件描述符 lfdstruct sockaddr_in seraddr, cliaddr;  // 定义服务器和客户端的地址结构体seraddr.sin_family = AF_INET;  // 设置服务器地址结构体的协议族为 IPv4seraddr.sin_port = htons(SERROPT);  // 设置服务器端口号,将主机字节序转换为网络字节序seraddr.sin_addr.s_addr=INADDR_ANY;  // 设置服务器的 IP 地址为任意可用地址bind (lfd, (struct sockaddr*)&seraddr, sizeof(seraddr));  // 将套接字与服务器地址绑定listen(lfd,64);  // 监听套接字,设置最大等待连接数为 64socklen_t clilen = sizeof(cliaddr);  // 客户端地址结构体长度while(1)  // 无限循环,持续接受客户端连接{int scfd = accept(lfd, (struct sockaddr*)&cliaddr, &clilen);  // 接受客户端连接,返回新的套接字描述符 scfdint 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.mzph.cn/web/30611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

局域网共享文件夹怎么加密?方法很简单

局域网共享文件夹是企业内部信息、数据传递沟通的重要工具&#xff0c;而为了保护共享文件夹数据安全&#xff0c;我们需要使用专业的加密软件加密保护局域网共享文件夹。下面我们就来了解一下局域网共享文件夹加密方法。 局域网共享文件夹加密 在加密共享文件夹时&#xff0c…

PyCharm新手入门

前言 在之前《Python集成开发工具的选择》一文中介绍了python初学者可以使用Jupyter Notebook&#xff0c;Jupyter Notebook简单易用&#xff0c;可以用来练习代码编写&#xff0c;但是实际生产开发环境使用这个工具是远远不够用的&#xff0c;因为实际软件开发中需要软件调试…

计算机组成原理(Wrong Question)

目录 一、计算机系统概述 *1.1 计算机发展历程 1.2 计算机系统层次结构 1.3 计算机的性能指标 二、 数据的表示和运算 2.1 数制和编码 2.2 运算方法和运算电路 2.3 浮点数的表示与运算 三、存储系统 3.1 存储器概述 3.2 主存储器 3.3 主存储器与CPU的连接 3.4 外部…

MFC扩展库BCGControlBar Pro v35.0

LINK : fatal error LNK1104: 无法打开文件“BCGCBPRO2800U140.lib” BCGControlBar v25.0版本 环境VS2015&#xff0c;在运行程序时出现提示错误 &#xff1a;LINK : fatal error LNK1104: 无法打开文件“BCGCBPRO2800U140.lib” 1、需要编译一下BGCControlBar&#xff0c;在…

串口rx + RAM + LCD

REVIEW 昨天摸鱼怪发现高两位的数据写入or读出存在问题&#xff1a; RAM 串口的简单应用-CSDN博客 1. 今日摸鱼任务 UART_RX RAM LCD 来显示一下是 rx or tx 的问题 2. 代码部分 rx_ram_lcd.v module rx_ram_lcd(input clk ,input reset_n ,input uart_rx ,output …

数据结构试题 20-21

真需要就死记吧 二叉树遍历-先序(非递归)【图解代码】_哔哩哔哩_bilibili 解释一下步骤&#xff1a; 一个循环为&#xff1a; 1.取节点 2.放右子树 3.放左子树 每次循环&#xff0c;都要从栈里取出一个节点 先放右子树&#xff0c;再放左子树 那这道题就是&#xff0c;先放1&am…

计算机组成原理必备知识点

计算机组成原理必备知识点 前言 本文档由本人复习计算机组成原理期末考试所总结&#xff0c;所有习题以及知识点的页数参考2025年王道计算机组成原理 中断处理过程 硬件完成 1.关中断 2.保存断点 3.中断服务程序寻址 中断程序完成 4.保存现场和屏蔽字 5.开中断 6.执…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验2 MAC地址,IP地址,ARP协议

一、实验目的 1.掌握计算机网络的寻址问题&#xff1b; 2.验证MAC地址与IP地址的关系&#xff1b; 3.了解ARP协议的作用。 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络…

ASP.NET MVC企业级程序设计(增删,页面水平排列,字符串拼接,非空,添加框内默认提示)

目录 题目&#xff1a; 实现过程 控制器代码 DAL BLL Index Deile 题目&#xff1a; 实现过程 控制器代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MvcApplication1.Models;namespac…

双通道-程控绝缘测试电阻箱的性能

双通道-程控绝缘测试电阻箱是高精度、高性能的电气测量设备&#xff0c;广泛应用于电力系统、电气设备、电子设备等领域。采用先进的数字式电阻测量技术&#xff0c;具有高精度、高稳定性的测量性能。其测量误差小于0.05%&#xff0c;能够满足各种精密测量的需求。 双通道-程控…

MacBook Air M3的电脑怎么样 新买MacBook Air提示内存不足 苹果电脑内存不够用怎么办

Apple的MacBook Air系列一直是轻薄便携笔记本电脑的代表&#xff0c;最新推出的MacBook Air M3因其出色的性能和优雅的设计而受到广泛关注。然而&#xff0c;许多用户在购买全新的MacBook Air后反应他们遇到了内存不足的提示。 本文将探讨MacBook Air M3的电脑怎么样&#xff0…

Java 集合框架:Vector、Stack 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 015 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

设计模式——观察者模式(发布/订阅模式)

观察者模式(发布/订阅模式) 是一种行为模式&#xff0c;允许你定义一种订阅机制&#xff0c;可在对象事件发生时通知多个“观察”该对象的其他对象 观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时&am…

[机器学习算法]支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类和回归分析的监督学习模型。SVM通过找到一个超平面来将数据点分开&#xff0c;从而实现分类。 1. 理解基本概念和理论&#xff1a; 超平面&#xff08;Hyperplane&#xff09;&#xff1a;在高维空间中&#xff0c;将数据…

接口提示信息国际化, 调用LibreTranslate 离线翻译, 国际化支持

文章目录 背景实现方式步骤下载并部署离线翻译服务;前端接入 背景 将接口返回内容进行翻译, 以适配多语言需求; 实现方式 前端拦截接口返回内容, 调用离线翻译服务进行翻译, 翻译之后再进行相应的提示 参考资料: 离线翻译服务: https://github.com/LibreTranslate/LibreTra…

Revo Uninstaller Pro:专业卸载工具,为您的电脑系统深度清洁

Revo Uninstaller Pro 是一款功能强大的专业卸载工具&#xff0c;为用户提供了全面而高效的软件卸载解决方案。 在日常使用电脑的过程中&#xff0c;我们经常会遇到软件卸载不干净的问题&#xff0c;残留的文件和注册表项不仅占用宝贵的磁盘空间&#xff0c;还可能影响系统的稳…

36.6K star!Immich - 一款开源高性能的自托管照片和视频备份方案

大家好&#xff0c;今天给大家分享的是一个高性能的自托管照片和视频备份方案。 Immich 是一个图片管理和分享平台&#xff0c;它允许用户高效地组织、存储和访问他们的照片和视频集合。这个项目特别设计来优化个人和家庭的多媒体内容管理体验&#xff0c;提供了诸如自动备份、…

python编程笔记

python import库失败&#xff1a;原因是解释器选择不对&#xff0c;pip3 install numpy是把numpy库安装在3.xxx的python解释器中&#xff0c;但是我是在3.9.6的解释器下运行的&#xff0c;所以找不到&#xff0c;此时需要把解释器换成3.11.9即可。 Super(Net,self)._init_() 这…

am62x芯片安全类型确认(HS-SE, HS-FS or GP)

文章目录 芯片安全类型设置启动方式获取串口信息下载脚本运行脚本示例sk-am62x板卡参考芯片安全类型 AM62x 芯片有三个安全级别。 • GP:通用版本 • HS-FS:高安全性 - 现场安全型 • HS-SE:高安全性 - 强制安全型 在SD卡启动文件中,可以查看到, 但板上的芯片,到底是那…

Flutter-无限循环滚动标签

1. 序章 在现代移动应用开发中&#xff0c;滑动视图是常见的交互模式之一。特别是当你需要展示大量内容时&#xff0c;使用自动滚动的滑动视图可以显著提升用户体验。在这篇文章中&#xff0c;我们将讨论如何使用 Flutter 实现一个自动滚动的列表视图。 2. 效果 3. 实现思路 …