免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zzbwang
打印 上一主题 下一主题

[FreeBSD] FreeBSD 5.4上一个进程不能使用超过2GB的内存? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-13 08:49 |只看该作者
原帖由 gvim 于 2006-3-12 01:03 发表


你说的是访问空间。LZ的问题是虚拟内存的分配。
不管你虚存可访问空间再大,即便是64 bit,数据总只能放在物理内存页和swap里面。


liangyi571说的就是虚拟内存的分配啊,
【The Design and Implementation of the FreeBSD Operating System】
5.2. Overview of the FreeBSD Virtual-Memory System
The virtual address space of most architectures is divided into two parts. For FreeBSD running on 32-bit architectures, the top 1 Gbyte of the address space is reserved for use by the kernel. Systems with many small processes making heavy use of kernel facilities such as networking can be configured to use the top 2 Gbyte for the kernel. The remaining address space is available for use by processes.

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
12 [报告]
发表于 2006-03-13 10:41 |只看该作者
你说的是虚拟地址的布局 和分配还是有些许区别地。

5.6. Creation of a New Process
Reserving Kernel Resources

The first resource to be reserved when an address space is duplicated is the required virtual address space. To avoid running out of memory resources(为什么需要限定), the kernel must ensure that it does not promise to provide more virtual memory than it is able to deliver(以可以提供的东西作为限定标准). The total virtual memory that can be provided by the system is limited to the amount of physical memory available for paging plus the amount of swap space that is provided(什么东西是可以提供的). A few pages are held in reserve to stage I/O between the swap area and main memory.

对物理内存限定我可以理解,可是我不是很理解这个地方为什么要对虚拟内存做限定。

论坛徽章:
0
13 [报告]
发表于 2006-03-13 12:58 |只看该作者
原帖由 gvim 于 2006-3-13 10:41 发表
你说的是虚拟地址的布局 和分配还是有些许区别地。

嗯,一个是进程可访问的虚拟地址空间的“范围”,一个是进程可访问的虚拟内存的“大小”。这是两个问题。
原帖由 gvim 于 2006-3-13 10:41 发表
对物理内存限定我可以理解,可是我不是很理解这个地方为什么要对虚拟内存做限定。...

这里不能说是“对物理内存限定”,而应该说是对虚拟地址空间的访问范围进行限定。至于对进程可访问的虚拟内存的大小进行限定的问题,我的理解是这样的:

一个进程对于内存的访问都是通过虚拟内存系统进行的,它的虚拟地址空间中映射的每一个“逻辑页”都要落实到一个“物理页”上,一旦物理页用完,就要从内存里面选择若干active的页交换出去,然后再来满足进程对“物理页”的映射需求。系统需要为这些操作预留一些最低资源,否则,物理页和交换区完全有可能被用完。这时,如果进程再请求物理页,系统既无法直接满足这个需求,也无法通过把现有物理页调整到交换区来满足这个需求,出现死锁。此时,内核就只有向进程发送kill信号了。

另外,初步看了一下,觉得实现上述功能的代码在这个地方:


  1. _______________________________________________________________________________

  2. 426  /*
  3. 427   * Implement fork's actions on an address space.
  4. 428   * Here we arrange for the address space to be copied or referenced,
  5. 429   * allocate a user struct (pcb and kernel stack), then call the
  6. 430   * machine-dependent layer to fill those in and make the new process
  7. 431   * ready to run.  The new process is set up so that it returns directly
  8. 432   * to user mode to avoid stack copying and relocation problems.
  9. 433   */
  10. 434  void
  11. 435  vm_forkproc(td, p2, td2, flags)
  12. 436      struct thread *td;
  13. 437      struct proc *p2;
  14. 438      struct thread *td2;
  15. 439      int flags;
  16. 440  {
  17.           ...
  18. 463      while (vm_page_count_severe()) {
  19. 464          VM_WAIT;
  20. 465      }
  21.           ...
  22. ______________________________________________________/usr/src/sys/vm/vm_glue.c
复制代码

其中,vm_page_count_severe()的定义如下:

  1. _______________________________________________________________________________

  2. 118  /*
  3. 119   * Return TRUE if we are under our severe low-free-pages threshold
  4. 120   *
  5. 121   * This routine is typically used at the user<->system interface to determine
  6. 122   * whether we need to block in order to avoid a low memory deadlock.
  7. 123   */
  8. 124  
  9. 125  static __inline
  10. 126  int
  11. 127  vm_page_count_severe(void)
  12. 128  {
  13. 129      return (cnt.v_free_severe > (cnt.v_free_count + cnt.v_cache_count));
  14. 130  }
  15. _____________________________________________________/usr/src/sys/sys/vmmeter.h
复制代码

[ 本帖最后由 雨丝风片 于 2006-3-13 13:14 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2006-03-13 13:11 |只看该作者
原帖由 雨丝风片 于 2006-3-13 12:58 发表


人家什么时候说过要限制“物理内存”了?

之所以要限定虚拟内存,我的理解是这样的:

一个进程对于内存的访问都是通过虚拟内存系统进行的,它的虚拟地址空间中映射的每一个“逻辑页”都要落实到一个“ ...


你真牛,真么快就找到根上去了。

论坛徽章:
0
15 [报告]
发表于 2006-03-13 13:26 |只看该作者
原帖由 liangyi571 于 2006-3-13 13:11 发表
你真牛,真么快就找到根上去了。


原来自己看书,有些地方总是不求甚解,现在有人提出来了,大家一起讨论,也是一种不错的学习方式!
我这也是按图索骥,观点还不成熟,也不保证正确,期待着各位的批斗,呵呵!

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
16 [报告]
发表于 2006-03-13 13:27 |只看该作者
原帖由 雨丝风片 于 2006-3-13 12:58 发表

嗯,一个是进程可访问的虚拟地址空间的“范围”,一个是进程可访问的虚拟内存的“大小”。这是两个问题。

这里不能说是“对物理内存限定”,而应该说是对虚拟地址空间的访问范围进行限定。至于对进程可访问的 ...


呵呵,大哥没有理解到我的疑虑。
我的意思是说,我不理解为什么文章中用词是"virtual address space"而不是"physical address space"。因为按照文章的观点,和你贴出来的代码,可以看出,实际的需求是转换成的物理内存空间的大小+swap大小。疑问是这里怎么要说成"虚拟地址空间"?

论坛徽章:
0
17 [报告]
发表于 2006-03-13 13:39 |只看该作者
原帖由 gvim 于 2006-3-13 13:27 发表
呵呵,大哥没有理解到我的疑虑。
我的意思是说,我不理解为什么文章中用词是"virtual address space"而不是"physical address space"。因为按照文章的观点,和你贴出来的代码,可以看出 ...


我前面已经说过,这里应该没有“物理地址空间”的概念,一切都是虚拟的。

举个例子,你去食堂买馒头,一块钱一个。你的钱包可以装一百张一块钱的钞票,所以理论上你可以买一百个馒头,一张钞票“映射”到一个馒头。但是,食堂师傅只能供应10个馒头,所以,你最多只能买10个馒头,也就是最多只能对你的一百张钞票里面的10张进行“映射”。

所以,这里不存在对物理的“馒头”的限制问题,而只有对你的虚拟的“钞票”进行限制的问题,对于买馒头而言,就是用物理的馒头数去限定你最多只能花多少张钞票;对于进程而言,就是用物理的内存数限定你最多只能有多少个映射。

综上,文中用词是"virtual address space",而非"physical address space"。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
18 [报告]
发表于 2006-03-13 13:57 |只看该作者
关键是这个词 "reserved" ,呵呵。我给考虑掉了。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
19 [报告]
发表于 2006-03-13 14:10 |只看该作者
原帖由 雨丝风片 于 2006-3-13 13:39 发表


我前面已经说过,这里应该没有“物理地址空间”的概念,一切都是虚拟的。

举个例子,你去食堂买馒头,一块钱一个。你的钱包可以装一百张一块钱的钞票,所以理论上你可以买一百个馒头,一张钞票“映射”到 ...


清楚多了

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
20 [报告]
发表于 2006-03-13 14:35 |只看该作者
原帖由 gvim 于 2006-3-13 14:10 发表


清楚多了

似懂非懂.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP