加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Redis 内存不足时后台进程无法fork的问题

(2012-05-24 17:21:28)
标签:

杂谈

分类: C/C
修改/etc/sysctl.conf文件中,增加vm.overcommit_memory=1,执行 sysctl vm.overcommit_memory=1使之马上生效。
overcommit_memory 内核参数说明如下:                                                                                                                                                                                                      
overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。                               
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

相关概念

·与创建、删除线性区相关的系统调用

·fork()   创建一个新进程,并为它创建新的地址空间

 

1,内存映射

         内存映射是一种重要的抽象手段。在内核中大量使用,也可以用于用户应用程序。映射方法可以将任意来源的数据传输到进程的虚拟地址空间中。作为映射目标的地址空间区域,可以像普通内存那样用通常的方法访问。但任何修改都会自动传输到原数据源。这样就可以使用相同的函数来处理完全不同的目标对象。例如,文件的内容可以映射到内存中。处理只需读取相应的内存即可访问文件内容,或向内存写入数据来修改文件的内容。内核将保证任何修改都会自动同步到文件中。

         内核在实现设备驱动程序时直接使用了内存映射。外设的输入/输出可以映射到虚拟地址空间的区域中。对相关内存区域的读写会由系统重定向到设备,因而大大简化了驱动程序的实现。

 

问:什么是内存映射?memory mapping

答:是内核的一种抽象手段,它可以将任意来源的数据映射到进程的虚拟地址空间。cpu处理任务时可以像处理普通内存中的数据结构一样,处理完后内核会自动将结果保存回数据源。

 

http://img1.ph.126.net/ovgef-XchoqmxxNCr8Ll8w==/1350516938275112991.jpg内存不足时后台进程无法fork的问题" /> 

         图中所示两个进程的虚拟地址空间,都被内核划分为很多等长的部分。这些部分称之为页。物理内存也划分为同样大小的页。

         这种情况是可能的,因为两个虚拟地址空间中的页(虽然在不同的位置)可以映射到同一物理内存页。由于内核负责将虚拟地址空间映射到物理地址空间,因此可以决定哪些内存区域在进程之间共享,哪些不共享。

         并非虚拟地址空间的所有页都映射到某个页帧。这可能是因为页没有使用,或者是数据尚不需要使用而没有载入内存中。还可能是页已经换出到硬盘,将在需要时再换回内存。

2虚拟内存

摘自《深入理解内核》

一种很有用的抽象,叫虚拟内存(virtual memory)。虚拟内存作为一种逻辑层,处于应用程序的内存请求与硬件内存管理单元(memory management unitMMU)之间。虚拟内存有很多用途和优点:

·若干个进程可以并发低执行。

·应用程序所需内存大于可用物理内存时也可以运行。

·程序只有部分代码装入内存是进程可以执行它。

·允许每个进程访问可用物理内存的子集

·进程可以共享库函数或程序的一个单独内存映像

·程序是可重定位的,也就是说,可以把程序放在物理内存的任何地方。

·程序员可以编写与机器无关的代码,因为他们不必关心有关物理内存的组织结构。

虚拟内存子系统的主要成分是虚拟地址空间(virtual address space)的概念。进程所用的一组内存地址不同于物理内存地址。当进程使用一个虚拟地址时,内核和MMU协同定位其在内存中的实际物理位置。

         现在的cpu包含了能自动把虚拟地址转换成物理地址的硬件电路。为了达到这个目标,把可用ram划分成长度为4kb或者8kb的页框(page frame),并且引入一组页表来指定虚拟地址与物理地址之间的对应关系。这些电路使内存分配变得简单,因为这一块连续的虚拟地址请求可以通过分配一组非连续的物理地址页框而得到满足。

 

3,随机访问存储器(ram)的使用

         所有的cunix操作系统都将ram毫无疑义地划分为两部分,其中若干兆字节专门用于存放内核映像(也就是内核代码和内核静态数据结构)。ram的其余部分通常由虚拟内存系统来处理,并且用在以下三中可能的方面:

·满足内核对缓冲区、描述符及其他动态内核数据结构的请求。

·满足进程对一般内存区的请求及对文件内存映像的请求。

·借助于告诉缓存从磁盘及其他缓冲区设备获得较好的性能。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:Linux Cpu 相关
后一篇:kswapd和pdflush
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有