百科问答小站 logo
百科问答小站 font logo



32位操作系统最多同时运行多少个程序? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

内存和操作系统的限制都有(以下仅从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多线程,实际如果变成进程的话,远远到不了这个数。




  

相关话题

  Windows 10 有哪些忍不了的设计? 
  Windows 10 有哪些忍不了的设计? 
  windows系统为什么不预留一点资源(cpu和内存占用),在执行繁重任务时以保证系统本身的流畅运行? 
  学编程什么的需要专业版Windows吗? 
  如何看待 2020 年 1 月 15 日国产统一操作系统 UOS 20 正式版发布?它能普及开来吗? 
  如何不依赖任何外界现成软件和其他计算机设备运行没安装操作系统的电脑? 
  为什么操作系统不能屏蔽底层的架构(arm,x86,mips),为应用软件提供一个统一的运行环境呢? 
  win10初装系统时怎么分区? 
  操作系统里面经常说的一个功能用「软件实现」还是用「硬件实现」,其本质区别是什么? 
  页表放在主存中,那么页表基址寄存器中存放的页表基址是虚拟基址还是主存中页表实际基址? 

前一个讨论
路由跟踪为什么会有两个局域网?
下一个讨论
C语言现在还有必要学吗?未来C还有用吗?





© 2025-03-07 - tinynew.org. All Rights Reserved.
© 2025-03-07 - tinynew.org. 保留所有权利