当前位置:网站首页>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);
}
边栏推荐
猜你喜欢
Weekly Report 2022-8-4
使用稀疏 4D 卷积对 3D LiDAR 数据中的运动对象进行后退分割(IROS 2022)
ECCV 2022 Oral Video Instance Segmentation New SOTA: SeqFormer & IDOL and CVPR 2022 Video Instance Segmentation Competition Champion Scheme...
15.1.1、md—md的基础语法,快速的写文本备忘录
苹果官网商店新上架Mophie系列Powerstation Pro、GaN充电头等产品
施一公:科学需要想象,想象来自阅读
How to replace colors in ps, self-study ps software photoshop2022, replace one color of a picture in ps with another color
如何实现按键的短按、长按检测?
CCVR基于分类器校准缓解异构联邦学习
Why is pnpm hitting npm and yarn dimensionality reduction?
随机推荐
DPU — 功能特性 — 管理系统的硬件卸载
苹果官网商店新上架Mophie系列Powerstation Pro、GaN充电头等产品
微信小程序请求封装
十一道家常小菜详细攻略[图文并茂]
flink cdc支持从oracle dg库同步吗
tensorflow.keras无法引入layers
sql server收缩日志的作业和记录,失败就是因为和备份冲突了吗?
交换机端口的三种类型详解与hybrid端口实验
egg framework
XSS靶机通关以及XSS介绍
手机上流行的各类谜语
科普大佬说 | 港大黄凯斌老师带你解锁黑客帝国与6G的关系
PAT乙级-B1020 月饼(25)
Walk 100 trick society
sphinx匹配指定字段
【Excel实战】--图表联动demo_001
2022/8/4 考试总结
六年团队Leader实战秘诀|程序员最重要的八种软技能 - 脸皮薄容易耽误事 - 自我营销
施一公:科学需要想象,想象来自阅读
HStreamDB Newsletter 2022-07|分区模型优化、数据集成框架进一步完善