当前位置: 首页 > article >正文

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

目录

一、定义与工作原理

二、特点与优势

三、实现与示例

四、注意事项


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

一、定义与工作原理

  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.kler.cn/news/342836.html

相关文章:

  • Linux相关概念和易错知识点(14)(进程终止、进程退出、退出信息)
  • Patroni配置文件4-重要规则
  • Java中注解与反射的详细介绍
  • C# 结构体(Struct)
  • 0基础学习CSS(二十二)伪元素
  • 自动化的抖音
  • 算法:反转链表
  • Colorize: 0 variables Colorize is not activated for this file. VsCode
  • 【GeekBand】C++设计模式笔记7_Bridge_桥接模式
  • 惠普电脑怎么开启vt_惠普电脑开启vt虚拟化图文教程(支持新旧bios开启方法)
  • DNS 反向解析导致 ssh 连接缓慢
  • 实战交易策略 篇九:均线止盈策略
  • 计算机视觉之OpenCV vs YOLO
  • 什么是快充协议、支持多协议的USB Type-C受电端取电芯片
  • ARM base instruction -- movn
  • 基于SSM框架和Layui的学院课程安排系统的设计与实现(源码+定制+定制)
  • 【git】如何生成SSH key用于无需账号登录git仓库推送(需要令牌的问题)
  • JAVA的ArrayList 和 LinkedList的区别
  • 基于Python的摄影平台交流系统
  • MATLAB与R语言在建模中的合作与应用(上篇)