⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rf_cpuutil.c

📁 RAIDFrame是个非常好的磁盘阵列RAID仿真工具
💻 C
字号:
/* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. * * Authors: Mark Holland, Jim Zelenka * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. * * Carnegie Mellon requests users of this software to return to * *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU *  School of Computer Science *  Carnegie Mellon University *  Pittsburgh PA 15213-3890 * * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. *//* * rf_cpuutil.c * * track cpu utilization */#ifndef KERNEL#include <errno.h>#endif /* !KERNEL */#include "rf_types.h"#include "rf_general.h"#include "rf_shutdown.h"#include "rf_sys.h"#ifdef __osf__#include <sys/table.h>#endif /* __osf__ */#ifdef AIX#include <nlist.h>#include <sys/sysinfo.h>#endif /* AIX */#ifdef KERNEL#include <sys/dk.h>#else /* KERNEL */extern int table(int id, int index, void *addr, int nel, u_int lel);#endif /* KERNEL */#ifdef __osf__static struct tbl_sysinfo start, stop;#endif /* __osf__ */#ifdef AIXstatic int kmem_fd;static off_t sysinfo_offset;static struct sysinfo sysinfo_start, sysinfo_stop;static struct nlist namelist[] = {  {{"sysinfo"}},  {{""}},};#endif /* AIX */#ifdef AIXstatic void rf_ShutdownCpuMonitor(ignored)  void  *ignored;{  close(kmem_fd);}#endif /* AIX */int rf_ConfigureCpuMonitor(listp)  RF_ShutdownList_t  **listp;{#ifdef AIX  int rc;  rc = knlist(namelist, 1, sizeof(struct nlist));  if (rc) {    RF_ERRORMSG("Could not knlist() to config CPU monitor\n");    return(errno);  }  if (namelist[0].n_value == 0) {    RF_ERRORMSG("Got bogus results from knlist() for CPU monitor\n");    return(EIO);  }  sysinfo_offset = namelist[0].n_value;  kmem_fd = open("/dev/kmem", O_RDONLY);  if (kmem_fd < 0) {    perror("/dev/kmem");    return(errno);  }  rc = rf_ShutdownCreate(listp, rf_ShutdownCpuMonitor, NULL);  if (rc) {    RF_ERRORMSG3("Unable to add to shutdown list file %s line %d rc=%d\n", __FILE__,			__LINE__, rc);    rf_ShutdownCpuMonitor(NULL);    return(rc);  }#endif /* AIX */  return(0);}void rf_start_cpu_monitor(){#ifdef __osf__#ifndef KERNEL  if (table(TBL_SYSINFO, 0, &start, 1, sizeof(start)) != 1) {    printf("Unable to get sysinfo for cpu utilization monitor\n");    perror("start_cpu_monitor");  }#else /* !KERNEL */  /* start.si_user = cp_time[CP_USER];  start.si_nice = cp_time[CP_NICE];  start.si_sys  = cp_time[CP_SYS];  start.si_idle = cp_time[CP_IDLE];  start.wait    = cp_time[CP_WAIT]; */#endif /* !KERNEL */#endif /* __osf__ */#ifdef AIX  off_t off;  int rc;  off = lseek(kmem_fd, sysinfo_offset, SEEK_SET);  RF_ASSERT(off == sysinfo_offset);  rc = read(kmem_fd, &sysinfo_start, sizeof(struct sysinfo));  if (rc != sizeof(struct sysinfo)) {    RF_ERRORMSG2("Starting CPU monitor: rc=%d != %d\n", rc,      sizeof(struct sysinfo));  }#endif /* AIX */}void rf_stop_cpu_monitor(){#ifdef __osf__#ifndef KERNEL  if (table(TBL_SYSINFO, 0, &stop, 1, sizeof(stop)) != 1) {    printf("Unable to get sysinfo for cpu utilization monitor\n");    perror("stop_cpu_monitor");  }#else /* !KERNEL */  /* stop.si_user = cp_time[CP_USER];  stop.si_nice = cp_time[CP_NICE];  stop.si_sys  = cp_time[CP_SYS];  stop.si_idle = cp_time[CP_IDLE];  stop.wait    = cp_time[CP_WAIT]; */#endif /* !KERNEL */#endif /* __osf__ */#ifdef AIX  off_t off;  int rc;  off = lseek(kmem_fd, sysinfo_offset, SEEK_SET);  RF_ASSERT(off == sysinfo_offset);  rc = read(kmem_fd, &sysinfo_stop, sizeof(struct sysinfo));  if (rc != sizeof(struct sysinfo)) {    RF_ERRORMSG2("Stopping CPU monitor: rc=%d != %d\n", rc,      sizeof(struct sysinfo));  }#endif /* AIX */}void rf_print_cpu_util(s)  char  *s;{#ifdef __osf__  long totalticks, idleticks;  idleticks = stop.si_idle - start.si_idle + stop.wait - start.wait;  totalticks = stop.si_user - start.si_user + stop.si_nice - start.si_nice +	       stop.si_sys - start.si_sys + idleticks;  printf("CPU utilization during %s was %d %%\n", s, 100 - 100*idleticks/totalticks);#endif /* __osf__ */#ifdef AIX  long idle;  /* XXX compute a percentage here */  idle = (long)(sysinfo_stop.cpu[CPU_IDLE] - sysinfo_start.cpu[CPU_IDLE]);  printf("%ld idle ticks during %s.\n", idle, s);#endif /* AIX */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -