多进程并发服务器与多线程并发服务器

文章目录


一、多进程并发服务器

多进程并发服务器是一种经典的服务器架构,它通过创建多个子进程来处理客户端连接,从而实现并发处理多个客户端请求的能力。

使用原理

服务端:父进程创建主线程(负责链接),主线程在accept等待客户端连接,每来一个客户端进行通信,主线程都会通过fork函数创建一个处理线程与该客户端进行读取请求与回复响应。

难点

多进程并发服务器实现难点在于处理僵尸进程,我们采用再创建一个普通线程负责回收。

该线程继承自主线程。操作系统在处理进程退出后、发现僵尸进程时,向父进程发送SIGCHLED信号,通知回收。主线程需要屏蔽该信号(如果处理信号,会导致accept函数强制中断(EINTR))。普通线程会继承主线程的屏蔽字,然后进行捕捉设定,而后解除屏蔽,非阻塞循环回收。

特点

  1. 多进程模型有多个处理单元, 为多对多模型。
  2. 多进程模型中,子进程随客户端持续,链接成功创建,客户端退出则子进程退出。
  3. 僵尸进程如何回收 但是回收无论是阻塞回收还是非阻塞, 都会影响连接。
  4. 具备并发处理能力的服务器模型,可以并发连接并发处理,为若干客户端提供服务
  5. 并发量数量取决于进程数量
  6. 但频繁创建和销毁进程有庞大的系统开销
  7. 多进程稳定性强,因为每个处理单元是一个进程,一个进程异常退出不会影响其他进程

代码

只贴了主函数

cpp 复制代码
/*#!/usr/bin/env c
# -*- coding: utf-8 -*-
# ************************************************************************ 
# * 
# * @file:process_server.c 
# * @author:WJQ 
# * @date:2024-01-22 18:34 
# * @version 1.0  
# * @description: c Script 
# * @Copyright (c)  all right reserved 
# * 
#************************************************************************* 
*/
#include <server.h>

int server_start(void)
{
	int sockfd, csock;
	struct sockaddr_in client_addr;
	pid_t pid;
	socklen_t addrlen;
	sockfd = net_initializer();
	printf("process tcp server runing..\n");
	//设置屏蔽字
	sigset_t set, oset;
	sigemptyset(&set);
	sigaddset(&set, SIGCHLD);
	sigprocmask(SIG_SETMASK, &set, &oset);
	//回收线程创建
	pthread_t tid;
	int err;
	if ((err = pthread_create(&tid, NULL, thread_wait, NULL)) > 0) {
		printf("wait thread create error:%s\n", strerror(err));
		exit(0);
	}
	while(SHUTDOWN) {
		addrlen = sizeof(client_addr);
		if ((csock = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen)) > 0) {
			pid = fork();
			if (pid > 0) {
				first_response(csock, client_addr);//父进程完成连接与首次响应
			} else if (pid == 0) {
				recv_request(csock);//子进程处理客户端请求
			} else {
				perror("accept call failed");
				exit(0);
			}
		}
	}
	close(sockfd);
	printf("server its done\n");
	return 0;
}

二、多线程并发服务器

使用原理

其实跟多进程并发服务器非常类似。。。

但是少了处理僵尸进程问题,所以只用一个主线程(负责连接)就好。因为线程可以设置分离态。

难点

进程中sock可以通过继承的方式给子进程,线程就得参数传递。

特点

  1. 具备并发处理能力的服务器模型,可以并发连接并发处理,为若干客户端提供服务。
  2. 并发量数量取决于线程数量。
  3. 但频繁创建和销毁线程有庞大的系统开销。
  4. 稳定性较差,线程崩溃可能影响其他线程,但是开销小轻量级(线程安全问题)

总结

无论是多进程并发服务器还是多线程并发服务器,都有各自的缺点。常见的还是多路IO复用服务器。

相关推荐
Xzh04237 小时前
AI Agent 学习路线(Java 后端方向)
java·人工智能·学习
QWEDDRFTG7 小时前
服务器电源线怎么选?接口、电流、线径、认证一次讲清
服务器
做cv的小昊8 小时前
计算机图形学:【Games101】学习笔记08——光线追踪(辐射度量学、渲染方程与全局光照、蒙特卡洛积分与路径追踪)
图像处理·笔记·学习·计算机视觉·游戏引擎·图形渲染·概率论
星恒随风8 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
qq_163135758 小时前
Linux 【07-rm命令超详细教程】
linux
zh路西法8 小时前
【SSH 免密登录全流程】Windows Linux 通用方案
linux·windows·ssh
浪客灿心8 小时前
项目篇:模块设计与实现
数据库·c++
牛油果子哥q9 小时前
【C++ STL vector】C++ STL vector 终极精讲:动态数组底层原理、两倍扩容机制、迭代器失效、增删查改、性能剖析与工程避坑指南
开发语言·c++
ScilogyHunter9 小时前
GCC完全指南
linux·gcc
CodeStats9 小时前
从 CPU 指令到 JVM 进程:彻底讲透 Java 执行 main 方法时,类加载、主线程、栈帧入栈的完整底层逻辑
java·linux·开发语言