多线程vs多进程,谁在Linux能更好发挥多核CP

多线程vs多进程,谁在Linux能更好发挥多核CP,第1张

线程和多进程应该是各有所长吧,它们都能很好的发挥处理器多核性能,对于多进程来说,Linux的进程是轻量级的,进程本身的资源开销相当小,而且Linux的进程可以互相协作、互相发送消息、互相中断,还可以共享内存段,编写多个相互协作的进程也要比编写多线程更容易,所以在Linux编程中多进程要比多线程更加常用一些。但是多进程之间共享变量不是很容易,它们毕竟是各自独立的实体,而多线程可以很容易的共享变量(当然前提是搞好线程同步),所以会有一些数据库服务器程序用多线程技术,总之就是各有所长,根据编程的需要进行取舍。

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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/6162190.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-16
下一篇 2023-03-16

发表评论

登录后才能评论

评论列表(0条)

保存