当前位置:网站首页>CPU的亲缘性affinity
CPU的亲缘性affinity
2022-08-05 09:13:00 【cheems~】
CPU的亲缘性affinity
前言
本文简单介绍一下CPU亲缘性以及实现方法。
本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。
何谓亲缘性
亲缘性的作用就是把线程or进程与CPU做黏合,也就是说,做了亲缘性的线程或进程,只会在这一个CPU核上运行,只在这一个CPU核上被调度,且不会切换到其他的CPU核上运行。这就是亲缘性。
亲缘性API介绍
cpu_set_t mask:创建CPU核位图CPU_ZERO(&mask):将位图置空CPU_SET(self_id % num, &mask):将位图的某一位置1sched_setaffinity(self_id, sizeof(mask), &mask):将对应进程或线程绑定到置1的这个CPU核上
测试
八个进程绑定八个CPU核心
//
// Created by 68725 on 2022/8/4.
//
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <unistd.h>
#include <sys/mman.h>
#include <sched.h>
void process_affinity(int num) {
pid_t self_id = getpid();
// pid_t self_id = syscall(__NR_gettid);
cpu_set_t mask;
CPU_ZERO(&mask);
//绑定某个CPU核心
CPU_SET(self_id % num, &mask);
//设置亲缘性
// sched_setaffinity(0, sizeof(mask), &mask);
sched_setaffinity(self_id, sizeof(mask), &mask);
while (1);
}
int main() {
//获取cpu数量
int cpu_num = sysconf(_SC_NPROCESSORS_CONF);
int i;
pid_t pid = 0;
//创建与CPU数量一样多的进程
for (i = 0; i < cpu_num; i++) {
pid = fork();
if (pid == (pid_t) 0) {
break;
}
}
if (pid == 0) {
process_affinity(cpu_num);
}
while (1)usleep(1);
}
可以看到瞬间跑满了


八个进程绑定四个CPU核心
//
// Created by 68725 on 2022/8/4.
//
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <unistd.h>
#include <sys/mman.h>
#include <sched.h>
void process_affinity(int num) {
pid_t self_id = getpid();
// pid_t self_id = syscall(__NR_gettid);
cpu_set_t mask;
CPU_ZERO(&mask);
//绑定某个CPU核心
CPU_SET(self_id % num, &mask);
//设置亲缘性
// sched_setaffinity(0, sizeof(mask), &mask);
sched_setaffinity(self_id, sizeof(mask), &mask);
while (1);
}
int main() {
//获取cpu数量
int cpu_num = sysconf(_SC_NPROCESSORS_CONF);
int i;
pid_t pid = 0;
//创建与CPU数量一样多的进程
for (i = 0; i < cpu_num; i++) {
pid = fork();
if (pid == (pid_t) 0) {
break;
}
}
if (pid == 0) {
process_affinity(4);
}
while (1)usleep(1);
}
可以看到瞬间4个CPU核跑满


八个进程绑定一个CPU核心
//
// Created by 68725 on 2022/8/4.
//
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <unistd.h>
#include <sys/mman.h>
#include <sched.h>
void process_affinity(int num) {
pid_t self_id = getpid();
// pid_t self_id = syscall(__NR_gettid);
cpu_set_t mask;
CPU_ZERO(&mask);
//绑定某个CPU核心
CPU_SET(self_id % num, &mask);
//设置亲缘性
// sched_setaffinity(0, sizeof(mask), &mask);
sched_setaffinity(self_id, sizeof(mask), &mask);
while (1);
}
int main() {
//获取cpu数量
int cpu_num = sysconf(_SC_NPROCESSORS_CONF);
int i;
pid_t pid = 0;
//创建与CPU数量一样多的进程
for (i = 0; i < cpu_num; i++) {
pid = fork();
if (pid == (pid_t) 0) {
break;
}
}
if (pid == 0) {
process_affinity(1);
}
while (1)usleep(1);
}


边栏推荐
猜你喜欢
随机推荐
2022.8.3
ts/js function pass parameter with function writing
XCODE12 在使用模拟器(SIMULATOR)时编译错误的解决方法
mySQL数据库初始化失败,有谁可以指导一下吗
今天是元宵节~~
Does flink cdc support synchronization from oracle dg library?
Creo 9.0 基准特征:基准坐标系
工程制图知识点
Hbuilder 学习使用中的一些记录
express hot-reload
DPU — 功能特性 — 存储系统的硬件卸载
Luogu P3368: 【模板】树状数组 2
How to make pictures clear in ps, self-study ps software photoshop2022, simple and fast use ps to make photos clearer and more textured
动态内存开辟(C语言)
【零基础玩转BLDC系列】无刷直流电机无位置传感器三段式启动法详细介绍及代码分享
Why is pnpm hitting npm and yarn dimensionality reduction?
工程制图直线投影练习
tear apart loneliness
Rotation of the displayed value on the button
DPU — 功能特性 — 管理系统的硬件卸载









