我如何知道在C程序中,我的代码在哪个物理处理器和内核上运行? 我正在使用Linux和gcc 4.4.3。
你可以检查/ proc // stat文件系统,根据http://www.kernel.org/doc/Documentation/filesystems/proc.txt ,你应该只检查task_cpu标志。
作为例子没有正确的类型和错误检查:
struct pstat { int pid; //process id char tcomm[256];//filename of the executable char state[2]; //state (R is running, S is sleeping, D is sleeping in an //uninterruptible wait, Z is zombie, T is traced or stopped) int ppid;// process id of the parent process int pgrp;// pgrp of the process int sid;// session id int tty_nr;// tty the process uses int tty_pgrp;// pgrp of the tty int flags;// task flags int min_flt;// number of minor faults int cmin_flt;// number of minor faults with child's int maj_flt;// number of major faults int cmaj_flt;// number of major faults with child's int utime;// user mode jiffies int stime;// kernel mode jiffies int cutime;// user mode jiffies with child's int cstime;// kernel mode jiffies with child's int priority;// priority level int nice;// nice level int num_threads;// number of threads int it_real_value;// (obsolete, always 0) int start_time;// time the process started after system boot int vsize;// virtual memory size int rss;// resident set memory size int rsslim;// current limit in bytes on the rss int start_code;// address above which program text can run int end_code;// address below which program text can run int start_stack;// address of the start of the stack int esp;// current value of ESP int eip;// current value of EIP int pending;// bitmap of pending signals int blocked;// bitmap of blocked signals int sigign;// bitmap of ignored signals int sigcatch;// bitmap of catched signals int wchan;// address where process went to sleep int i0;// (place holder) int i1;// (place holder) int exit_signal;// signal to send to parent thread on exit int task_cpu;// which CPU the task is scheduled on int rt_priority;// realtime priority int policy;// scheduling policy (man sched_setscheduler) int blkio_ticks;// time spent waiting for block IO int gtime;// guest time of the task in jiffies int cgtime;// guest time of the task children in jiffies } p ; int main() { char name[256]; char state[8]; FILE* f = fopen("/proc/self/stat", "r"); fscanf(f, "%d%s%s%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", &p.pid, &p.tcomm, &p.state, &p.ppid, &p.pgrp, &p.sid, &p.tty_nr, &p.tty_pgrp, &p.flags, &p.min_flt, &p.cmin_flt, &p.maj_flt, &p.cmaj_flt, &p.utime, &p.stime, &p.cutime, &p.cstime, &p.priority, &p.nice, &p.num_threads, &p.it_real_value, &p.start_time, &p.vsize, &p.rss, &p.rsslim, &p.start_code, &p.end_code, &p.start_stack, &p.esp, &p.eip, &p.pending, &p.blocked, &p.sigign, &p.sigcatch, &p.wchan, &p.i0, &p.i1, &p.exit_signal, &p.task_cpu, &p.rt_priority, &p.policy, &p.blkio_ticks, &p.gtime, &p.cgtime); printf("CPU %d\n", p.task_cpu); return 0; }
sched_getcpu()
调用返回虚拟CPU号码。 虚拟CPU到实际CPU信息的映射位于/ proc / cpuinfo中。
如果你的系统支持VDSO,那么sched_getcpu()
是相对较快的。
CPU号码也可以使用CPUID
指令获得,但比sched_getcpu()
慢。
见http://en.wikipedia.org/wiki/CPUID#Accessing_the_id_from_other_languages
你想要的是APIC ID …基本上:
cpuid shr ebx, 24
您可以使用GCC获取进程与处理器的亲和力。 CPU亲和力 API可能会帮助你。 您是否正在尝试使用这些信息来确保您的流程不会中断或高优先级的任务?
总的来说,很难以有意义的方式发现这一点。 您的线程在其生命周期中经常运行在许多不同的处理器上。 你可以调用一个函数来询问你正在使用哪个处理器,并在函数执行时获得一个上下文切换。 函数应该返回什么?