永发信息网

linux单进程如何实现多核cpu多线程分配?

答案:2  悬赏:10  手机版
解决时间 2021-01-24 22:48
linux单进程如何实现多核cpu多线程分配?
最佳答案
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);
全部回答
"程序本身不可修改,现在的问题就是如何将此程序多线程化以达到效果"
---- 如果不能修改程序本身,怎么变成多线程程序??? 楼主还是先去搞搞清楚进程、线程的基本概念吧。追问就是说除非更改程序,否则无法通过其他手段达到单进程使用多线程对吗?我一直以来认为这是内核调用的问题,是否能通过软件实现进程多线程话呢?追答算了,帮你普及一点基本概念:
一个进程, 可能只有一个线程,此时叫 单线程进程,对于这样的进程,不管你用什么 CPU,什么工具,什么调用,在任何时刻,最多只能有 一个 cpu(内核)执行这个进程。
一个(linux)进程,可以通过 pthread 线程库提供的接口 (但是这是需要在这个程序的源码里使用的接口,对于已有的程序,必须修改其源码,重新编译生成新的程序才行),实现进程内拥有多条线程,此时叫多线程进程,只有多线程进程才能利用到多核处理器,即不同的cpu核心执行不同的线程。追问嗯,线程的概念和cpu搞糊涂了,谢谢了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
炖鸭子可以放香菇和绿豆吗
蜜糖皇后用英语怎么说?翻译成英语,蜜糖皇后也
黛安芬美容美体地址在什么地方,我要处理点事
老九棋牌馆地址在什么地方,想过去办事
患儿,女,6个月,因肺炎住院,目前出现腹胀
京城颐养女子概念馆地址好找么,我有些事要过
富华棋牌地址在什么地方,我要处理点事
科比15场0分全纪录
为什么我家 WiFi没连的时候满信号,一连就没
伊人坊美容美体养生苑地址好找么,我有些事要
【直通井】以下地点必须设有直通矿井调度室电
如何关闭支付宝花呗 支付宝花呗关闭方法
唛歌量贩KTV地址在什么地方,想过去办事,
和女生牵手后,也有搂她,都同意,下一步要做
下列关于水闸施工的说法错误的是()。A.相邻两
推荐资讯
炫舞时代放掉级的符能防止武器破碎么?
美丽华驾校(常州天宁区)地址在什么地方,我要
促进国际关系民主化,协力构建各种文明兼容并
异地的红木家具托运哪家物流公司是常做的,最
康庄旅馆(宜昌夷陵)地址在什么地方,我要处理
打长途的时候第一次打显示号码不正确,第二次
FSC家庭服务中心(焦作马村区)地址在什么地方
幸福时光地址有知道的么?有点事想过去!
通常将运动技能的形成分为怎样的过程阶段?在
就是我网上贷款,他们让我拿6000元存到我银行
根据《大气污染防治行动计划》,到2017年,我
什么是四位一体?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?