进程与cpu

现在的cpu核心数有2核,4核,8核甚至更多

那么在应用程序中能否获取cpu的核心数呢?答案是肯定的,通过下方代码即可获取

#include<stdio.h>

#include<sys/syscall.h>

#include<unistd.h>

#define __USE_GNU

int main()

{

  unsigned num = sysconf(__SC_NPROCESSORS_CONF);

  printf("cpu cores:%d\n",num);

}

那么获取到cpu核心数后又有什么用呢?

先看如下一个函数

int cpu_bind(int num)

{

  pid_t selfid = syscall(__NR_gettid);

  cpu_set_t mask;

  CPU_ZERO(&mask);

  CPU_SET(selfid%num,&mask);

  sched_setaffinity(0,sizeof(mask),&mask);

}

顾名思义,cpu_bind应该是就执行cpu绑定操作,那么绑定什么呢

syscall(__NR_gettid)的作用基本等价于getpid,其的意思是说获取系统调度实体的id

cpu_set_t 有是怎么的一个数据呢,我们可以这样理解,其内部存储了一个对应与cpu核心数目的一个数组

CPU_ZERO的作用就是清空该数组,即将数组内所有元素赋0

CPU_SET的意思几是将该数组的某一位置1

是不是特别像FD_ZERO,FD_SET啊,对了,就跟他很像

下面sched_setaffinity的作用看出来了吗,它的作用就是将当前进程或者当前线程绑定到该数组中置为1的cpu核心上,从此以后该线程就只能调度到该核心上了

这下明白了吗?那么有人会问了,这样做有什么好处,为什么这样做呢,这就跟操作系统调度有关系了

操作系统调度的时候是将就绪的线程在cpu核心上排队,当线程阻塞或则休眠时就将从cpu核心撤出,并将其寄存器状态压入内存。然后将排队的下一个就绪线程从从内存取出送入寄存器开始执行

一个线程不一定每次都排到固定的cpu核心上,这样就会出现一个进程的多个线程在同一个cpu核心上排队

这就有可能造成程序的运行效率下降

采用本文介绍的方式可以让进程的执行效率提升

猜你喜欢

转载自www.cnblogs.com/zhangrd/p/11590364.html