2010-07-27 16 views
6

द्वारा प्रयुक्त समय सीपीयू मैं चल रही सभी प्रक्रियाओं और उनकी आईडी की सूची प्राप्त करने के लिए इस listing पर कोड को लागू करने में कामयाब रहा हूं। अब मुझे यह समझना है कि प्रत्येक प्रक्रिया सीपीयू का कितना समय उपयोग करती है।प्रक्रिया सीपीयू

मैंने कोड में चाबियों का जिक्र करने का प्रयास किया है, लेकिन जब मैं 'सीपीयू टाइम की टिक' प्रिंट करने का प्रयास करता हूं तो मुझे सभी प्रक्रियाओं के लिए शून्य मान मिलता है। इसके अलावा, भले ही मुझे कोई मूल्य प्राप्त हो, मुझे यकीन नहीं है कि 'सीपीयू टाइम की टिक' बिल्कुल ठीक है जो मैं ढूंढ रहा हूं।

struct vmspace *p_vmspace; /* Address space. */ 
struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */ 
int p_flag;   /* P_* flags. */ 
char p_stat;   /* S* process status. */ 
pid_t p_pid;   /* Process identifier. */ 
pid_t p_oppid;  /* Save parent pid during ptrace. XXX */ 
int p_dupfd;  /* Sideways return value from fdopen. XXX */ 
/* Mach related */ 
caddr_t user_stack; /* where user stack was allocated */ 
void *exit_thread; /* XXX Which thread is exiting? */ 
int  p_debugger;  /* allow to debug */ 
boolean_t sigwait; /* indication to suspend */ 
/* scheduling */ 
u_int p_estcpu; /* Time averaged value of p_cpticks. */ 
int p_cpticks; /* Ticks of cpu time. */ 
fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */ 
void *p_wchan; /* Sleep address. */ 
char *p_wmesg; /* Reason for sleep. */ 
u_int p_swtime; /* Time swapped in or out. */ 
u_int p_slptime; /* Time since last blocked. */ 
struct itimerval p_realtimer; /* Alarm timer. */ 
struct timeval p_rtime; /* Real time. */ 
u_quad_t p_uticks;  /* Statclock hits in user mode. */ 
u_quad_t p_sticks;  /* Statclock hits in system mode. */ 
u_quad_t p_iticks;  /* Statclock hits processing intr. */ 
int p_traceflag;  /* Kernel trace points. */ 
struct vnode *p_tracep; /* Trace to vnode. */ 
int p_siglist;  /* DEPRECATED */ 
struct vnode *p_textvp; /* Vnode of executable. */ 
int p_holdcnt;  /* If non-zero, don't swap. */ 
sigset_t p_sigmask; /* DEPRECATED. */ 
sigset_t p_sigignore; /* Signals being ignored. */ 
sigset_t p_sigcatch; /* Signals being caught by user. */ 
u_char p_priority; /* Process priority. */ 
u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ 
char p_nice;  /* Process "nice" value. */ 
char p_comm[MAXCOMLEN+1]; 
struct pgrp *p_pgrp; /* Pointer to process group. */ 
struct user *p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */ 
u_short p_xstat; /* Exit status for wait; also stop signal. */ 
u_short p_acflag; /* Accounting flags. */ 
struct rusage *p_ru; /* Exit information. XXX */ 

वास्तव में मैं भी मुद्रित करने के लिए समय p_cpticks और कुछ अन्य लोगों का मूल्य औसतन और कभी दिलचस्प मूल्यों मिला कोशिश की है। यहाँ मेरी कोड है जो जानकारी फिर से प्राप्त प्रिंट कर रहा है है (मैं इसे cocoabuilder.com से मिल गया):

- (NSDictionary *) getProcessList { 
    NSMutableDictionary *ProcList = [[NSMutableDictionary alloc] init]; 

    kinfo_proc *mylist; 
    size_t mycount = 0; 
    mylist = (kinfo_proc *)malloc(sizeof(kinfo_proc)); 
    GetBSDProcessList(&mylist, &mycount); 
    printf("There are %d processes.\n", (int)mycount); 

NSLog(@" = = = = = = = = = = = = = = ="); 
    int k; 
    for(k = 0; k < mycount; k++) { 
     kinfo_proc *proc = NULL; 
     proc = &mylist[k]; 
     // NSString *processName = [NSString stringWithFormat: @"%s",proc->kp_proc.p_comm]; 
     //[ ProcList setObject: processName forKey: processName ]; 
     // [ ProcList setObject: proc->kp_proc.p_pid forKey: processName]; 
      // printf("ID: %d - NAME: %s\n", proc->kp_proc.p_pid, proc->kp_proc.p_comm); 
      printf("ID: %d - NAME: %s CPU TIME: %d  \n", proc->kp_proc.p_pid, proc->kp_proc.p_comm, proc->kp_proc.p_pid); 
     // Right click on p_comm and select 'jump to definition' to find other values. 
    } 


    free(mylist); 

    return [ProcList autorelease]; 
} 

धन्यवाद!

संपादित करें: मैंने अभी इस प्रश्न के लिए एक उपहार दिया है। जो मैं विशेष रूप से खोज रहा हूं वह यह है कि प्रत्येक प्रक्रिया सीपीयू में कितनी बार खर्च करती है।

यदि इसके अलावा, आप एक प्रक्रिया द्वारा% CPU का उपयोग कर सकते हैं, यह शानदार होगा।

कोड इष्टतम होना चाहिए कि इसे हर सेकेंड कहा जाएगा और विधि सभी चल रही प्रक्रियाओं पर कॉल की जाएगी। उद्देश्य-सी बेहतर।

फिर से धन्यवाद!

संपादित 2

इसके अलावा, जैसा कि लोगों को इस प्रश्न की अनदेखी कर रहे हैं भी मददगार :)

+1

मुझे नहीं लगता कि लोग आपके प्रश्न को अनदेखा कर रहे हैं। यह सिर्फ मैक के लिए निम्न-स्तरीय ओएस प्रोग्रामिंग एक बहुत ही विशिष्ट विषय है। वास्तविक समय को मापना सीपीयू में एक प्रक्रिया खर्च करता है, यह भी एक बहस विषय है। – kazanaki

+0

प्रतिक्रिया के लिए धन्यवाद। थोड़ी देर के लिए मुझे लगा कि मैं साइबर स्पेस में खो गया था। उम्मीद है कि हम जल्द ही कुछ जवाब प्राप्त कर पाएंगे। –

+0

यह आपकी मदद नहीं करेगा, लेकिन ऐसा लगता है कि उपर्युक्त कोड में आप दो बार छपाई कर रहे हैं – rano

उत्तर

3

libtop.c के लिए डार्विन स्रोत पर एक नज़र और विशेष रूप से libtop_pinfo_update_cpu_usage है किया जाएगा करने के लिए कोई टिप्पणी() फ़ंक्शन । ध्यान दें कि:

  1. आप मच प्रोग्रामिंग बुनियादी बातों की बुनियादी समझ होनी चाहिए इस कोड को समझने के लिए करेंगे के रूप में यह काम बंदरगाहों का उपयोग करता है, आदि
  2. आप बस libtop का उपयोग करना चाहते हैं, तो आप होगा स्रोत डाउनलोड करने और इसे स्वयं संकलित करने के लिए।
  3. आपकी प्रक्रिया को अन्य प्रक्रियाओं के लिए कार्य बंदरगाहों पर पहुंचने के लिए विशेषाधिकारों की आवश्यकता होगी। बस एक शीर्ष प्रक्रिया अंडे और इसके मानक उत्पादन पार्स:

यह सब नहीं बल्कि कठिन लगता है, ठीक है ... वहाँ एक तरह से कम गूढ़ API का उपयोग करता है। के लिए आँकड़े लॉग रूप में stdout को

$ top -s 1 -l 3600 -stats pid,cpu,time 

कि एक बार प्रति सेकंड 3600 सेकंड (एक घंटा) के लिए है, सैंपल, और उत्पादन: शीर्ष (1) आदमी पृष्ठ पर एक त्वरित झलक इस छोटे से मणि कर दिया पिड, सीपीयू उपयोग, और समय।

बच्चे की शीर्ष प्रक्रिया को स्पॉन्गिंग और प्रबंधित करना और फिर इसके आउटपुट को पार्स करना सभी सरल यूनिक्स प्रोग्रामिंग अभ्यास हैं।

+0

क्या इसे कार्यान्वित करने के तरीके को देखने के लिए नमूना कोड प्राप्त करने का कोई तरीका है? मैं इस विधि के माध्यम से गुजरने के लिए वास्तव में स्पष्ट नहीं हूं :( –

+0

मैंने कुछ जवाब देने के लिए अपना उत्तर संपादित किया है। :-) बाल प्रक्रिया को प्रबंधित करने के लिए एनएसटीस्क का उपयोग करने पर बहुत सारी ट्यूटोरियल सामग्री है ... मैं अनुशंसा करता हूं कि, और एनएसएसकेनर शीर्ष के आउटपुट को पार्स करने के लिए। –

+0

बहुत बहुत धन्यवाद! हम निश्चित रूप से कुछ ऐसा करने के करीब आ रहे हैं जो मैं कर सकता हूं। बहुत बढ़िया! :) –

1

क्या आपने संरचना rusage पर एक नज़र डाली है?आपने इसे सूचीबद्ध किया है और "बाहर निकलें जानकारी" के रूप में टिप्पणी की है, लेकिन मुझे पता है कि इसमें संसाधनों द्वारा उपयोग किए जाने वाले संसाधन वास्तव में शामिल हैं। this page पर एक नज़र डालें। मुझे याद है कि मैंने अपनी वर्तमान प्रक्रिया के लिए अपनी वैज्ञानिक गणना में उपयोग किए गए CPU समय की सटीक मात्रा की गणना करने के लिए getrusage() का उपयोग किया है, इसलिए आपको केवल यह पता होना चाहिए कि प्रत्येक प्रक्रिया के लिए उस संरचना को कैसे क्वेरी करें, मुझे लगता है कि

+1

गेट्रेजेज() केवल कॉलिंग प्रक्रिया और उसके बच्चों के लिए काम करता है। –

+0

मुझे पता है, मैंने इसे ऊपर बताया है, लेकिन मेरा मानना ​​है कि अन्य प्रक्रियाओं को – rano

+0

@rano में पूछने का एक तरीका है। यह व्यवहार्य लगता है और मैं अभी इसके साथ खेल रहा हूं। हालांकि कुछ नमूना कोड शानदार होंगे;) –

संबंधित मुद्दे