c++ sched_setaffinity和getpriority
sched_setaffinity
sched_setaffinity格式
sched_setaffinity(thread_id, sizeof(cpu_set), &cpu_set);
作用: 设置cpu亲和力
关于亲和力
亲和力是指在linux系统 中可以将一个或多个进程绑定到一个或多个处理器上面运行.
cpu亲和力的掩码决定了该进程可以在几号cpu上运行.
sched_setaffinity参数
cpu_zero: 清空一个集合
cpu_set_t: cpu亲和力的掩码使用此函数表示一个cpu的集合/
cpu_isset():检查一个cpu号是否在这个集合中.
cpu_set():将一个给定的cpu号加入到一个集合
cpu_clr():将一个给定的cpu号从一个集合中去掉.
代码举例:
参照mysql8.0源码:
bool bind_to_cpu(cpu_id_t cpu_id, my_thread_os_id_t thread_id) {
DBUG_TRACE;// 调试
cpu_set_t cpu_set; // cpu亲和力的掩码使用此函数表示一个cpu的集合
CPU_ZERO(&cpu_set);//清空一个集合
CPU_SET(cpu_id, &cpu_set); //将一个给定的cpu号加入到一个集合
int rc = ::sched_setaffinity(thread_id, sizeof(cpu_set), &cpu_set);
if (rc != 0) { //judge rc's result!
char errbuf[MYSQL_ERRMSG_SIZE];
LogErr(ERROR_LEVEL, ER_RES_GRP_SET_THR_AFFINITY_FAILED, thread_id, cpu_id,
my_errno(), my_strerror(errbuf, MYSQL_ERRMSG_SIZE, my_errno()));
return true;
}
return false;
}
在myql源码中sched_setaffinity(thread_id, sizeof(cpu_set), &cpu_set);
thread_id
: 进程id
&cpu_set
:获取到cpu的掩码,让thread_id在此cpu上运行.如果是0则表示当前进程.
sizeof(cpu_set)
: 是指进程运行在几号cpu的长度.如果当前cpu上没有运行指定的thread_id,则该指定进程会在其他cpu上迁移一个和&cpu_set指定的一个cpu上运行.
getpriority
getpriority(int which,int who)
: 用于返回进程,进程组,用户进程的优先级
- which取值:
prio_process
: 0 进程prio_pgrp
: 1 进程组prio_user
: 2 用户进程
- who取值:
- 当which取prio_process时,参数为0,返回当前进程的进程优先级
参数不为0,则返回进程号为who的进程优先级 - 当which取prio_pgrp时,参数为0,返回当前进程组的进程优先级
参数不为0,返回进程组号为who的进程优先级 - 当which取prio_user时,参数为0,返回当前用户进程的优先级
参数不为0,返回当前用户进程号为who的进程优先级
- 当which取prio_process时,参数为0,返回当前进程的进程优先级