【Linux】多进程高并发设计框架示例
发布时间 - 2025-04-18 00:00:00 点击率:次多进程高并发设计框架建议根据cpu核心数量来设置子进程的数量。建议将对应某一进程绑定到某一cpu上(cpu亲缘性),以充分利用多核系统的并发处理能力。多个进程在多个不同的核心上
运行,实现负载均衡。职责明确,管理进程仅负责管理,工作进程负责处理业务逻辑。
示例:
multip_process.c
代码语言:C
#define _GNU_SOURCE #include#include #include #include #include // 函数指针定义,返回void,参数为void typedef void (spawn_proc_pt)(void *data);
// 工作进程的处理周期函数 static void worker_process_cycle(void *data);
// 启动工作进程 static void start_worker_processes(int n);
// 创建子进程 pid_t spawn_process(spawn_proc_pt proc, void data, char name);
int main(int argc, char **argv) { // 启动4个工作进程 start_worker_processes(4); // 管理子进程 wait(NULL); }
// 启动子进程 void start_worker_processes(int n) { int i = 0; for (i = n - 1; i >= 0; i--) { // 第一个参数为工作进程的处理周期 spawn_process(worker_process_cycle, (void *)(intptr_t)i, "worker process"); } }
// 创建子进程 pid_t spawn_process(spawn_proc_pt proc, void data, char name) { pid_t pid; pid = fork(); // 创建子进程 switch (pid) { case -1: fprintf(stderr, "fork() failed while spawning \"%s\"\n", name); return -1; case 0: proc(data); return 0; default: break; } printf("start %s %ld\n", name, (long int)pid); return pid; }
// 设置CPU亲缘关系,将进程绑定在其中的一个核上 static void worker_process_init(int worker) { cpu_set_t cpu_affinity; // 多核高并发处理 CPU_ZERO(&cpu_affinity); // 参数 - CPU编号 - 掩码地址 CPU_SET(worker % CPU_SETSIZE, &cpu_affinity); // sched_setaffinity if (sched_setaffinity(0, sizeof(cpu_set_t), &cpu_affinity) == -1) { fprintf(stderr, "sched_setaffinity() failed\n"); } }
void worker_process_cycle(void *data) { int worker = (intptr_t)data; // 工作进程初始化 worker_process_init(worker); // 干活 for (;;) { sleep(10); printf("pid %ld ,doing ...\n", (long int)getpid()); } }
执行:
补充:
查看进程在CPU核心上的命令:
ps -eLo ruser,pid,lwp,psr,args
设置CPU亲缘性后,可以发现每个子进程对应一个核心。若不设置,则存在进程与核心之间的切换,进程从一个核切换到另一个核,进行拷贝与复制,从而浪费了CPU的性能,降低了执行效率。有关函数指针和typedef的结合运用,请参考相关文章。
# linux
# ai
# switch
# c#
# typedef
# 指针
# 并发
# 负载均衡
# 多核
# 多个
# 绑定
# 第一个
# 周期函数
# 相关文章
# 充分利用
# 若不
# 请参考
# 切换到
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何在万网主机上快速搭建网站?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
文字头像制作网站推荐软件,醒图能自动配文字吗?
用v-html解决Vue.js渲染中html标签不被解析的问题
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
怎么用AI帮你设计一套个性化的手机App图标?
如何在七牛云存储上搭建网站并设置自定义域名?
Python高阶函数应用_函数作为参数说明【指导】
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
网站页面设计需要考虑到这些问题
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
,网页ppt怎么弄成自己的ppt?
如何续费美橙建站之星域名及服务?
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
php json中文编码为null的解决办法
如何在建站主机中优化服务器配置?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何在阿里云完成域名注册与建站?
Laravel中的withCount方法怎么高效统计关联模型数量
Android自定义listview布局实现上拉加载下拉刷新功能
JS经典正则表达式笔试题汇总
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
javascript读取文本节点方法小结
英语简历制作免费网站推荐,如何将简历翻译成英文?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
成都网站制作公司哪家好,四川省职工服务网是做什么用?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
如何快速搭建高效WAP手机网站吸引移动用户?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
魔方云NAT建站如何实现端口转发?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Laravel如何实现API资源集合?(Resource Collection教程)
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制

