details_in_CPUSET

本文介绍 glibc2.14 版本中 x86_32 架构下 CPU set 的定义与操作宏,包括 CPU_SETSIZE 的设定、基本访问函数如 CPU_SET 和 CPU_ISSET 的实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

glibc 2.14 , x86 32

glibc 2.14/posix/sched.h

/* Access macros for `cpu_set'.  */
# define CPU_SETSIZE __CPU_SETSIZE
# define CPU_SET(cpu, cpusetp)	 __CPU_SET_S (cpu, sizeof (cpu_set_t), cpusetp)
# define CPU_CLR(cpu, cpusetp)	 __CPU_CLR_S (cpu, sizeof (cpu_set_t), cpusetp)
# define CPU_ISSET(cpu, cpusetp) __CPU_ISSET_S (cpu, sizeof (cpu_set_t), \
						cpusetp)
# define CPU_ZERO(cpusetp)	 __CPU_ZERO_S (sizeof (cpu_set_t), cpusetp)
# define CPU_COUNT(cpusetp)	 __CPU_COUNT_S (sizeof (cpu_set_t), cpusetp)

# define CPU_SET_S(cpu, setsize, cpusetp)   __CPU_SET_S (cpu, setsize, cpusetp)
# define CPU_CLR_S(cpu, setsize, cpusetp)   __CPU_CLR_S (cpu, setsize, cpusetp)
# define CPU_ISSET_S(cpu, setsize, cpusetp) __CPU_ISSET_S (cpu, setsize, \
							   cpusetp)
# define CPU_ZERO_S(setsize, cpusetp)	    __CPU_ZERO_S (setsize, cpusetp)
# define CPU_COUNT_S(setsize, cpusetp)	    __CPU_COUNT_S (setsize, cpusetp)

# define CPU_EQUAL(cpusetp1, cpusetp2) \
  __CPU_EQUAL_S (sizeof (cpu_set_t), cpusetp1, cpusetp2)
# define CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
  __CPU_EQUAL_S (setsize, cpusetp1, cpusetp2)

# define CPU_AND(destset, srcset1, srcset2) \
  __CPU_OP_S (sizeof (cpu_set_t), destset, srcset1, srcset2, &)
# define CPU_OR(destset, srcset1, srcset2) \
  __CPU_OP_S (sizeof (cpu_set_t), destset, srcset1, srcset2, |)
# define CPU_XOR(destset, srcset1, srcset2) \
  __CPU_OP_S (sizeof (cpu_set_t), destset, srcset1, srcset2, ^)
# define CPU_AND_S(setsize, destset, srcset1, srcset2) \
  __CPU_OP_S (setsize, destset, srcset1, srcset2, &)
# define CPU_OR_S(setsize, destset, srcset1, srcset2) \
  __CPU_OP_S (setsize, destset, srcset1, srcset2, |)
# define CPU_XOR_S(setsize, destset, srcset1, srcset2) \
  __CPU_OP_S (setsize, destset, srcset1, srcset2, ^)

# define CPU_ALLOC_SIZE(count) __CPU_ALLOC_SIZE (count)
# define CPU_ALLOC(count) __CPU_ALLOC (count)
# define CPU_FREE(cpuset) __CPU_FREE (cpuset)
glibc 2.14/bits/sched.h
#if defined _SCHED_H && !defined __cpu_set_t_defined
# define __cpu_set_t_defined
/* Size definition for CPU sets.  */
# define __CPU_SETSIZE	1024
# define __NCPUBITS	(8 * sizeof (__cpu_mask))

/* Type for array elements in 'cpu_set_t'.  */
typedef unsigned long int __cpu_mask;

/* Basic access functions.  */
# define __CPUELT(cpu)	((cpu) / __NCPUBITS)
# define __CPUMASK(cpu)	((__cpu_mask) 1 << ((cpu) % __NCPUBITS))

/* Data structure to describe CPU mask.  */
typedef struct
{
  __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;

/* Access functions for CPU masks.  */
# if __GNUC_PREREQ (2, 91)
#  define __CPU_ZERO_S(setsize, cpusetp) \
  do __builtin_memset (cpusetp, '\0', setsize); while (0)
# else
#  define __CPU_ZERO_S(setsize, cpusetp) \
  do {									      \
    size_t __i;								      \
    size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
    __cpu_mask *__bits = (cpusetp)->__bits;				      \
    for (__i = 0; __i < __imax; ++__i)					      \
      __bits[__i] = 0;							      \
  } while (0)
# endif
# define __CPU_SET_S(cpu, setsize, cpusetp) \
  (__extension__							      \
   ({ size_t __cpu = (cpu);						      \
      __cpu < 8 * (setsize)						      \
      ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]		      \
	 |= __CPUMASK (__cpu))						      \
      : 0; }))
# define __CPU_CLR_S(cpu, setsize, cpusetp) \
  (__extension__							      \
   ({ size_t __cpu = (cpu);						      \
      __cpu < 8 * (setsize)						      \
      ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]		      \
	 &= ~__CPUMASK (__cpu))						      \
      : 0; }))
# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
  (__extension__							      \
   ({ size_t __cpu = (cpu);						      \
      __cpu < 8 * (setsize)						      \
      ? ((((__const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]      \
	  & __CPUMASK (__cpu))) != 0					      \
      : 0; }))

# define __CPU_COUNT_S(setsize, cpusetp) \
  __sched_cpucount (setsize, cpusetp)

# if __GNUC_PREREQ (2, 91)
#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
  (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
# else
#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
  (__extension__							      \
   ({ __const __cpu_mask *__arr1 = (cpusetp1)->__bits;			      \
      __const __cpu_mask *__arr2 = (cpusetp2)->__bits;			      \
      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
      size_t __i;							      \
      for (__i = 0; __i < __imax; ++__i)				      \
	if (__bits[__i] != __bits[__i])					      \
	  break;							      \
      __i == __imax; }))
# endif

# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
  (__extension__							      \
   ({ cpu_set_t *__dest = (destset);					      \
      __const __cpu_mask *__arr1 = (srcset1)->__bits;			      \
      __const __cpu_mask *__arr2 = (srcset2)->__bits;			      \
      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
      size_t __i;							      \
      for (__i = 0; __i < __imax; ++__i)				      \
	((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i];    \
      __dest; }))

# define __CPU_ALLOC_SIZE(count) \
  ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask))
# define __CPU_ALLOC(count) __sched_cpualloc (count)
# define __CPU_FREE(cpuset) __sched_cpufree (cpuset)
sizeof cpu_set _t : 128
typedef unsigned long int __cpu_mask : 4
# define __NCPUBITS  (8 * sizeof (__cpu_mask)) : 32
__CPU_SETSIZE / __NCPUBITS : 32

size of __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS] : 128

cpuset 128B

4B*32

32b*32 = 1024b(CPUSETSIZE)

0       ...                   ...                        ...                       ...               31

0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000   
0000 0000   0000 0000   0000 0000   0000 0000

Note:

     
typedef struct
{
  unsigned long int __bits[32];
} cpu_set_t;

CPU_SET

将第(cpu)/32行,第(cpu)%32列的bit置1

# define __CPU_SET_S(cpu, 128, cpusetp) \

  (__extension__                                  \
   ({ size_t __cpu = (cpu);                              \
      __cpu < 1024                              \
      ? (((unsigned long int *) ((cpusetp)->__bits))[((cpu) / 32))]              \
     |= ((unsigned long int) 1 << ((cpu) % 32)))                              \
      : 0; }))

centos6.2 32位, intel Pentium Dual-core

(unsigned long int) 1:                           1000 0000   0000 0000   0000 0000   0000 0000   
(unsigned long int) 1 << ((8) % 32) :  0000 0000   1000 0000   0000 0000   0000 0000   

CPU_ISSET

相应位是否置1

# define __CPU_ISSET_S(cpu, 128, cpusetp) \
  (__extension__                                  \
   ({ size_t __cpu = (cpu);                              \
      __cpu < 1024                              \
      ? (((unsigned long int *) ((cpusetp)->__bits))[((cpu) / 32))]              \
     &= ((unsigned long int) 1 << ((cpu) % 32)))                              \
      : 0; }))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值