Unix编程/应用问答中文版---4.系统资源相关问题

本文介绍在主流Unix操作系统如Solaris中,如何通过编程方式获取进程的内存和CPU使用情况,并提供了具体的实现示例代码。此外,还介绍了如何获取CPU速率及系统当前内存大小的方法。
Unix编程/应用问答中文版---4.系统资源相关问题
  • 12/31
  • 2008
编程技术 | LINUX3660 次查看
本文出自:http://www.nsfocus.com 维护:小四

  4. 系统资源相关问题

  4.1 主流Unix操作系统上如何编程获取进程的内存、CPU利用状况

  4.2 Solaris下如何获知CPU速率

  4.3 如何编程获取Solaris系统当前内存大小

  --------------------------------------------------------------------------

  4. 系统资源相关问题

  4.1 主流Unix操作系统上如何编程获取进程的内存、CPU利用状况

  Q: Solaris下如何编程获知CPU占用率和内存占用信息呢,可移植吗?

  Q: 我想写个程序遍历当前运行中的活动进程,Solaris提供相应系统调用了吗

  A: Nicholas Dronen

  不可移植。man -s 4 proc,man -s 3k kstat

  如果不是编程,可以用top、mpstat、vmstat、sar(1)等等,还有

  /usr/ucb/ps -aux,对于Solaris来说,后者更直接精炼,top不是标准配置。

  # /usr/bin/prstat (Solaris 8 prstat(1M)手册页)

  # /usr/ucb/ps -aux | head (Solaris 2.x)

  Q: 主流Unix操作系统上如何编程获取进程的内存、CPU利用状况,AIX、HP、SUN

  process memory usage

  process cpu time usage

  A: Nate Eldredge

  man -s 3C getrusage

  D: 小四

  在SPARC/Solaris 2.6/7下结论一致,只支持了ru_utime和ru_stime成员,其他成员

  被设置成0。FreeBSD 4.3-RELEASE上测试,则不只支持ru_utime和ru_stime成员。从

  FreeBSD的getrusage(2)手册页可以看到,这个函数源自4.2 BSD。

  至少对于SPARC/Solaris 2.6/7,getrusage(3C)并无多大意义。

  A: Robert Owen Thomas

  对于Solaris,可以利用procfs接口,下面的例子获取指定进程的内存占用情况

  --------------------------------------------------------------------------

  /*

  * @(#)memlook.c 1.0 10 Nov 1997

  * Robert Owen Thomas robt@cymru.com

  * memlook.c -- A process memory utilization reporting tool.

  *

  * gcc -Wall -O3 -o memlook memlook.c

  */

  #pragma ident "@(#)memlook.c 1.0 10 Nov 1997 Robert Owen Thomas robt@cymru.com"

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  int counter = 10;

  int showUsage ( const char * );

  void getInfo ( int, int );

  int main ( int argc, char * argv[] )

  {

  int fd, pid, timeloop = 0;

  char pidpath[BUFSIZ]; /* /usr/include/stdio.h: #define BUFSIZ 1024 */

  switch ( argc )

  {

  case 2:

  break;

  case 3:

  timeloop = atoi( argv[2] );

  break;

  default:

  showUsage( argv[0] );

  break;

  } /* end of switch */

  pid = atoi( argv[1] );

  sprintf( pidpath, "/proc/%-d", pid ); /* -表示向左靠 */

  /*

  * /proc/1/是目录,但在这种用法中,就是直接打开目录,不是打开文件

  */

  if ( ( fd = open( pidpath, O_RDONLY ) ) < 0 )

  {

  perror( pidpath );

  exit( 1 );

  }

  if ( 0 < timeloop )

  {

  for ( ; ; )

  {

  getInfo( fd, pid );

  sleep( timeloop );

  }

  }

  getInfo( fd, pid );

  close( fd );

  exit( 0 );

  } /* end of main */

  int showUsage ( const char * progname )

  {

  fprintf( stderr, "%s: usage: %s < PID > [time delay]/n", progname, progname

  );

  exit( 3 );

  } /* end of showUsage */

  void getInfo ( int fd, int pid )

  {

  prpsinfo_t prp;

  prstatus_t prs;

  if ( ioctl( fd, PIOCPSINFO, &prp ) < 0 )

  {

  perror( "ioctl" );

  exit( 5 );

  }

  if ( ioctl( fd, PIOCSTATUS, &prs ) < 0 )

  {

  perror( "ioctl" );

  exit( 7 );

  }

  if ( counter > 9 )

  {

  fprintf( stdout, "PID/tIMAGE/t/tRSS/t/tHEAP/t/tSTACK/n" );

  counter = 0;

  }

  fprintf( stdout, "%u/t%-9u/t%-9u/t%-15u/t%-15u/n", pid,

  ( unsigned int )prp.pr_bysize, ( unsigned int )prp.pr_byrssize,

  ( unsigned int )prs.pr_brksize, ( unsigned int )prs.pr_stksize );

  counter++;

  } /* end of getInfo */

  --------------------------------------------------------------------------

  4.2 Solaris下如何获知CPU速率

  A: Philip Brown

  psrinfo -v

  psrinfo | grep on-line | wc -l 简单给出CPU数目

  A: scz

  # /usr/platform/`uname -i`/sbin/prtdiag -v

  # /usr/platform/`uname -m`/sbin/prtdiag -v

  # /usr/bin/netstat -k cpu_info0

  A: Tony Walton

  如果你装了Sun Workshop,还可以尝试fpversion命令

  # /opt/SUNWspro/bin/fpversion

  A SPARC-based CPU is available.

  CPU's clock rate appears to be approximately 266.1 MHz.

  Kernel says CPU's clock rate is 270.0 MHz.

  Kernel says main memory's clock rate is 90.0 MHz.

  Sun-4 floating-point controller version 0 found.

  An UltraSPARC chip is available.

  FPU's frequency appears to be approximately 277.1 MHz.

  Use "-xtarget=ultra2i -xcache=16/32/1:256/64/1" code-generation option.

  Hostid = 0x80BC3CB3.

  #

  4.3 如何编程获取Solaris系统当前内存大小

  Q: 如何编程(或者有什么现成命令)获取Solaris系统当前内存大小?

  A: Nithyanandham

  几个现成命令

  /usr/platform/`uname -m`/sbin/prtdiag -v | grep Memory

  prtconf -v | grep Memory

  如果装了GNU top,也可以直接用top命令看到。

  D: scz

  truss prtconf的输出中有如下内容

  sysconfig(_CONFIG_PAGESIZE) = 8192

  sysconfig(_CONFIG_PHYS_PAGES) = 16384

  Memory size: 128 Megabytes

  # /usr/ccs/bin/nm -nx /dev/ksyms | grep "|sysconfig$"

  10626] |0x0000100ec110|0x0000000001bc|FUNC |GLOB |0 |ABS |sysconfig

  # find /usr/include -type f -name "*.h" | xargs grep -l _CONFIG_PAGESIZE

  /usr/include/sys/sysconfig.h

  # vi -R /usr/include/sys/sysconfig.h

  /*

  * cmd values for _sysconfig system call.

  * WARNING: This is an undocumented system call,

  * therefore future compatibility can not

  * guaranteed.

  */

  #define _CONFIG_PAGESIZE 6 /* system page size */

  #define _CONFIG_PHYS_PAGES 26 /* phys mem installed in pages */

  参看sysconf(3C)手册页。

  _SC_PAGESIZE

  _SC_PAGE_SIZE

  _SC_PHYS_PAGES

  A: Casper Dik

  --------------------------------------------------------------------------

  /*

  * Program to determine the size installed physical memory on Suns.

  *

  * Casper Dik.

  */

  #define MEGABYTE 0x00100000

  #define MAXMEM 0x7ff00000

  #define THEMEM "/dev/mem"

  #include

  #include

  #include

  #include

  int main ( int argc, char * argv[] )

  {

  int fd = open( THEMEM, O_RDONLY );

  char c;

  unsigned long pos, mapstart = 0;

  int totmb = 0;

  if ( fd == -1 )

  {

  perror( THEMEM );

  exit( 1 );

  }

  for ( pos = 0; pos < MAXMEM; pos += MEGABYTE )

  {

  if (lseek( fd, pos, 0 ) == -1 )

  {

  perror( "lseek" );

  exit( 1 );

  }

  if ( read( fd, &c, 1 ) == -1 )

  {

  int size = ( pos - mapstart ) / MEGABYTE;

  if ( size != 0 )

  {

  printf( "found %3d MB starting at 0x%p/n", size, ( void * )mapst

  art );

  totmb += size;

  }

  mapstart = pos + MEGABYTE; /* start of next possible mapping */

  }

  }

  printf( "Total memory size: %d MB/n", totmb );

  exit( 0 );

  }

  --------------------------------------------------------------------------

  由于需要读访问/dev/mem,普通用户用户无法使用该程序。
内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值