【问题标题】:Create a program to calculate the maximum number of processes in the system [closed]创建一个程序来计算系统中的最大进程数[关闭]
【发布时间】:2017-05-10 04:27:41
【问题描述】:

我有以下代码,我正在尝试计算所有过程。我不明白如何计算最大进程数。

#include <stdio.h>
#include <stdlib.h>

int main() 
{
   int pid, pidmax = 0;
   while(1) 
   {
       pid = fork();
       pidmax = getpid();
       if(pid == 0){
           if(pidmax < getpid())
               pidmax = getpid();
           printf("pid: %d, max: %d\n", getpid(), pidmax);  
           return 0;
       }

       if(pid == -1) {
        printf("Maximum process: %d\n", pidmax);
        exit(-1);
       }
    }
    return 0;
}

【问题讨论】:

  • 你可以通过使用计数器来实现,在有叉子的时候增加计数器。
  • 它有效,但需要仅通过比较它们的 id 来找到最大数量。

标签: c fork child-process


【解决方案1】:

这可以通过计算/proc 目录中存在的编号目录的数量来实现。这些编号的目录是当前正在运行的进程的 PID。

/proc简称为进程信息伪文件系统。 欲了解更多信息,您可以访问, http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html

我编写了一些小代码,它给出了正在运行的进程数。

#include <stdio.h>
#include <dirent.h>

int main()
{
        DIR* proc = opendir("/proc");
        struct dirent* ent;
        int count = 0;

        if(proc == NULL) {
                perror("opendir(/proc)");
                return 1;
        }       

        while(ent = readdir(proc)) {
            if(!isdigit(*ent->d_name))
                continue;
            count++; //if directory name is number then increment the count.
        }

        closedir(proc);

        printf("Number of Processes=%d\n",count);
        return 0;
}

【讨论】:

  • 至少为投反对票发表评论..不要只是投反对票...
  • @A. Norvag ...您可以尝试我的解决方案。它会为你工作。如有任何查询,请还原...
  • 我尝试了您的解决方案。但它没有给出我想要的结果。使用此代码它只打开了 3 个进程,即使系统中的最大进程数:32765
  • 请注意,并非所有 Unix 系统都提供procfs。例如,OS X 没有它。相反,您使用sysctl
【解决方案2】:

查看 proc(5) 的文档,您会在 processes 字段中看到这一点:

Number of forks since boot.

所以这根本不是您要查找的号码。 ps 将告诉您,正如您已经知道的那样,在 /proc 下计算名称中只有数字的目录是另一种方法。

ulimit 可能会将每个用户的最大进程数限制为小于最大 pid。

ulimit -u 表示用户在特定时间可以拥有的总进程数。上面的命令将输出返回为 63203。这意味着对于用户在某个时间点创建的所有进程,用户可以运行 63203 个进程。

您将获得给定机器上正在运行的进程的总数

 ps -e | wc -l

【讨论】:

    【解决方案3】:

    有比通过实验更简单的方法来做到这一点。

    大多数 Unix 系统都提供ulimit 来向您展示您帐户的各种软(即用户定义)和硬(即管理员定义)限制。例如,这是我对 OS X 的软硬限制。

    $ ulimit -a -S
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    file size               (blocks, -f) unlimited
    max locked memory       (kbytes, -l) unlimited
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 256
    pipe size            (512 bytes, -p) 1
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 709
    virtual memory          (kbytes, -v) unlimited
    
    $ ulimit -a -H
    core file size          (blocks, -c) unlimited
    data seg size           (kbytes, -d) unlimited
    file size               (blocks, -f) unlimited
    max locked memory       (kbytes, -l) unlimited
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) unlimited
    pipe size            (512 bytes, -p) 1
    stack size              (kbytes, -s) 65532
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 1064
    virtual memory          (kbytes, -v) unlimited
    

    虽然系统可能支持更多进程,但您的程序将受到这些限制。我仅限于 709(奇数)进程,可以将其提高到 1064。

    单个时间的最大进程数受pid_t 的大小限制,并且通常受内核中定义的限制。有关详细信息,请参阅 this answerthis answer

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 2010-09-07
      • 2016-01-12
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      相关资源
      最近更新 更多