【发布时间】:2018-08-25 22:23:35
【问题描述】:
我对此非常具体。 我需要知道该设备是否具有具有异构内核的 CPU,例如 ARM's big.LITTLE technology,例如,一组 4 个 ARM Cortex-A53 + 另一组 4 个更强大的 ARM Cortex-A72,总共 8 个内核,基本上 2 个处理器同一个芯片。处理器型号并不重要。
我正在考虑的是读取所有内核的scaling_max_freq 并将具有不同最大频率的内核分组(然后比较它们),但我注意到在某些设备中,任何不是 cpu0 实际上是 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
也就是说,如果我尝试读取 cpu3 的 scaling_max_freq,它将是一个指向 cpu0 的 scaling_max_freq 的链接。我想知道在这种情况下我是否可以认为我们不是在异构环境中运行。
CPU 类
public final class CPU {
// To be formatted with specific core number
private static final String CPU_DIR = "/sys/devices/system/cpu/cpu%d";
private static final String CPUFREQ_DIR = CPU_DIR + "/cpufreq";
public static final String SCALING_MAX_FREQ = CPUFREQ_DIR + "/scaling_max_freq";
private static final String DEFAULT_FREQS = "200000 400000 800000 1200000";
private CPU() {
}
// Here I'd replace 0 with (other) core number
@NonNull
public static synchronized String[] getAvailFreqs() {
String[] split;
String freqs = FileUtils.readFile(format(SCALING_AVAIL_FREQS, 0), DEFAULT_FREQS);
try {
split = freqs.split(" ");
} catch (Exception e) {
split = DEFAULT_FREQS.split(" ");
}
return split;
}
// Here I'd replace 0 with (other) core number
public static synchronized int getMaxFreq() {
try {
return Integer.parseInt(FileUtils.readFile(format(SCALING_MAX_FREQ, 0), "1200000"));
} catch (Exception ignored){}
return 1200000;
}
private static String format(String format, Object arg) {
return String.format(Locale.US, format, arg);
}
}
FileUtils 类
public final class FileUtils {
private FileUtils() {
}
public static String readFile(String pathname, String defaultOutput) {
return baseReadSingleLineFile(new File(pathname), defaultOutput);
}
public static String readFile(File file, String defaultOutput) {
return baseReadSingleLineFile(file, defaultOutput);
}
// Async
private static String baseReadSingleLineFile(File file, String defaultOutput) {
String ret = defaultOutput;
Thread thread = new Thread(() -> {
if (file.isFile() || file.exists()) {
if (file.canRead()) {
try {
FileInputStream inputStream = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = reader.readLine(); // Fisrt line
reader.close();
inputStream.close();
ret = line;
} catch (Exception ignored) {}
} else
// Uses cat command
ret = RootUtils.readFile(file, defaultOutput);
}
});
thread.start();
// 3 seconds timeout
long endTimeMillis = System.currentTimeMillis() + 3000;
while (thread.isAlive())
if (System.currentTimeMillis() > endTimeMillis)
return defaultOutput;
return ret;
}
}
【问题讨论】:
标签: android linux linux-kernel cpu root