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




  

相关话题

  几个 G 大的 Windows 操作系统纯代码核心部分有多大? 
  如何看待微软不再给OEM提供32位的Windows? 
  为什么win7,win10很多人用,win8,win8.1却无人问津? 
  一个模块(比如文件系统)在内核中实现(宏内核),跟它在内核外实现(微内核),主要区别是什么? 
  微软宣布推出云操作系统Windows 365 ,对此你有什么期待? 
  Linux为什么不能像鸿蒙一样实现万物互联? 
  如何看待华为终端 2020 年除了手机、平板和电脑外全线搭载鸿蒙系统? 
  写一个操作系统内核有多难?大概的内容、步骤是什么? 
  安卓是否在逐渐走向闭源,为什么我国手机公司却仍不开发自己的系统呢? 
  3·15晚会曝光的手机充电桩是否能盗取iPhone用户的信息甚至操控消费?原理是怎样的? 

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





© 2024-12-18 - tinynew.org. All Rights Reserved.
© 2024-12-18 - tinynew.org. 保留所有权利