标签: virtual-memory

Haskell中的引用透明度和mmap

我希望一起使用System.INotifySystem.IO.MMap来监视文件修改,然后快速执行差异以通过网络发送补丁.但是,在System.IO.MMap的文档中,有一些关于引用透明性的警告:

文件说明

如果您知道自己是唯一的用户,那么mmap文件是安全的.否则参考透明度可能会或可能不会受到影响.遗憾的是,语义在操作系统之间存在很大差异.

MMap返回的值,IO ByteString当我使用这个值时,putStr我每次都期望得到不同的结果吗?我假设作者意味着值可能会在IO操作期间发生变化,例如putStr崩溃?

编辑开始:想想看,我想这个问题的答案有点明显......如果在取消装箱后任何时候价值发生变化都会有问题.

do 
  v <- mappedValue :: IO ByteString
  putStr v
  putStr v  -- Expects the same value of v everywhere
Run Code Online (Sandbox Code Playgroud)

END-OF-EDIT

难道不可能在映射区域或文件上获得某种锁定吗?

或者,是否可以编写一个copy :: IO ByteString -> IO ByteString以安全的方式获取当前状态文件快照的函数?

io file-io haskell mmap virtual-memory

10
推荐指数
1
解决办法
908
查看次数

没有页面文件的Windows XP内存管理 - 后果是什么.堆碎片?

我一直在研究一个在Windows XP嵌入式系统上的应用程序中看到的相当难以捉摸的错误.

我们已经将错误缩小到指向应该指向内存块的指针,而是指向NULL.由于内存被分配了一个未经检查的malloc(..)调用,我的直觉说malloc失败并返回NULL(虽然我们现在正在寻找其他可能性,例如竞争条件可能会无意中改变指针).这是一个本机C++应用程序.崩溃对于追踪这个原因有点复杂,主要是因为我们只有事后的崩溃转储和故障表现在我们没有源的第三方库中,在另一个线程上.娱乐时间 :)

我的问题集中在记忆耗尽的可能性上.重要的是我们运行的XP Embedded系统的'pagefile被禁用了.

所以,我有三个问题; 如果有人能为我澄清这些,那就太好了:

  • 主要是,没有分页文件会有什么影响?这是否意味着当堆增长时,操作系统需要立即找到并分配新内存,即使这些空闲块未立即使用?我已经看到了一些关于它的轶事提及,但是找不到任何具体关于禁用页面文件的效果的具体内容.

  • 为什么Microsoft决定在Windows Vista之前默认启用低碎片堆?在Windows XP上为您的进程启用LFH是否存在危险?

  • WinDbg在"外部碎片"和"虚拟地址碎片"之间有什么区别?

WinDbg报告受影响的堆上的堆统计信息,如下所示:

Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast
                  (k)     (k)    (k)     (k) length      blocks cont. heap
04770000 00001002 1621948  94844 1608284  102    6  8068    6      2   L 

  Virtual address fragmentation  94 % (8068 uncommited ranges)
Run Code Online (Sandbox Code Playgroud)

c++ heap winapi virtual-memory

10
推荐指数
1
解决办法
278
查看次数

堆的边界是什么?

给定进程中堆的边界是什么?我理解这个问题可能没有简单的答案,所以我特别感兴趣的是以下答案:

  • 在AMD64上Linux下是否有64位进程的标准堆大小/位置?
  • 如果我正在实现一个语言运行库,我怎样才能找到我不允许放入堆的地方(同样,Linux/AMD64)
  • 应用程序是否有可移植的方式来查找它的开始/结束位置?

linux memory 64-bit heap-memory virtual-memory

10
推荐指数
2
解决办法
2078
查看次数

如何在Linux 64位机器上找出数据结构实现的内存布局

在本文中,http://cacm.acm.org/magazines/2010/7/95061-youre-doing-it-wrong/fulltext

作者讨论了2个数据结构的内存布局 - 二进制堆和B堆,并比较了一个比另一个更好的内存布局(图5和图6).

我想亲身体验一下这个.我有一个N-Ary树的实现,我想找出我的数据结构的内存布局.提出像文章中那样的内存布局的最佳方法是什么?

其次,我认为如果它是基于数组的实现,则更容易识别内存布局.如果Tree的实现使用指针,那么我们有什么工具或者需要什么样的方法来映射它的内存布局?

linux ram virtual-memory linux-kernel data-structures

10
推荐指数
1
解决办法
540
查看次数

在OS X 10.5/10.6中检索自己进程的内存映射

在Linux中,查看进程内存映射的最简单方法是查看/proc/PID/maps,给出如下内容:

08048000-08056000 r-xp 00000000 03:0c 64593      /usr/sbin/gpm
08056000-08058000 rw-p 0000d000 03:0c 64593      /usr/sbin/gpm
08058000-0805b000 rwxp 00000000 00:00 0
40000000-40013000 r-xp 00000000 03:0c 4165       /lib/ld-2.2.4.so
40013000-40015000 rw-p 00012000 03:0c 4165       /lib/ld-2.2.4.so
4001f000-40135000 r-xp 00000000 03:0c 45494      /lib/libc-2.2.4.so
40135000-4013e000 rw-p 00115000 03:0c 45494      /lib/libc-2.2.4.so
4013e000-40142000 rw-p 00000000 00:00 0
bffff000-c0000000 rwxp 00000000 00:00 0

如何在OSX 10.5或10.6下获取有关进程自身内存映射的等效信息(地址范围,保护,映射文件名等等)?

macos virtual-memory memory-mapping

9
推荐指数
1
解决办法
6728
查看次数

Linux 3/1虚拟地址拆分

在了解highmem需要超过1GB的RAM时,我遗漏了一些东西.有人能指出我哪里出错吗?谢谢!

我知道的:

  • 为内核操作保留1 GB进程的虚拟内存(高内存区域).用户空间可以使用剩余的3 GB.这是3/1分裂.

  • VM的虚拟内存功能将(连续)虚拟内存页面映射到物理页面(RAM).

我不知道的是:

  • 什么操作使用内核虚拟内存?我想像内核空间中的kmalloc(...)这样的东西会使用内核虚拟内存.

  • 我认为在这个方案下可以使用4GB的RAM.我不明白为什么内核1 GB虚拟空间是解决物理空间时的限制因素.这是我理解失败的地方.请指教.

我一直在读这篇文章(http://kerneltrap.org/node/2450),这很棒.但它并不能完全解决我的问题.

linux virtual-memory linux-kernel

9
推荐指数
2
解决办法
7424
查看次数

虚拟机

我一直试图弄清楚VMware是如何工作的(特别是安装Linux时),我有几个问题:

  1. VMware遇到类似命令时会发生什么push cs?特别是cs,因为它的权限级别为0,VMware运行在1个权限级别,所以我假设它不得不将其转换为其他命令.

  2. 虚拟内存:它如何在虚拟机上运行?有2级翻译 - 进程虚拟内存 - >虚拟机物理内存 - >真机物理内存?当真实机器交换页面时,如何通知VMware?

virtualization vmware virtual-memory

9
推荐指数
1
解决办法
614
查看次数

Linux,会在首次读取或首次写入时将页面页面故障归零吗?

我的问题是Linux特定的,需要了解内核,虚拟内存,mmap,pagefaults.我有大型静态数组的C程序,它将进入bss部分(内存,初始化为零).程序启动时,此内存不是物理分配的,只有虚拟内存,虚拟内存的每一页都映射到特殊的零页面(全零的页面).当应用程序访问此页面时,将生成页面故障并分配物理页面.

问题是:是否会在第一次读取访问时或从bss部分对页面进行第一次写访问时生成此类页面错误?

linux virtual-memory linux-kernel page-fault

9
推荐指数
1
解决办法
1305
查看次数

fork()失败并出现内存不足错误

父进程在尝试分叉子进程时失败,并且errno = 12(内存不足).父进程在Linux 3.0内核上运行 - SLES 11.在分叉子进程时,父进程已经占用了大约70%的RAM(180GB/256GB).这个问题有解决方法吗?

该应用程序是用C++编写的,用g ++ 4.6.3编译.

linux fork virtual-memory memory-overcommitment

9
推荐指数
2
解决办法
1万
查看次数

如何使Visual Studio保持4GB虚拟地址空间

Visual Studio devenv.exe进程是32位(即使在64位操作系统上运行),因此它不能使用超过4GB的虚拟内存.

不幸的是,当我使用Visual Studio调试我的C++应用程序时,由于这个4GB的限制,我经常会耗尽内存.例如,使用VMMap,下面显示了在几个小时内导致崩溃的典型Visual Studio使用情况的进展情况.

如何让Visual Studio使用更少的内存,以免浪费时间崩溃?

Visual Studio是否通常使用超过3.5 GB的虚拟地址空间?

我使用的是Visual Studio 2012,但我认为这个问题跨越了不同的VS版本,因为Visual Studio 2015仍然没有64位版本.

(请注意,VMMap将"Free"报告为地址空间中的剩余内存,32位进程最多为4GB,Windows上为64位进程则为8TB.)

在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述


我已经尝试过的事情:

  • 从安全模式开始
  • 删除所有插件和扩展,以便在工具>加载项管理器或工具>扩展中不显示任何内容(https://github.com/tsasioglu/Total-Uninstaller对此有帮助)
  • 删除我的.suo/.sdf文件
  • 删除我的AppData/*/Microsoft/VisualStudio文件夹
  • 使用漏斗并过滤除3个项目之外的所有项目
  • 删除了所有"符号文件(.pdb)位置"选项并选择"自动加载符号:""仅指定模块"
  • 选择"启用我的代码"进行调试
  • 禁用智能感知(工具 - >选项 - >文本编辑器 - > C/C++ - >高级 - >禁用智能感知)

c++ virtual-memory visual-studio

9
推荐指数
1
解决办法
1274
查看次数