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

【网络编程】多进程服务器端

并发服务器的实现

  • 多进程服务器:通过创建多个进程提供服务
  • 多路复用服务器:通过捆绑并统一管理IO对象提供服务。
  • 多线程服务器:通过生成与客户端等量的线程提供服务。、

理解进程process

定义:占用内存空间的正在运行的程序。

CPU核和进程数:1个CPU 中可能包含多个运算设备( 核 )。核的个数与可同时运行的进程数相同。相反,若进程数超过核数,进程将分时使用 CPU 资源。但因为CPU 运转速度极快,我们会感到所有进程同时运行。。

进程ID:所有进程都会从操作系统分配到ID。其值为大于2的整数,1要分配给操作系统启动后的首个进程。

调用fork函数创建进程

#include<unisted.h>
pid_t fork(void);

fork函数创建调用的进程副本。

父进程fork函数返回子进程ID,子进程返回0。

进程和僵尸进程

进程完成工作后(执行完mian函数)应被销毁,但有时这些进程将编程僵尸进程,占用系统中重要资源。

产生僵尸进程的原因:1、传递参数并调用exit函数;2、mian函数中执行return语句并返回值。

向exit函数传递的参数值和main函数的retum语句返回的值都会传递给操作系统。而操作系统不会销毁子进程,直到把这些值传递给产生该子进程的父进程。处在这种状态下的进程就是僵尸进程。也就是说,将子进程变成僵尸进程的正是操作系统。

“应该向创建子进程的父进程传递子进程的exit参数值戒return语句的返回值。”
只有父进程主动发起请求(函数调用)时,操作系统才会传递这些值。换言之,如果父进程未主动要求获得子进程的结束状态值,操作系统将一直保存,并让子进程长时间处于僵尸进程状态。。

销毁僵尸进程1:wait函数

父进程应主动请求获取子进程的返回值

#include<sys/wait.h>
pid_t wait(int *statloc);

因为子进程函数参数指向单元还包含其他信息,因此要通过下列宏分离:
WIFEXITED子进程正常终止时返回真,WEXITSTATUS返回子进程返回值。即,向wait函数传递变量status的地址时,调用wait函数应编写代码:

if(WIFEXITED){puts("Normal termination!");print("child pass num:%d",WEIXTSTATUS(status));
}

销毁僵尸进程2:waitpid函数

#include<sys/wait.h>
pid_t waitpid(pid_t pid, int *statloc, int options);

信号处理

子进程何时终止?父进程和子进程一样繁忙,不能只调用waitpid函数等待子进程终止。

向操作系统求助子进程终止识别主体是操作系统。若操作系统能传递信息有助于构建高效的程序。引入信号处理机制。

信号与singnal函数,进程发现自己的子进程结束时,请求操作系统调用特定函数。

#include<singnal.h>
void (*signal(int signo, void(*func)(int)))(int);

待续.................................................

相关文章:

  • mybatis使用注解形式实现一对多、多对多查询(转载)
  • Unity 6预览版即将增加对visionOS 2的支持
  • 【向量检索】之向量数据库Milvus,Faiss详解及应用案例
  • 0-1 构建用户画像数仓
  • 《操作系统真象还原》第七章——改进中断
  • 保障信息安全!等保2.0的二级和三级到底有何不同?详细解析
  • 【深度解析】如何有效恢复手机数据?5个简单步骤
  • Java学习笔记之基本数据类型转换
  • 解决Linux下Java应用因内存不足而崩溃的问题
  • 电脑丢失dll文件一键修复的方法有哪些?分析dll文件修复的多种策略
  • Unity:Text-TextMeshPro 不显示中文
  • python反序列化知识点学习
  • 5.Sentinel入门与使用
  • 谷歌Google广告开户是怎么收费的?
  • Ubuntu 上 Vim 的安装、配置
  • 【mysql】环境安装、服务启动、密码设置
  • AngularJS指令开发(1)——参数详解
  • exports和module.exports
  • HTML中设置input等文本框为不可操作
  • HTTP那些事
  • Java IO学习笔记一
  • nginx 配置多 域名 + 多 https
  • React系列之 Redux 架构模式
  • Solarized Scheme
  • vue 配置sass、scss全局变量
  • 从重复到重用
  • 关于Flux,Vuex,Redux的思考
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 回流、重绘及其优化
  • 使用 Docker 部署 Spring Boot项目
  • 微服务核心架构梳理
  • 用Canvas画一棵二叉树
  • 与 ConTeXt MkIV 官方文档的接驳
  • scrapy中间件源码分析及常用中间件大全
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #include<初见C语言之指针(5)>
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • (3)llvm ir转换过程
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (TOJ2804)Even? Odd?
  • (六)Flink 窗口计算
  • (十一)手动添加用户和文件的特殊权限
  • (循环依赖问题)学习spring的第九天
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .Net Core和.Net Standard直观理解
  • .NET Core中如何集成RabbitMQ
  • .Net(C#)常用转换byte转uint32、byte转float等
  • @Conditional注解详解
  • [2023-年度总结]凡是过往,皆为序章
  • [AIGC codze] Kafka 的 rebalance 机制
  • [AIGC] Java 和 Kotlin 的区别