百科问答小站 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多线程,实际如果变成进程的话,远远到不了这个数。




  

相关话题

  Linux 的核心思想是什么? 
  为什么很多人不相信鸿蒙系统是真的? 
  操作系统中原子操作和锁的底层原理分别是什么?提供了哪些原子语义保证? 
  如何看待王垠对于内存管理的理解? 
  当页表中的页表项大部分都有效的时候,多级页表还能节省空间吗? 
  为什么 Windows 的 Linux 子系统的文件同步和 Windows 不是实时的? 
  把操作系统编译结果的机器码更改一位,比如将第一位0改成1或者反之,操作系统还能运行吗? 
  为什么 Windows 的 Linux 子系统的文件同步和 Windows 不是实时的? 
  windows为什么不添加图形界面的定时关机功能? 
  内存(DRAM)的连续读写速度和随机读写速度是一样的吗? 

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





© 2024-05-20 - tinynew.org. All Rights Reserved.
© 2024-05-20 - tinynew.org. 保留所有权利