[C++ 网络协议] 多进程服务器端

news2024/9/21 2:41:57

具有代表性的并发服务器端实现模型和方法:

多进程服务器:通过创建多个进程提供服务。

多路复用服务器:通过捆绑并统一管理I/O对象提供服务。

多线程服务器:通过生成与客户端等量的线程提供服务。

1. 进程的概念及应用

1.1 什么是进程?

进程:占用内存空间的正在运行的程序

从操作系统的角度看,进程是程序流的基本单位。若创建多个进程,则操作系统将同时运行。有时一个程序运行过程中也会产生多个进程,多进程服务器端就是其中的代表。

CPU核的个数与进程数:

         拥有2个运算设备的CPU称作双核CPU,拥有4个运算器的称作四核CPU。也就是说,1个CPU可能包含有多个运算设备(核),核的个数与可同时运行的进程数相同。如果进程数超过了核,那么进程将分时使用CPU资源,但因为CPU运算很快,所以我们会觉得所有进程都同时在运行。

1.2 创建进程

1.2.1 进程ID

每个进程都会从操作系统中分配到一个ID,这个ID就是“进程ID”,进程ID的值为大于2的整数,因为1要分配给操作系统启动后的首个进程(协助操作系统的进程),因此用户无法得到ID为1的进程。

Linux中查看所有进程的命令: ps au

1.2.2 fork函数(创建进程)

#include<unistd.h>

pid_t fork();
成功返回进程ID,失败返回-1

fork函数: 将创建基于当前运行的,调用fork函数的进程的副本(内存空间完全相同)。此进程为父进程,其副本为子进程。两个进程都将执行fork函数调用后的语句(准确来说,就是从这个fork函数的返回值开始),之后的程序流中,通过fork函数的返回值来区分,当前执行的是子进程还是父进程

父进程:fork函数返回子进程ID

子进程:fork函数返回0

如图:

从复制发生点开始,父进程的所有变量的值,在复制发生点处时,是什么值,子进程也就会是什么值,之后两个进程之间的变量值互不影响,如图所示,最终结果:

父进程:gval=11,lval=26

子进程:gval=12,lval=25

1.2.3 僵尸进程(为什么要进行进程销毁)

如果在子进程创建后,没有销毁子进程,那么子进程就有可能会成为僵尸进程,僵尸进程会占用内存空间,造成资源消耗。

僵尸进程产生的原因:

        子进程通过两种方式来终止,一是传递参数并调用exit函数,二是main函数找那个执行return语句并返回值。这两种方式返回的值都会传递给操作系统,但操作系统不会销毁子进程,而是直到把这些值传递给产生该子进程的父进程之后,才会进行销毁。在销毁之前,这期间状态下的进程,就是僵尸进程。所以也可得知,如果要终止子进程,那么就必须向父进程传递exit参数值或return语句的返回值。

那么子进程如何向父进程传递exit参数值或return语句的返回值,来终止自己?

答:通过父进程主动发起请求来调用。如果父进程没有主动要求获取子进程的结束状态值,那么操作系统将一直保存子进程。

1.2.4 wait函数(销毁进程,阻塞)

#include<sys/wait.h>

pid_t wait(int* statloc);    //statloc指向的内存空间,存放有子进程的exit参数值或return语句的返回值等其它信息
成功返回终止的子进程ID,失败返回-1

statloc指向的内存空间,不仅仅存放有子进程的exit参数值或return语句的返回值,还有其它信息,需要通过如下宏进行分离:

WIFEXITED(int statue);
子进程正常终止返回1(真)。
WEXITSTATUES(int statue);
返回子进程的返回值。

所以,使用wait函数的标准流程:

int status;

wait(&status);

if(WIFEXITED(status))    //如果正常终止
{
    std::cout<<"子进程正常终止!"<<std::endl;
    std::cout<<"子进程返回值:"<<WEXITSTATUS(status)<<std::endl;
}

注意:调用wait函数时,如果没有子进程要终止,那么程序将阻塞住,直到有任意一个子进程终止。

1.2.5 waitpid函数(销毁进程,无阻塞)

#include<sys/wait.h>

pid_t waitpid(
pid_t pid,         //如果为-1,那么和wait函数一样,等待任意一个子进程终止
int* statloc,      //同wait函数一样
int options        //传递头文件中声明的常量WNOHANG,表示即使没有子进程终止,
                   //也不会阻塞程序执行,只是返回0并退出函数
);
成功返回终止的子进程ID(或0),失败返回-1

注意:返回0的情况是没有子进程终止。

2. 进程间的信号处理

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

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

相关文章

基于算术优化算法优化的BP神经网络(预测应用) - 附代码

基于算术优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于算术优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.算术优化优化BP神经网络2.1 BP神经网络参数设置2.2 算术优化算法应用 4.测试结果&#xff1a;5…

mybatis自动生成文件配置记录

记录下mybatis自动生成mapper文件&#xff0c;虽然现在有点过时了&#xff0c;但对于新手来说还是有一定用处的&#xff08;diss下通过这种文章引流关注的博主&#xff09;。 比较简单&#xff0c;基本就三步搞定&#xff01; 1、pom配置 <!--mybatis自动生成代码插件-->…

【Qt学习】07:绘图与绘图设备

OVERVIEW 绘图与绘图设备一、QPainter二、QPainterDevice1.QPixmap2.QBitmap3.QImage4.QPicture 绘图与绘图设备 一、QPainter Qt 的绘图系统允许使用API在屏幕和其它打印设备上进行绘制&#xff0c;整个绘图系统基于QPainter&#xff0c;QPainterDevice和QPaintEngine三个类&…

Eplan软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Eplan软件是一款专为电气专业设计开发的软件&#xff0c;旨在提高电气设计的效率和质量。以下是Eplan软件的详细介绍。 1、Eplan的历史和演变 Eplan是一款由德国Eplan公司开发的电气设计软件&#xff0c;自1984年推出以来&…

如何在windows电脑上安装多个node,并可以进行随意切换

一、进入官网http://nvm.uihtm.com/ 下载 二、启动解压后的程序 1.开始安装nvm 选择要安装的目录 一直下一步–下一步–最后点击完成 3.最后点击完成即可 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3656568c7e9946e8a04219811fc4c4d3.png 三、在cmd控制台进行操作…

VMware ESXi 7.0 优化VMFSL磁盘占用与系统存储大小

文章目录 VMware ESXi 7.0 优化VMFSL磁盘占用与系统存储大小引言创建ESXi7.0可启动 U 盘结果检查VMware ESXi 7.0 优化VMFSL磁盘占用与系统存储大小 引言 本文讲述了在 J1900平台上安装ESXi7.0时减少 VMFSL 分区占用的说明, 通常这来说些主机内置的磁盘空间非常小, 采用默认安…

uniapp返回上一页并刷新

在uniapp中&#xff0c;经常会有返回上一页的情况&#xff0c;官方提供有 uni.navigateBack 这个api来实现效果&#xff0c;但是此方法返回到上一页之后页面并不会更新&#xff08;刷新&#xff09;。 例如有这样一个场景&#xff1a;从地址列表页点击添加按钮进入添加地址页面…

Aidex 移动端快速开发框架# RuoYi-Uniapp项目,uniapp vue app项目跨域问题

参考地址&#xff1a; manifest.json官方配置文档&#xff1a;manifest.json 应用配置 | uni-app官网 Chrome 调试跨域问题解决方案之插件篇&#xff1a; uni-app H5跨域问题解决方案&#xff08;CORS、Cross-Origin&#xff09; - DCloud问答 其实uni-app官方有解决跨域的办…

「MySQL-01」MySQL基础

目录 一、数据库概念 1. 什么是数据库 2. 为什么要有数据库&#xff1f; 3. 数据库将数据存在哪里&#xff1f; 二、知名数据库介绍 1.知名数据库介绍 2.为什么要学习MySQL 三、MySQL的基本使用 0. 安装MySQL 1. 数据库客户端链接服务端 2. Windows下的MySQL服务端管理 3. 数据…

Pygame编程(10)freetype模块

Pygame编程&#xff08;10&#xff09;freetype模块 函数示例 函数 pygame.freetype.get_error 返回最新的FreeType错误get_error() -> strget_error() -> None pygame.freetype.get_version 返回FreeType版本get_version(linkedTrue) -> (int, int, int) pygame.fre…

斯坦福人生设计课——简略笔记

来源&#xff1a;⽐尔博内特 戴夫伊万斯 著图书《人生设计课》 目录 一、认清当下的情况&#xff0c;从四个维度观察自己的人生 二、平衡人生&#xff0c;但不要走入误区 2.1 记录你的“美好时光日志”&#xff1a; 2.1.1 记录内容&#xff1a; 2.1.2 辅助反思的方法&…

C# 学习笔记--个人学习使用 <2>

C# 学习笔记 Chapter 2 比较硬的基础部分Section 1 委托Part 1 Action 与 func 委托的示例Part 2 自定义委托Part 3 委托的一般使用Part 4 委托的高级使用Part 5 适时地使用接口 Interface 取代一些对委托的使用 Section 2 事件Part 1 初步了解事件Part 2 事件的应用Part 3 事件…

图神经网络与分子表征:番外——基组选择

学过高斯软件的人都知道&#xff0c;我们在撰写输入文件 gjf 时需要准备输入【泛函】和【基组】这两个关键词。 【泛函】敲定计算方法&#xff0c;【基组】则类似格点积分中的密度&#xff0c;与计算精度密切相关。 部分研究人员借用高斯中的一系列基组去包装输入几何信息&am…

快速安装Qt开发环境,克服在线安装慢等问题

自从Qt6之后&#xff0c;QtCreater的安装都需要注册账号&#xff0c;并且使用账号在线安装&#xff0c;继续使用官网的资源站下载的话&#xff0c;会特别的慢&#xff0c;以下是提高在线安装速度的做法。 官网下载很慢&#xff0c;快速安装的方式如下 1、winR,输入CMD&#xff…

深入分析负载均衡情景

本文出现的内核代码来自Linux5.4.28&#xff0c;为了减少篇幅&#xff0c;我们尽量不引用代码&#xff0c;如果有兴趣&#xff0c;读者可以配合代码阅读本文。 一、有几种负载均衡的方式&#xff1f; 整个Linux的负载均衡器有下面的几个类型&#xff1a; 实际上内核的负载均衡…

关于述职答辩的一点思考和总结

公众号&#xff1a;赵侠客 侠客说&#xff1a;优秀人才的四个特征&#xff1a;格局、思路、实干、写作 一、前言 1.1 述职答辩的重要性 公司都会有晋升通道&#xff0c;述职答辩是你想升职加薪除了跳槽以外的必由之路&#xff0c;其重要性对个人发展来说不言而喻&#xff0c…

python的文件操作

前言 打印内容到屏幕 最简单的输出方式是调用print函数&#xff0c;此函数会将你传递的表达式转化成字符串表达式&#xff0c;并将结果写道标准输出中。 读取键盘输入 python提供了两个raw_input和input内置函数从标准输入中读取一行文本&#xff0c;默认的标准输入是键盘。 …

7.接着跑一下triton官方教程

5.Model Ensemble 在此示例中&#xff0c;我们将探索使用模型集成来仅通过单个网络调用在服务器端执行多个模型。这样做的好处是减少了在客户端和服务器之间复制数据的次数&#xff0c;并消除了网络调用固有的一些延迟。 为了说明创建模型集成的过程&#xff0c;我们将重用第…

缺页异常与copy-on-write fork

缺页异常需要什么 当发生缺页异常时&#xff0c;内核需要以下信息才能响应这个异常&#xff1a; 出错的虚拟地址&#xff08;引发缺页异常的源&#xff09; 当一个用户程序触发了缺页异常&#xff0c;会切换到内核空间&#xff0c;将出错的地址放到STVAL寄存器中&#xff0c;…

JVM工具-1. jps:虚拟机进程状态工具

文章目录 1. jps介绍2. jps命令格式3. jps工具主要选项4. jps -q5. jps -m6. jps -l7. jps -v 1. jps介绍 jps(JVM Process Status Tool)&#xff1a;虚拟机进程状态工具&#xff0c;可以列出正在运行的虚拟机进程&#xff0c;并显示虚拟机执行主类&#xff08;Main Class&…