linux进程线程绑核运行

一、概述

现在大家使用的基本上都是多核cpu。平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在不同的核上轮番运行。

对于普通的应用,操作系统的默认调度机制是没有问题的。但是,当某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。

把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不会再被操作系统调度到其他核上。但绑定的这个核上还是可能会被调度运行其他应用程序的。

二、操作系统对多核cpu的调度

软件开发在多核环境下的核心是多线程开发。这个多线程不仅代表了软件实现上多线程,要求在硬件上也采用多线程技术。

多核操作系统的关注点在于进程的分配和调度。进程的分配将进程分配到合理的物理核上,因为不同的核在共享性和历史运行情况都是不同的。有的物理核能够共享二级cache,而有的却是独立的。如果将有数据共享的进程分配给有共享二级cache的核上,将大大提升性能;反之,就有可能影响性能。

进程调度会涉及实时性、负载均衡等问题,目前研究的热点问题主要集中在以下方面:

  • 程序的并行开发设计
  • 多进程的时间相关性
  • 任务的分配和调度
  • 缓存的错误共享
  • 一致性访问问题
  • 进程间通信
  • 多处理器核内部资源竞争

多进程和多线程在cpu核上运行情况:

  • 每个 CPU 核运行一个进程的时候,由于每个进程的资源都独立,所以 CPU 核心之间切换的时候无需考虑上下文;
  • 每个 CPU 核运行一个线程的时候,有时线程之间需要共享资源,所以这些资源必须从 CPU 的一个核心被复制到另外一个核心,这会造成额外的开销;

三、线程绑定到物理核上

bool bindCpu(int iCpuNumber)
{
	cpu_set_t    mask; //CPU核的集合
	pthread_t    tThreadid;

	CPU_ZERO(&mask); //清空一个集合
	CPU_SET(iCpuNumber, &mask); // 将一个给定的CPU号加到一个集合
	
	tThreadid = pthread_self();  // 获取本线程id
	
	/*设置该线程和CPU的亲和性的。
	简单来讲就是:某一线程跑在了哪个CPU上;表示线程和CPU之间关系的函数*/
	if (pthread_setaffinity_np(tThreadid, sizeof(mask), &mask) != 0)
	{
		return false;
	}
	return true;
}
发布了111 篇原创文章 · 获赞 0 · 访问量 2090

猜你喜欢

转载自blog.csdn.net/weixin_38932035/article/details/104696528