【Linux】多进程服务器模型(第十九篇)

news2024/11/24 20:13:13

目录

一、定义与工作原理

二、特点与优势

三、实现与示例

四、注意事项


多进程服务器模型是一种在服务器端使用的并发处理模型,它允许服务器同时处理多个客户端的请求。以下是关于多进程服务器模型的详细介绍:

一、定义与工作原理

  1. 定义:多进程服务器模型通过创建多个进程来提供服务,每个进程都可以独立地处理客户端的请求。

  2. 工作原理

    • 父进程创建一个套接字,并与服务器的IP地址和端口号进行绑定。
    • 父进程开始监听来自客户端的连接请求。
    • 当有客户端请求连接时,父进程通过accept()函数接收连接,并创建一个新的套接字用于与客户端通信。
    • 父进程调用fork()函数创建一个子进程,该子进程是父进程的副本,包括代码、数据和状态等信息。
    • 子进程关闭从父进程中复制下来的监听套接字,然后与客户端进行通信。
    • 父进程继续监听其他客户端的连接请求,并重复上述过程。

二、特点与优势

  1. 特点

    • 子进程与客户端高度绑定,每个子进程负责处理一个客户端的请求。
    • 并发数量取决于进程数量,系统可创建的进程数量限制了服务器的并发处理能力。
    • 进程模型本身具有较大的内存开销。
  2. 优势

    • 通过创建多个进程,可以充分利用多核CPU的并行处理能力,提高服务器的吞吐量。
    • 子进程与父进程相互独立,一个子进程的崩溃不会影响其他子进程和父进程的运行,提高了系统的稳定性和可靠性。

三、实现与示例

在实现多进程服务器模型时,通常需要用到套接字编程和多进程编程的相关知识。以下是一个简单的示例代码,用于说明多进程服务器模型的实现过程:

#include <stdio.h>  
#include <stdlib.h>  
#include <arpa/inet.h>  
#include <sys/socket.h>  
#include <string.h>  
#include <unistd.h>  
  
#define SERVER_IP "xxx.xxx.xxx.xxx"  
#define PORT 8080  
#define BACKLOG 128  
  
int main() {  
    int server_fd, client_fd;  
    struct sockaddr_in serverAddr, clientAddr;  
    socklen_t Addrlen;  
    pid_t pid;  
    char Result[1500];  
    char client_ip[16];  
  
    // 创建套接字并绑定IP地址和端口号  
    serverAddr.sin_family = AF_INET;  
    serverAddr.sin_port = htons(PORT);  
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
    server_fd = socket(AF_INET, SOCK_STREAM, 0);  
    bind(server_fd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));  
    listen(server_fd, BACKLOG);  
  
    printf("Test TCP Server Version 1.1.0 is Running...\n");  
  
    while (1) {  
        Addrlen = sizeof(clientAddr);  
        if ((client_fd = accept(server_fd, (struct sockaddr*)&clientAddr, &Addrlen)) > 0) {  
            // 获取客户端IP地址并打印  
            bzero(Result, sizeof(Result));  
            bzero(client_ip, sizeof(client_ip));  
            inet_ntop(AF_INET, &clientAddr.sin_addr.s_addr, client_ip, sizeof(client_ip));  
            printf("Connection From :IP[%s],PORT[%d]\n", client_ip, ntohs(clientAddr.sin_port));  
  
            // 创建子进程处理客户端请求  
            pid = fork();  
            if (pid > 0) {  
                // 父进程关闭新创建的套接字,继续监听连接请求  
                close(client_fd);  
            } else if (pid == 0) {  
                // 子进程关闭监听套接字,处理客户端请求  
                close(server_fd);  
  
                // 读取客户端数据并处理  
                while ((recvlen = recv(client_fd, Result, sizeof(Result), 0)) > 0) {  
                    // 处理客户端业务逻辑(如转换小写为大写或响应系统时间等)  
                    // ...  
                    send(client_fd, Result, recvlen, 0);  
                }  
  
                // 客户端断开连接,子进程退出  
                close(client_fd);  
                exit(0);  
            } else {  
                // fork失败,打印错误信息并退出  
                perror("fork call failed");  
                exit(0);  
            }  
        } else {  
            // accept失败,打印错误信息并关闭服务器套接字  
            perror("accept failed");  
            close(server_fd);  
            exit(0);  
        }  
    }  
  
    close(server_fd);  
    return 0;  
}

 

四、注意事项

  1. 进程管理:在多进程服务器模型中,需要注意对进程的管理,包括进程的创建、销毁和状态监控等。如果父进程未及时处理子进程的结束状态,可能会导致子进程成为僵尸进程,浪费系统资源。
  2. 资源限制:系统对进程的数量有一定的限制,因此多进程服务器模型可能不适用于大量并发连接的场景。在实际应用中,需要根据服务器的硬件资源和业务需求来选择合适的并发处理模型。
  3. 安全性:在多进程模型中,需要注意进程间的通信和数据共享的安全性,避免数据泄露和非法访问等问题。

综上所述,多进程服务器模型是一种有效的并发处理模型,可以充分利用多核CPU的并行处理能力,提高服务器的吞吐量和稳定性。但在实际应用中,需要根据具体场景和需求来选择合适的并发处理模型,并注意对进程的管理和资源限制等问题。

 

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

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

相关文章

抽象类Abstart Class

抽象类其实就是一种不完全的设计图 必须用abstract修饰 模板方法&#xff1a;建议使用final修饰&#xff0c;不能被重写。

提高ROI:低代码平台如何助力企业实现成本效益最大化

引言&#xff1a;成本效益与ROI的重要性 在当今竞争异常激烈的商业环境中&#xff0c;企业面临着前所未有的挑战。如何在有限的资源下&#xff0c;最大化投资回报率&#xff08;ROI&#xff09;&#xff0c;已经成为企业管理者不可忽视的关键课题。ROI不仅仅是衡量投资回报的指…

PROFINET 转 EtherCAT, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 PROFINET 转 EtherCAT GW系列型号 MS-GW31 概述 简介 MS-GW31 是 PROFINET 和 EtherCAT 协议转换网关&#xff0c;为用户提供两…

服装生产管理的数字化转型:SpringBoot框架

4 系统设计 4.1 系统结构设计 在结构设计过程中&#xff0c;首先对系统进行需求分析&#xff0c;然后进行系统初步设计&#xff0c;将系统功能模块细化&#xff0c;具体分析每一个功能模块具体应该首先哪些功能&#xff0c;最后将各个模块进行整合&#xff0c;实现系统结构的…

Javascript动态规划算法

JavaScript中的动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。它主要致力于将“合适”的问题拆分成更小的子目标&#xff0c;并通过建立状态转移方程、缓存并复用以往结果以及按…

【完-网络安全】Shell与脚本

文章目录 1.CLI与GUI2.终端和Shell2.1 Shell 壳层2.2 终端2.3 终端和Shell区别3.标准流 4.PowerShell4.1 管理员与非管理员4.2 指令4.3 重定向4.4 管道 5.环境变量5.1 影响范围5.2环境变量的作用5.3 常见的环境变量 6.脚本 1.CLI与GUI CLI命令行界面(CLl,Command Line Interfa…

作为一名测试工程师如何学习Kubernetes(k8s)技能

前言 Kubernetes(K8s)作为云原生时代的关键技术之一&#xff0c;对于运维工程师、开发工程师以及测试工程师来说&#xff0c;都是一门需要掌握的重要技术。作为一名软件测试工程师&#xff0c;学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重…

解决:gpg: 从公钥服务器接收失败:服务器故障

当你添加密钥时报错&#xff0c;可以按照下面的步骤&#xff0c;依次输入。 # 停止 Network Manager 服务 sudo service network-manager stop# 删除 Network Manager 的状态文件 sudo rm /var/lib/NetworkManager/NetworkManager.state# 重新启动 Network Manager 服务 sudo …

Java项目实战II基于Java+Spring Boot+MySQL的高校心理教育辅导系统的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在高等教育…

目标检测:yolov9训练自己的数据集,新手小白也能学会训练模型,一看就会

训练自己的数据集分为4部分&#xff0c;先配置环境&#xff0c;再获取制作自己的数据集&#xff0c;然后修改配置训练&#xff0c;最后验证训练结果。新手小白0基础建议一步一步跟着来&#xff0c;哪里看不懂的或者遇到哪有问题可以评论区交流或者私信问~ 1. 环境配置 在训练…

在树莓派上部署安装OAK

OAK设备可以与微型主机&#xff08;例如树莓派&#xff09;进行连接&#xff0c;在树莓派上安装DepthAI, 需要安装相关依赖Dependencies并且可以通过pip安装Depthai Library. DepthAI Library 在PyPi上对树莓派有预构建的 wheels 使用预配置的树莓派OS 镜像 我们提供预安装了D…

MIBench:首个模型反演攻击与防御基准测试工具。不仅集成了16种最先进的攻击和防御方法,还提供了9种常用评估协议,为标准化和公平的评估分析提供了便利。

2024-10-08&#xff0c;由哈尔滨工业大学&#xff08;深圳&#xff09;和清华大学深圳国际研究生院的研究人员联合创建的MIBench&#xff0c;作为首个模型反演攻击和防御的实用基准测试&#xff0c;不仅集成了16种最先进的攻击和防御方法&#xff0c;还提供了9种常用评估协议&a…

SRAM,DRAM,DTCM RAM,ITCM RAM

一&#xff1a;SRAM&#xff0c;DRAM&#xff0c;DTCM RAM&#xff0c;ITCM RAM 1.SRAM:&#xff08;Static Random Access Memory&#xff09;一种静态随机存取存储器计算机系统和嵌入式系统中作为高速数据存储容器&#xff0c;SRAM 使用触发器电路来存储每个位的数据&#x…

IDEA使用Maven创建父与子多模块项目

在 IntelliJ IDEA 中使用 Maven 创建父与子多模块项目是一个常见的开发实践&#xff0c;有助于更好地组织和管理代码。在多模块项目中&#xff0c;可以将公共的代码、资源或配置抽离到独立的模块中&#xff0c;然后在其他模块中直接引用。这样可以避免代码重复&#xff0c;提高…

【01】手把手教你0基础部署SpringCloud微服务商城教学-Mybatis篇(上)

序言&#xff1a; 微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合出复杂的大型应用。 想学习SpringCloud搭建项目&#xff0c;首先我们需要学习的就是Mybatis和Docker。 大家在日常开发中应该能发现&#xff0c;单表的CRUD…

IEC104规约的秘密之九----链路层和应用层

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…

基于卷积神经网络的脊柱骨折识别系统,resnet50,mobilenet模型【pytorch框架+python】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于卷积神经网络的脊柱骨折识别系统&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python&#xff0c;tkinter】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷…

C++ | Leetcode C++题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; class Solution { public:int findSubstringInWraproundString(string p) {vector<int> dp(26);int k 0;for (int i 0; i < p.length(); i) {if (i && (p[i] - p[i - 1] 26) % 26 1) { // 字符之差为 1 或 -25k;} els…

京东统一存储实践

​作者&#xff1a;王腾蛟&#xff0c;2021年8月加入京东&#xff0c;目前主要负责京东离线存储(HDFS)相关工作。 导读 随着大数据时代的到来&#xff0c;海量数据的存储与处理成为了众多企业面临的重要挑战。HDFS 作为一个高可靠性、高扩展性的分布式文件系统&#xff0c;在…

1招!统一管理多个微信,工作效率真的太高了!

你是否经常在使用多个微信号时感到疲惫不堪&#xff1f;每当你需要切换账号时&#xff0c;是不是得不停地登陆、登出&#xff0c;甚至要带着几台手机外出&#xff1f;这种繁琐的操作不仅浪费时间&#xff0c;还严重影响了工作效率。 今天&#xff0c;我将为你分享一款强大的多…