如何获取多核,多cpu系统中指定cpu的序列号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取多核,多cpu系统中指定cpu的序列号相关的知识,希望对你有一定的参考价值。

在多cpu、多核中,会随机的获得不同的序列号.这就为我们根据cpu序列号来制作注册机带来了很大的麻烦。
Windows 2000/xp允许设置进程和线程的亲缘性。换句话说,可以控制哪个 CPU 能够运行某些线程。这称为硬亲缘性。
Windows提供了设置亲缘性的函数SetProcessAffinityMask 。
使用它可控制获取指定cpu的序列号
参考技术A 1、如何获得cpu的序列号。
使用cpuid指令来获取。
在调用CPUID之前,EAX中存放的是功能代码。在调用CPUID之后,EAX,EBX,ECX,EDX存放的是CPU的各种特征信息。这些信息也就是我们通常所说的CPU序列号。
mov eax, 0 //获取制造商信息
cpuid
mov eax, 1 //获得CPU的序列号
cpuid

以下三个函数,可供参考:

[c-sharp] view plaincopy
function NewCPUID: string;
const
CPUINFO = 'CPU制造商: %S 序列号: %x';
var
s: array[0..19] of Char;
MyCpuID: Integer;
begin
FillChar(s, 20, 0);
asm
push ebx
push ecx
push edx
mov eax, 0
cpuid
mov dword ptr s[0], ebx
mov dword ptr s[4], edx
mov dword ptr s[8], ecx
mov eax, 1
cpuid
mov MyCpuID, edx
pop edx
pop ecx
pop ebx
end;
Result := Format(CPUINFO, [s, MyCpuID]);
end;

function GetCPUID: TCPUID; assembler; register;
asm
PUSH EBX Save affected register
PUSH EDI
MOV EDI, EAX [email=@Resukt]@Resukt[/email]
MOV EAX, 1
DW $A20F CPUID Command
STOSD CPUID[1]
MOV EAX, EBX
STOSD CPUID[2]
MOV EAX, ECX
STOSD CPUID[3]
MOV EAX, EDX
STOSD CPUID[4]
POP EDI Restore registers
POP EBX
end;

//获取cpu的序列号:

function GetCnCPUID(): string;
const
CPUINFO = '%.8x-%.8x-%.8x-%.8x';
var
iEax: Integer;
iEbx: Integer;
iEcx: Integer;
iEdx: Integer;
begin
asm
push ebx
push ecx
push edx
mov eax, 1
DW $A20F//cpuid
mov iEax, eax
mov iEbx, ebx
mov iEcx, ecx
mov iEdx, edx
pop edx
pop ecx
pop ebx
end;
Result := Format(CPUINFO, [iEax, iEbx, iEcx, iEdx]);
end;
2、如何获取指定cpu或指定cpu核的序列号。
根据Windows可以设置进程和线程的亲缘性的特点,使用SetProcessAffinityMask函数,来控制哪个cpu来运行获取序列号的进程,因此也就获取了指定的cpu的序列号。为了和单cpu兼容,建议总是获取第一个cpu的序列号。

[c-sharp] view plaincopy

procedure SetCPU(h: THandle;CpuNo: Integer);
//CpuNo:决定了获得第几个cpu内核的第几个序列号。
var
ProcessAffinity: Cardinal;
_SystemAffinity: Cardinal;
begin
GetProcessAffinityMask(h, ProcessAffinity, _SystemAffinity) ;
ProcessAffinity := CpuNo; //this sets the process to only run on CPU 0
//for CPU 1 only use 2 and for CPUs 1 & 2 use 3
SetProcessAffinityMask(h, ProcessAffinity)
end;

使用方法:
SetCPU(GetCurrentProcess,1); //第一个cpu的第一个cpu内核
ShowMessage(GetCnCPUID);

怎么让apache利用多核CPU进行并发的问

参考技术A 1、在超线程技术的情况下,单核和多核cpu处理并发进程都是并行处理的,但单核并行处理的数量远低于多核。单核比多核更容易在多进程时假死。
2、多核并不止是多几个运算器,包括一二级缓存也是独立的。

以上是关于如何获取多核,多cpu系统中指定cpu的序列号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker compose 版本 3 中指定内存和 CPU 限制

Win32:计算多核/多处理器系统中的线程 CPU 利用率

多核CPU的主频如何计算?

C++ openmp并行程序在多核linux上如何最大化使用cpu

浅谈多核CPU多线程多进程

java如何获取系统内存、cpu等信息。