精华内容
下载资源
问答
  • sched_getaffinity
    2018-12-28 23:57:00

    sched_getaffinity和pthread_getaffinity_np都是绑核的函数,网上都说sched_getaffinity是用来绑定进程的,pthread_getaffinity_np是用来绑定线程的。但是我们知道,绑定进程从本质上来讲,也是绑定线程,那这两个有什么区别呢?

    可以发现,这两个方法传入的第一个参数是不一样的,sched_getaffinity传入的是进程ID,pthread_getaffinity_np传入的是线程ID。也就是说,一个线程会有两个ID,一个叫进程ID,一个叫线程ID,进程ID在内核中是独立的,由内核维护,线程ID在进程中是独立的,由进程维护。进程ID在不同进程间是有效的,这意味着你可以在进程中修改其他进程的属性,而线程ID无法在不同进程间共享。所以这两个函数最大的区别是,你可以在进程a调用sched_getaffinity修改掉进程b中的某个线程的绑定核。

    补充一点,在linux中,线程是在原进程中clone出来的新进程中运行的,和原进程共享内存。所以这也是线程有进程ID的原因。

    转载于:https://www.cnblogs.com/scaugsh/p/10193436.html

    更多相关内容
  • 查看 linux 主机的 cpu 信息在linux主机下执行lscpu命令,可以得到如下结果:意思是我的linux主机有 1 个 cpu,每个 cpu 的核心有 2 个,每个核心支持 2 个线程...sched_setaffinity 函数简介首先 man 一下,得到所...

    查看 linux 主机的 cpu 信息

    在linux主机下执行lscpu命令,可以得到如下结果:

    意思是我的linux主机有 1 个 cpu,每个 cpu 的核心有 2 个,每个核心支持 2 个线程。那么在进行多线程编程的时候,如何为某个线程指定 cpu('Thread')呢?答案就是借助 sched_setaffinity 函数。

    sched_setaffinity 函数简介

    首先 man 一下,得到所需头文件和函数原型:

    如果函数调用成功,返回 0,失败的话,返回 -1,错误码放入 errno。

    这个函数可以决定线程在指定的 cpu 中运行。在多进程系统中,适当的为线程指定 cpu 可以提升效率,比如,指定线程 A 在 cpu 0 中运行,限定其他线程在其他 cpu 运行,那么线程 A 的执行速度和实时性就可以得到最大程度的保障。另外,cpu 也是有高速缓存的,执行线程频繁切换 cpu 也会导致缓存的命中率大大降低,同样影响执行效率。

    sched_setaffinity 函数通过 cpu_set_t 结构体数据类型的掩码(mask)指定 cpu,掩码的操作可以通过一些宏定义实现,比如 CPU_SET等。操作哪一个线程则通过参数一pid指定,如果pid==0,那么为当前正在调用sched_setaffinity 函数的线程指定 cpu。

    sched_setaffinity 函数指定的 cpu,通过 fork分出的子进程也继承之。

    By the way,sched_getaffinity 函数基本与sched_setaffinity 函数相同,只不过一个是设置,一个是获取。

    为线程指定 cpu,CPU_SET 系列宏的介绍和使用

    继续man之,得到其所需头文件:

    打开该头文件

    发现宏定义的底层定义在 里,打开之

    得到 CPU_SET 系列宏的实现如下:

    其实就是定义了一个unsigned long int型的数组,使用每一位表示 cpu。例如,cpu 1 就是数组的第一个元素里的第 1 位(从0开始计数)。

    使用 sched_setaffinity 函数 demo

    下面这个程序创建一个子进程,父子进程都为自己指定一个 cpu,然后都循环执行一段代码消耗一些 cpu 运行时间。程序运行时需要3个参数,分别是: 即将为父进程指定的 cpu 号,即将为子进程指定的 cpu 号,循环执行代码的循环次数。

    编译之,然后我们使用 linux 的time命令来测试程序运行所需要的时间,测试分为 3 种情况:父子进程使用同一个 cpu

    父子进程使用同一个核心的不同 cpu

    父子进程使用不同的核心不同的 cpu

    测试结果如下:

    real time 是指实际消耗的时间,user time 是指程序运行在用户态消耗的时间,sys time 是指程序运行在内核态消耗的时间,在父子进程使用同一个 cpu 时,real time 近似等于 user time 与 sys time 之和。当为父子进程指定不同的 cpu 时,real time 小于 user time 与 sys time 之和了,这是因为 user time 和 sys time 统计的是总时间,这里父子进程共使用了两个 cpu,因此总的消耗时间被分摊了,此时可以看出 real time 近似等于 user time 与 sys time 之和的一半。

    展开全文
  • python setup.py build ...//if (sched_getaffinity(pid, len, &cpuset) ) +263 + if (sched_getaffinity( len , &cpuset) < 0 ) +264 + return PyErr_SetFromErrno(PyExc_OSError); 再编译不在报错。
    1. python setup.py build
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -DPSUTIL_POSIX=1 -DPSUTIL_VERSION=543 -DPSUTIL_LINUX=1 -DPSUTIL_ETHTOOL_MISSING_TYPES=1 -I/opt/python2.7 -c psutil/_psutil_linux.c -o build/temp.linux-x86_64-2.7/psutil/_psutil_linux.o
    psutil/_psutil_linux.c: In function `psutil_proc_cpu_affinity_get':
    psutil/_psutil_linux.c:362: warning: passing arg 2 of `sched_getaffinity' makes pointer from integer without a cast
    psutil/_psutil_linux.c:362: too many arguments to function `sched_getaffinity'
    psutil/_psutil_linux.c: In function `psutil_proc_cpu_affinity_set':
    psutil/_psutil_linux.c:431: warning: passing arg 2 of `sched_setaffinity' makes pointer from integer without a cast
    psutil/_psutil_linux.c:431: too many arguments to function `sched_setaffinity'
    psutil/_psutil_linux.c: In function `init_psutil_linux':
    psutil/_psutil_linux.c:663: warning: unused variable `v'
    error: command 'gcc' failed with exit status 1

    注:报psutil/_psutil_linux.c:431: too many arguments to function
    方法参照:http://www.linuxdiyf.com/viewarticle.php?id=102977

    vi psutil/_psutil_linux.c
    修改(431报错修改同262)
    +262+ if (sched_getaffinity(pid, len, &cpuset) < 0)
    +263+        return PyErr_SetFromErrno(PyExc_OSError);
    
    +262+ //if (sched_getaffinity(pid, len, &cpuset) < 0)
    +263+ if (sched_getaffinity(len, &cpuset) < 0)
    +264+        return PyErr_SetFromErrno(PyExc_OSError);
    

    再编译不在报错。

    展开全文
  • sched_getaffinity (pid_t pid, unsigned int cpusetsize, cpu_set_t *mask) 该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值...

    CPU亲和性(affinity)就是进程要在某个给定的CPU上尽量长时间的运行而不被迁移到其他处理器的倾向性。
    linux内核进程调度器天生具有软CPU亲和性(affinity)的特性,着意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。

    Linux内核还包含一些机制,它让开发人员可以编程实现硬CPU亲和性(affinity)。着意味着应用程序可以显示的指定进程在那个(或那些)处理器上运行。

    在Linux内核中,所有的进程都有一个相关的数据结构,称为task_struct。这个结构非常重要,原因有:其中与亲和性(affinity)相关度最高的是cpus_allowed位掩码。这个位掩码由n位组成,这与系统中的n位逻辑处理器一一对应。具有4个物理CPU的系统可以有4位。如果这些CPU都启用了超线程,那么这个系统就有一个8位的位掩码。

    如果为给定的进程设置了给定的位,那么这个进程就可以在相关的 CPU 上运行。因此,如果一个进程可以在任何 CPU 上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是 1。实际上,这就是 Linux 中进程的缺省状态。

    如果为给定的进程设定给定的位,那么这个进程可以在相关的CPU上运行,所以如果一个进程可以在任何CUP上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是1。实际上这就是Linux的缺省状态。

    一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
    ·CPU_ZERO() 清空一个集合
    ·CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉.
    ·CPU_ISSET()检查一个CPU号是否在这个集合中.

    下面两个函数就是用来设置获取线程CPU亲和力状态:
    ·sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
    该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上.第二个参数cpusetsize是mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的进程此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行.
    sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
    该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值为0.也表示的是当前进程

    而mask的表现是如此的:如果是0X23,转换成二进制则为00100011,则表明进程绑定在0核、1核和5核上。

    绑核需要注意是,子进程会继承父进程的绑核关系。

    展开全文
  • sched_getaffinity(0, sizeof(mycpuid), &mycpuid); if ( check_cpu_expensive_op(computation_res) ) { printf("SUCCESS: Thread completed, and PASSED integrity check!\n", mycpuid); ret = TRUE; } ...
  • sched_getaffinity( 0 , sizeof(mycpuid), &mycpuid); if ( check_cpu_expensive_op(computation_res) ) { printf( "SUCCESS: Thread completed, and PASSED integrity check!\n" , mycpuid); ret = TRUE ;...
  • sched_getaffinity(0, sizeof(mycpuid), &mycpuid); if ( check_cpu_expensive_op(computation_res) ) { printf("SUCCESS: Thread completed, and PASSED integrity check!\n", mycpuid); ret = TRUE; } ...
  • 1、让出处理器Linux提供一个系统调用运行进程主动让出执行权:sched_yield。进程运行的好好的,为什么需要这个函数呢?有一种情况是用户空间线程的锁定。如果一个线程试图取得另一个线程所持有的锁,则新的线程应该...
  • 通过sched_setaffinity 设置 CPU 亲和力的掩码,从而将该线程或者进程和指定的CPU绑定 一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作: CPU_ZERO() 清空一个集合...
  • sched_getaffinity(pid, sizeof(mask),&mask);//获取进程当前的CPU亲和性 //打印进程CPU亲和性 printf("进程 %d 使用了下面的CPU:\n",pid); for(i=0;i<cpu_nums;i++){ if(CPU_ISSET(i,&mask)){ printf("%d ...
  • 线程绑定CPU核-sched_setaffinity

    万次阅读 多人点赞 2015-12-25 18:06:34
    if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力 { printf("warning: cound not get thread affinity, continuing...\n"); } int i; for (i = 0; i ; i++) { if (CPU_ISSET(i, &get...
  • 【转】sched_getscheduler

    2015-08-18 10:12:37
    http://examplenow.com/zh-cn/sched_getscheduler/man2 SCHED_SETSCHEDULER Section: Linux Programmer's Manual (2) Updated: 2008-11-06 ...sched_setscheduler, sched_getscheduler -
  • zz http://linux.frank4dd.com/en/man3/pthread_setaffinity_np.htm http://www.daemon-systems.org/man/pthread_getaffinity_np.3.html pthread_setaffinity_np and sched_setaffinity 样例程序 NAME
  • 如何使用python找出CPU数量

    千次阅读 2020-01-21 13:51:03
    我想知道使用 Python 的本地计算机上的CPU数量。 当使用最佳缩放的仅用户空间程序调用时,结果应该是 user/real 如 time(1) 所输出。 ... """ Number of available virtual ... workers = len(os.sched_getaffinity(0))
  • sched_getaffinity(0, sizeof(mycpuid), &mycpuid); if ( check_cpu_expensive_op(computation_res) ) { printf("SUCCESS: Thread completed, and PASSED integrity check!\n", mycpuid); ret = TRUE; } ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,127
精华内容 450
关键字:

sched_getaffinity