C/C++ windows 获取CPU核数

本文介绍了一种使用C++编程语言来获取系统中处理器数量的方法。通过调用Windows API函数GetSystemInfo并利用SYSTEM_INFO结构体中的dwNumberOfProcessors成员来返回处理器数量。
// 获得本机中处理器的数量
int CIOCPModel::_GetNoOfProcessors()
{
	SYSTEM_INFO si;

	GetSystemInfo(&si);

	return si.dwNumberOfProcessors;
}

<think> 我们有两种主要方法获取CPU: 1. 使用Java标准库的`Runtime.getRuntime().availableProcessors()` 2. 使用第三方库(如OSHI)获取更详细的CPU信息,包括 注意:在容器环境中,早期JDK版本(如1.8早期)的`availableProcessors()`会返回宿主机的CPU,而不是容器的限制。这个问题在较新的JDK版本(如1.8u191+)中已修复,支持容器识别。 因此,根据环境选择: - 如果运行在较新的JDK(>=1.8u191)或非容器环境,可以直接使用`Runtime.getRuntime().availableProcessors()` - 如果运行在旧版JDK的容器中,可能需要通过环境变量(如`CPU_LIMIT`)或第三方库(如OSHI)来获取 下面分别给出两种方法的代码示例: 方法1:使用Java标准库 ```java int cores = Runtime.getRuntime().availableProcessors(); System.out.println("CPU cores: " + cores); ``` 方法2:使用OSHI库(需要添加依赖) 首先,在Maven项目中添加依赖: ```xml <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>6.4.0</version> <!-- 使用最新版本 --> </dependency> ``` 然后使用以下代码: ```java import oshi.SystemInfo; import oshi.hardware.CentralProcessor; public class CpuInfoExample { public static void main(String[] args) { SystemInfo systemInfo = new SystemInfo(); CentralProcessor processor = systemInfo.getHardware().getProcessor(); int physicalProcessorCount = processor.getPhysicalProcessorCount(); // 物理处理器(插槽) int physicalCoreCount = processor.getPhysicalProcessorCount(); // 物理(总) int logicalCoreCount = processor.getLogicalProcessorCount(); // 逻辑(包括超线程) // 通常我们说的指的是逻辑,因为超线程可以让一个心模拟出两个线程 System.out.println("Logical cores: " + logicalCoreCount); } } ``` 注意:在容器环境中,OSHI库也会返回容器内可见的CPU逻辑),因此可以正确获取。 补充:对于容器环境,如果不想引入第三方库,也可以通过读取Linux的cgroup信息获取(仅适用于Linux容器): ```java public static int getContainerCpuCores() { // 尝试读取cgroup的cpu配额 String cpuQuotaFile = "/sys/fs/cgroup/cpu/cpu.cfs_quota_us"; String cpuPeriodFile = "/sys/fs/cgroup/cpu/cpu.cfs_period_us"; try { long quota = Long.parseLong(Files.readAllLines(Paths.get(cpuQuotaFile)).get(0)); if (quota > 0) { long period = Long.parseLong(Files.readAllLines(Paths.get(cpuPeriodFile)).get(0)); if (period > 0) { int containerCores = (int) Math.ceil((double) quota / period); return containerCores; } } } catch (Exception e) { // 如果读取失败,则使用Runtime } return Runtime.getRuntime().availableProcessors(); } ``` 综上所述,推荐使用OSHI库,因为它提供了跨平台和容器友好的解决方案。 §§相关问题§§ 1. 如何在Java中检测当前环境是否为容器? 2. OSHI库还能获取哪些系统信息? 3. 在容器中如何正确设置JVM的并行GC线程? </think> ### Java获取CPU的方法详解 #### 1. 标准JDK方法(推荐) ```java // 获取逻辑处理器数量(包括超线程心) int processors = Runtime.getRuntime().availableProcessors(); System.out.println("CPU: " + processors); ``` - **适用场景**:JDK 1.8u191+ 的容器环境或非容器环境[^1] - **注意事项**: - 对于容器环境: - JDK 1.8u102 及更早版本会返回宿主机(需升级JDK) - JDK 1.8u191+ 支持容器感知,正确返回容器分配的 - 返回值包含超线程心(如48线程返回8) #### 2. OSHI第三方库(跨平台) ```java // Maven依赖 <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>6.4.0</version> </dependency> // 代码实现 SystemInfo si = new SystemInfo(); HardwareAbstractionLayer hal = si.getHardware(); // 获取物理(不含超线程) int physicalCores = hal.getProcessor().getPhysicalProcessorCount(); // 获取逻辑(含超线程) int logicalCores = hal.getProcessor().getLogicalProcessorCount(); ``` - **优势**: - 自动适配容器环境 - 支持Windows/Linux/macOS - 提供更多CPU信息(频率、负载等) #### 3. Linux容器特殊处理 ```java // 检查cgroup限制(适用于旧版JDK容器) public static int getContainerCores() { try { // 读取cgroup配额 String quotaStr = Files.readString(Path.of("/sys/fs/cgroup/cpu/cpu.cfs_quota_us")); String periodStr = Files.readString(Path.of("/sys/fs/cgroup/cpu/cpu.cfs_period_us")); long quota = Long.parseLong(quotaStr.trim()); long period = Long.parseLong(periodStr.trim()); if(quota > 0 && period > 0) { return (int) Math.ceil((double)quota / period); } } catch (Exception e) { // 回退到标准方法 } return Runtime.getRuntime().availableProcessors(); } ``` ### 选择建议 | 场景 | 推荐方法 | 说明 | |---------------------|----------------------------------|---------------------------| | JDK 1.8u191+ 容器 | `Runtime.getRuntime().availableProcessors()` | 无需特殊处理[^1] | | JDK 1.8u102 容器 | OSHI库 或 cgroup读取 | 避免宿主机错误 | | 物理服务器 | 任意方法 | 结果一致 | | 需要物理 | OSHI的`getPhysicalProcessorCount()` | 排除超线程心 | > **验证容器分配**: > 在容器内执行命令验证: > ```bash > cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us # 查看CPU时间配额 > cat /sys/fs/cgroup/cpu/cpu.cfs_period_us # 周期(通常100000) > # 计算 = ceil(配额/周期) > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值