computer_knowledge_notes/Languages/CLang/libraries/sched.md

3.6 KiB
Raw Blame History

概述

管理调度器

相关函数

管理调度器
/* 为进程设置调度参数  */
extern int sched_setparam (__pid_t __pid, const struct sched_param *__param)
     __THROW;

/* 获取进程的调度参数  */
extern int sched_getparam (__pid_t __pid, struct sched_param *__param) __THROW;

/* 为进程pid设置调度算法policy和(或)参数param
 * 如pid为0则设置的是调用线程的调度算法和参数
 * 参数param依赖于policy
 * 返回值:0成功,-1失败。
 */
int sched_setscheduler(pid_t pid, int policy,
                       const struct sched_param *param);
// sched_param的结构
// 如policy为SCHED_OTHER, SCHED_BATCH, SCHED_IDLE,则sched_priority必须为
// 如policy为SCHED_FIFOSCHED_RR则sched_priority的范围为1~9999优先级最高
struct sched_param {
               int sched_priority;
};

/* 返回线程pid的调度算法是一个非负的整数。如失败则返回-1。
 * 如pid为0则获取的是调用线程的调度算法。
 */
int sched_getscheduler(pid_t pid);

/* 让出处理器  */
extern int sched_yield (void) __THROW;

/* 获取调度器的最高优先级的值  */
extern int sched_get_priority_max (int __algorithm) __THROW;

/* 获取调度器的最小优先级的值  */
extern int sched_get_priority_min (int __algorithm) __THROW;

/* 获取进程__pid的SCHED_RR间隔  */
extern int sched_rr_get_interval (__pid_t __pid, struct timespec *__t) __THROW;
管理线程的亲和性
/* 设置线程对CPU的亲和性 */
int sched_setaffinity(pid_t pid, size_t cpusetsize,
	const cpu_set_t *mask);

/* 获取线程对CPU的亲和性
 * pid待获取线程的pid。如为0则获取的是当前线程的亲和性。
 * cupsetsize即mask所指向的数据的大小
 * mask代表了cpu的集合
 */
int sched_getaffinity(pid_t pid, size_t cpusetsize,
	cpu_set_t *mask);
操作CPU集合的宏
/*
  cpu_set_t的解释
  它代表了一个CPU的集合它实现为位的掩码。
  它应该被认为是不透明的,所有操作都应该通过宏来实现。
  
  typedef struct{
  unsigned long __bits[__CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;

 */

/* 清空集合set即让它不包含任何CPU */
void CPU_ZERO(cpu_set_t *set);

/* 把CPU"cpu"加到集合set里 */
void CPU_SET(int cpu, cpu_set_t *set);
/*  */
void CPU_CLR(int cpu, cpu_set_t *set);
/* 判断CPU"cpu"在不在集合set里
 * 返回值非0则在集合里0则不在集合里。
 */
int  CPU_ISSET(int cpu, cpu_set_t *set);

/*  */
int  CPU_COUNT(cpu_set_t *set);

/*  */
void CPU_AND(cpu_set_t *destset,
	cpu_set_t *srcset1, cpu_set_t *srcset2);
/*  */
void CPU_OR(cpu_set_t *destset,
	cpu_set_t *srcset1, cpu_set_t *srcset2);
/*  */
void CPU_XOR(cpu_set_t *destset,
	cpu_set_t *srcset1, cpu_set_t *srcset2);

/*  */
int  CPU_EQUAL(cpu_set_t *set1, cpu_set_t *set2);

/*  */
cpu_set_t *CPU_ALLOC(int num_cpus);
/*  */
void CPU_FREE(cpu_set_t *set);
/*  */
size_t CPU_ALLOC_SIZE(int num_cpus);

/*  */
void CPU_ZERO_S(size_t setsize, cpu_set_t *set);

/*  */
void CPU_SET_S(int cpu, size_t setsize, cpu_set_t *set);
/*  */
void CPU_CLR_S(int cpu, size_t setsize, cpu_set_t *set);
/*  */
int  CPU_ISSET_S(int cpu, size_t setsize, cpu_set_t *set);

/*  */
int  CPU_COUNT_S(size_t setsize, cpu_set_t *set);

/*  */
void CPU_AND_S(size_t setsize, cpu_set_t *destset,
	cpu_set_t *srcset1, cpu_set_t *srcset2);
/*  */
void CPU_OR_S(size_t setsize, cpu_set_t *destset,
	cpu_set_t *srcset1, cpu_set_t *srcset2);
/*  */
void CPU_XOR_S(size_t setsize, cpu_set_t *destset,
	cpu_set_t *srcset1, cpu_set_t *srcset2);

/*  */
int  CPU_EQUAL_S(size_t setsize, cpu_set_t *set1, cpu_set_t *set2);