linux单进程如何实现多核cpu多线程分配?
答案:2 悬赏:10 手机版
解决时间 2021-01-24 22:48
- 提问者网友:缘字诀
- 2021-01-24 00:03
linux单进程如何实现多核cpu多线程分配?
最佳答案
- 五星知识达人网友:孤独入客枕
- 2021-01-24 01:04
linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主要有2个方法
1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配到CPU的每个核上面,只要这个服务不停止,多线程分配就可以自己实现。但是要注意,如果线程函数内部的有某个循环,且该循环内没有任何系统调用的话,可能会导致这个线程的CPU时间无法被切换出去。也就是占满CPU现象,此时加个系统调用,例如sleep,线程所占的CPU时间就可以切换出去了。
2:利用pthread库自带的线程亲和性设置函数,来设置线程在某个CPU核心上跑,这个需要在程序内部实现。同时注意不要和进程亲和性设置搞混淆了
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
cpu_set_t *cpuset);
从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
//初始化,设为空
void CPU_ZERO (cpu_set_t *set);
//将某个cpu加入cpu集中
void CPU_SET (int cpu, cpu_set_t *set);
//将某个cpu从cpu集中移出
void CPU_CLR (int cpu, cpu_set_t *set);
//判断某个cpu是否已在cpu集中设置了
int CPU_ISSET (int cpu, const cpu_set_t *set);
1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配到CPU的每个核上面,只要这个服务不停止,多线程分配就可以自己实现。但是要注意,如果线程函数内部的有某个循环,且该循环内没有任何系统调用的话,可能会导致这个线程的CPU时间无法被切换出去。也就是占满CPU现象,此时加个系统调用,例如sleep,线程所占的CPU时间就可以切换出去了。
2:利用pthread库自带的线程亲和性设置函数,来设置线程在某个CPU核心上跑,这个需要在程序内部实现。同时注意不要和进程亲和性设置搞混淆了
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
cpu_set_t *cpuset);
从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
//初始化,设为空
void CPU_ZERO (cpu_set_t *set);
//将某个cpu加入cpu集中
void CPU_SET (int cpu, cpu_set_t *set);
//将某个cpu从cpu集中移出
void CPU_CLR (int cpu, cpu_set_t *set);
//判断某个cpu是否已在cpu集中设置了
int CPU_ISSET (int cpu, const cpu_set_t *set);
全部回答
- 1楼网友:神也偏爱
- 2021-01-24 01:21
"程序本身不可修改,现在的问题就是如何将此程序多线程化以达到效果"
---- 如果不能修改程序本身,怎么变成多线程程序??? 楼主还是先去搞搞清楚进程、线程的基本概念吧。追问就是说除非更改程序,否则无法通过其他手段达到单进程使用多线程对吗?我一直以来认为这是内核调用的问题,是否能通过软件实现进程多线程话呢?追答算了,帮你普及一点基本概念:
一个进程, 可能只有一个线程,此时叫 单线程进程,对于这样的进程,不管你用什么 CPU,什么工具,什么调用,在任何时刻,最多只能有 一个 cpu(内核)执行这个进程。
一个(linux)进程,可以通过 pthread 线程库提供的接口 (但是这是需要在这个程序的源码里使用的接口,对于已有的程序,必须修改其源码,重新编译生成新的程序才行),实现进程内拥有多条线程,此时叫多线程进程,只有多线程进程才能利用到多核处理器,即不同的cpu核心执行不同的线程。追问嗯,线程的概念和cpu搞糊涂了,谢谢了
---- 如果不能修改程序本身,怎么变成多线程程序??? 楼主还是先去搞搞清楚进程、线程的基本概念吧。追问就是说除非更改程序,否则无法通过其他手段达到单进程使用多线程对吗?我一直以来认为这是内核调用的问题,是否能通过软件实现进程多线程话呢?追答算了,帮你普及一点基本概念:
一个进程, 可能只有一个线程,此时叫 单线程进程,对于这样的进程,不管你用什么 CPU,什么工具,什么调用,在任何时刻,最多只能有 一个 cpu(内核)执行这个进程。
一个(linux)进程,可以通过 pthread 线程库提供的接口 (但是这是需要在这个程序的源码里使用的接口,对于已有的程序,必须修改其源码,重新编译生成新的程序才行),实现进程内拥有多条线程,此时叫多线程进程,只有多线程进程才能利用到多核处理器,即不同的cpu核心执行不同的线程。追问嗯,线程的概念和cpu搞糊涂了,谢谢了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯