Linux 多进程并发设计-进程对核的亲缘设置

1设计结构

在这里插入图片描述

2 设计优点

  • 1 充分利用多核系统的并发处理能力
  • 2 负载均衡
  • 3 职责明确,管理进程仅负责管理,工作进程仅负责处理业务逻辑

3 演示代码:

//main.cpp
#define _GNU_SOURCE
#include<sys/types.h>
#include<sys/wait.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include<string.h>
#include<errno.h>

//函数指针
typedef void (*spawn_proc_pt) (void* data);
//工作进程
static void worker_process_cycle(void* data);
//启动n个进程
static void start_worker_processes(int n);
//进程分配
pid_t spawn_process(spawn_proc_pt proc, void* data,const char* name);
//设置进程
static void worker_process_init(intptr_t worker);
int main(int argc,char** argv) {
   
	//启动4个进程
	start_worker_processes(4);
	//进程等待
	wait(NULL);
	return 0;
}

//设置进程的关系
void worker_process_init(intptr_t worker)
{
   
	//cpu亲源
	cpu_set_t cpu_affinity;

	//worker = 2;				//测试用
	
	//清除cpu掩码
	CPU_ZERO(&cpu_affinity);
	//设置cpu使用哪个核
	CPU_SET(worker % CPU_SETSIZE, &cpu_affinity);// 0 1 2 3     CPU_SETSIZE(cpu最大数量)

	//sched_setaffinity
	if (sched_setaffinity(0, sizeof(cpu_set_t), &cpu_affinity) == -1) {
   //0表示绑定自己进程的pid  
		fprintf(stderr, "sched_setaffinity() failed,reason:%s\n", strerror(errno));
	}

}

void start_worker_processes(int n)
{
   
	int i;
	for (i = n - 1; i >= 0; i--)
	{
   
		const char *processName= "worker process";
		spawn_process(worker_process_cycle, (void*)(intptr_t)i, processName);
	}
}
//分配的进程任务
pid_t spawn_process(spawn_proc_pt proc, void* data, const char* name)
{
   

	pid_t pid;
	pid = fork();
	switch (pid)
	{
   
	case -1://创建进程失败
		fprintf(stderr, "Create childen  process %s failed!, reason:%s .\n", name, strerror(errno));
		break;

	case 0://创键子进程
		proc(data);
		break;

	default://父进程
		break;
	}
	printf("start %s %d", name, (long int)pid);
	return pid;
}
//工作函数


void worker_process_cycle(void* data) {
   

	intptr_t worker = (intptr_t)data;
	//初始化进程
	worker_process_init(worker);
	//开始工作
	while(1) {
   
		sleep(10);
		printf("pid %ld ,doing ...\n", (long int)getpid());
	}
}

4 编译与执行

gcc ./main -o M_Process.exe
./M_Process.exe

请添加图片描述

5 查看效果

查看系统的核数

cat /proc/cpuinfo

查看分配的进程对应的核
ps -eLo ruser,pid,lwp,psr,args
请添加图片描述4个分配的进程分别使用不同的核

相关推荐

  1. 进程并发服务器

    2023-12-08 13:30:04       7 阅读
  2. 并发服务器-进程

    2023-12-08 13:30:04       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 13:30:04       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 13:30:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 13:30:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 13:30:04       18 阅读

热门阅读

  1. 一起学习云计算

    2023-12-08 13:30:04       35 阅读
  2. 我的创作纪念日

    2023-12-08 13:30:04       49 阅读
  3. Ubuntu环境下使用nginx实现强制下载静态资源

    2023-12-08 13:30:04       36 阅读
  4. Ubuntu开机出现Welcome to emergency mode解决办法

    2023-12-08 13:30:04       57 阅读
  5. Appium:iOS部署

    2023-12-08 13:30:04       34 阅读
  6. 源代码编译cuda opencv

    2023-12-08 13:30:04       37 阅读
  7. opencv学习一:namedWindow()创建和显示窗口

    2023-12-08 13:30:04       36 阅读
  8. vscode console.log快捷键

    2023-12-08 13:30:04       37 阅读
  9. Spring Boot 框架能够解决什么问题?

    2023-12-08 13:30:04       31 阅读
  10. axios创建实例对象,发送ajax请求,配置baseUrl

    2023-12-08 13:30:04       43 阅读