内存和操作系统的限制都有(以下仅从x86环境考虑)。手头目前没有代码,不好推算出准确的数值,但肯定不会太多。
先看内存方面的限制:
一个进程至少要包含一个线程,一个线程至少要有一个线程栈,一个栈至少是一个page(4K),并且实际要更大一些。如果是自己写的线程还好,如果用系统的API,至少还需要一个堆空间,也是4K起步。
但这还没完,为了管理进程(题主问的是进程),那么需要给进程维护一个页表,32位下至少需要2个page来维护页表信息,如果开启了PAE,还要再多一级。
同时,在内核里还要维护进程和线程的相关信息,这些东西恐怕至少也是1个page起步的。
所以按照1 page(栈)+1 page(堆)+2 page(页表)+1 page(管理内存)来计算,32位环境下4G内存最大也不过209715个进程。
这还是理想情况。
实际会少的更多,比如:内核要占据很大空间;MMIO要占很大空间,尤其是PCIE上多挂几个设备,实际可利用物理地址空间可能只有2-3G左右。
这样算下来,可能连10万个进程都不到。
另外一个问题是,这些进程是否是同一个可执行文件?如果不是,那就意味着text段也是不重复的,每个text段也是4K起步。
再说操作系统层面上:
先说Windows:
如果开启PAE的话,Windows并不会允许更多的物理内存,每个进程还额外需要一级页表,实际可用的进程数会更少。
同时,Windows的调度器是否允许10万数量级的进程同时工作还是一个未知数,至少如果10万的进程同时运行,调度器的负载会非常大。而且印象里,Windows的PID并不是一个完整的32位数,好像是2^16-2^24范围的一个数值。
实际上Windows里一个线程(不是进程)的典型线程栈大小是1M,所以32位Windows上同时运行4096个线程时,内存就已经不够了。而考虑到实际情况的话,这个值只会更小,估计不到这个的一半。
再说Linux:
Linux开启PAE,就会有更多的物理内存可以用了,理论上能到64G,Linux的线程栈大小也更小一些,所以会比Windows支持的进程数更多一些。不开PAE估计上十万是有可能的,开PAE的话题主自己可以自己算。
Linux的PID是一个指针,所以范围会更大,但同样的,进程一旦多来,任务调度负担会很重。
结论:
理论上,32位系统开几十万个进程是可能的,实际上大概超过1000个性能就很不好了。
------------------------
评论中有人提到在32位环境下实验得到的结论是2000-3000多个线程,但这里需要区分线程和进程的不同,线程共用一个页表,不同进程的页表是不一样的,如果按照默认的Windows线程配置,一个1M的线程栈,即使只commit一个page,其余的将近1M的页面也要在页表上记录的,只不过是没commit,这就需要256项页表,再加上1M的堆以及其它杂七杂八的东西,PAE模式下一个page的页表已经放不下了,表面上看能创建2000多线程,实际如果变成进程的话,远远到不了这个数。