开发手册 欢迎您!
软件开发者资料库

流程资源

过程间通信过程资源 - 从基本概念到高级概念,从简单和简单的步骤学习过程间通信,包括概述,过程信息,过程映像,过程创建和终止,子过程监控,过程组,会话和作业控制,过程资源,其他进程,覆盖进程映像,相关系统调用(系统V),系统V和Posix,管道,命名管道,共享内存,消息队列,信号量,信号,内存映射。

该过程需要某些资源(如CPU和内存)来执行任务.现在我们将查看相关的命令和系统调用,以了解有关资源利用率和监视的信息.默认情况下,对资源上的每个进程都有一定的限制,如果需要,可以增强限制以适应应用程序要求.

以下是使用命令的基本系统或进程资源信息 :

顶部命令

  $ top

top命令不断显示系统资源的使用情况.如果任何进程将系统置于某种挂起状态(消耗更多的CPU或内存),则可以记录进程信息并采取适当的操作(例如终止相关进程).

ps命令

  $ ps

ps命令提供有关所有正在运行的进程的信息这有助于监视和控制进程.

vmstat命令

  $ vmstat

vmstat命令报告虚拟内存子系统的统计信息.它报告进程的信息(等待运行,休眠,可运行的进程等),内存(虚拟内存信息,如空闲,使用等),交换区域,IO设备,系统信息(中断数,上下文切换) )和CPU(用户,系统和空闲时间).

lsof命令

  $ lsof

lsof命令打印所有当前正在运行的进程的打开文件列表,包括系统进程.

getconf命令

  $ getconf -a

getconf命令显示系统配置变量信息.

现在,让我们来看看相关的系统调用.

  • 系统调用getrusage(),它提供有关系统资源使用情况的信息.

  • 与访问和设置资源限制相关的系统调用,即getrlimit( ),setrlimit(),prlimit().

系统资源使用调用

  #include< sys/time.h>  #include< sys/resource.h>  int getrusage(int who,struct rusage * usage);

系统调用getrusage()返回有关系统资源使用情况的信息.这可以包括关于self,children或调用线程的信息,使用标志RUSAGE_SELF,RUSAGE_CHILDREN,RUSAGE_THREAD作为"who"变量.在调用之后,它返回结构rusage中的信息.

此调用在成功时返回"0",在失败时返回"-1".

<请看下面的示例程序.

/*文件名:sysinfo_getrusage.c */

#include#include#includevoid main(void) {   struct rusage res_usage;   int retval;   retval = getrusage(RUSAGE_SELF, &res_usage);   if (retval == -1) {      perror("getrusage error");      return;   }   printf("Details of getrusage:\n");   printf("User CPU time (seconds) is %d\n", (int)res_usage.ru_utime.tv_sec);   printf("User CPU time (micro seconds) is %d\n", (int)res_usage.ru_utime.tv_usec);   printf("Maximum size of resident set (kb) is %ld\n", res_usage.ru_maxrss);   printf("Soft page faults (I/O not required) is %ld\n", res_usage.ru_minflt);   printf("Hard page faults (I/O not required) is %ld\n", res_usage.ru_majflt);   printf("Block input operations via file system is %ld\n", res_usage.ru_inblock);   printf("Block output operations via file system is %ld\n", res_usage.ru_oublock);   printf("Voluntary context switches are %ld\n", res_usage.ru_nvcsw);   printf("Involuntary context switches are %ld\n", res_usage.ru_nivcsw);   return;}

编制和执行步骤

Details of getrusage:User CPU time (seconds) is 0User CPU time (micro seconds) is 0Maximum size of resident set (kb) is 364Soft page faults (I/O not required) is 137Hard page faults (I/O not required) is 0Block input operations via file system is 0Block output operations via file system is 0Voluntary context switches are 0Involuntary context switches are 1

现在让我们看一下与访问和设置资源限制相关的系统调用./p>

  #include< sys/time.h>  #include< sys/resource.h>  int getrlimit(int resource,struct rlimit * rlim);  int setrlimit(int resource,const struct rlimit * rlim);  int prlimit(pid_t pid,int resource,const struct rlimit * new_limit,struct rlimit * old_limit);

通过输入RLIMIT_NOFILE,RLIMIT_NPROC, RLIMIT_STACK等

系统调用 setrlimit()设置rlimit结构中提到的资源限制,直到限制范围内.

系统调用 prlimit()用于varius目的,例如用于检索当前资源限制或用于将资源限制更新为新值.

结构rlimit包含两个值 :

  • 软限制 : 当前限额

  • 硬限制 : 可以延长的最大限额.

RLIMIT_NOFILE

: 返回此进程可以打开的最大文件描述符数.例如,如果它返回1024,则该过程具有0到1023之间的文件描述符.

RLIMIT_NPROC : 可为该流程的用户创建的最大进程数.

RLIMIT_STACK : 该进程的堆栈段的最大字节数.

所有这些调用在成功时返回"0",在失败时返回"-1".

让我们考虑以下使用getrlimit()系统调用的示例.

/*文件名:sysinfo_getrlimit.c */

#include#include#includevoid main(void) {   struct rlimit res_limit;   int retval;   int resources[] = {RLIMIT_NOFILE, RLIMIT_NPROC, RLIMIT_STACK};   int max_res;   int counter = 0;   printf("Details of resource limits for NOFILE, NPROC, STACK are as follows: \n");   max_res = sizeof(resources)/sizeof(int);   while (counter < max_res) {      retval = getrlimit(resources[counter], &res_limit);      if (retval == -1) {         perror("getrlimit error");         return;      }      printf("Soft Limit is %ld\n", res_limit.rlim_cur);      printf("Hard Limit (ceiling) is %ld\n", res_limit.rlim_max);      counter++;   }   return;}

编制和执行步骤

Details of resource limits for NOFILE, NPROC, STACK are as follows: Soft Limit is 516Hard Limit (ceiling) is 516Soft Limit is 256Hard Limit (ceiling) is 256Soft Limit is 33554432Hard Limit (ceiling) is 33554432

让我们考虑使用getrlimit()系统调用的另一个例子,但现在使用prlimit()系统调用.

/*文件名:sysinfo_prlimit.c */

#include#include#include#includevoid main(void) {   struct rlimit res_limit;   int retval;   int resources[] = {RLIMIT_NOFILE, RLIMIT_NPROC, RLIMIT_STACK};   int max_res;   int counter = 0;   printf("Details of resource limits for NOFILE, NPROC, STACK using prlimit are as follows: \n");   max_res = sizeof(resources)/sizeof(int);   while (counter < max_res) {      retval = prlimit(getpid(), resources[counter], NULL, &res_limit);      if (retval == -1) {         perror("prlimit error");         return;      }      printf("Soft Limit is %ld\n", res_limit.rlim_cur);      printf("Hard Limit (ceiling) is %ld\n", res_limit.rlim_max);      counter++;   }   return;}

编制和执行步骤

Details of resource limits for NOFILE, NPROC, STACK using prlimit are as follows: Soft Limit is 516Hard Limit (ceiling) is 516Soft Limit is 256Hard Limit (ceiling) is 256Soft Limit is 33554432Hard Limit (ceiling) is 33554432