我希望一起使用System.INotify和System.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以安全的方式获取当前状态文件快照的函数?
我一直在研究一个在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) 给定进程中堆的边界是什么?我理解这个问题可能没有简单的答案,所以我特别感兴趣的是以下答案:
在本文中,http://cacm.acm.org/magazines/2010/7/95061-youre-doing-it-wrong/fulltext
作者讨论了2个数据结构的内存布局 - 二进制堆和B堆,并比较了一个比另一个更好的内存布局(图5和图6).
我想亲身体验一下这个.我有一个N-Ary树的实现,我想找出我的数据结构的内存布局.提出像文章中那样的内存布局的最佳方法是什么?
其次,我认为如果它是基于数组的实现,则更容易识别内存布局.如果Tree的实现使用指针,那么我们有什么工具或者需要什么样的方法来映射它的内存布局?
在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下获取有关进程自身内存映射的等效信息(地址范围,保护,映射文件名等等)?
在了解highmem需要超过1GB的RAM时,我遗漏了一些东西.有人能指出我哪里出错吗?谢谢!
我知道的:
为内核操作保留1 GB进程的虚拟内存(高内存区域).用户空间可以使用剩余的3 GB.这是3/1分裂.
VM的虚拟内存功能将(连续)虚拟内存页面映射到物理页面(RAM).
我不知道的是:
什么操作使用内核虚拟内存?我想像内核空间中的kmalloc(...)这样的东西会使用内核虚拟内存.
我认为在这个方案下可以使用4GB的RAM.我不明白为什么内核1 GB虚拟空间是解决物理空间时的限制因素.这是我理解失败的地方.请指教.
我一直在读这篇文章(http://kerneltrap.org/node/2450),这很棒.但它并不能完全解决我的问题.
我一直试图弄清楚VMware是如何工作的(特别是安装Linux时),我有几个问题:
VMware遇到类似命令时会发生什么push cs?特别是cs,因为它的权限级别为0,VMware运行在1个权限级别,所以我假设它不得不将其转换为其他命令.
虚拟内存:它如何在虚拟机上运行?有2级翻译 - 进程虚拟内存 - >虚拟机物理内存 - >真机物理内存?当真实机器交换页面时,如何通知VMware?
我的问题是Linux特定的,需要了解内核,虚拟内存,mmap,pagefaults.我有大型静态数组的C程序,它将进入bss部分(内存,初始化为零).程序启动时,此内存不是物理分配的,只有虚拟内存,虚拟内存的每一页都映射到特殊的零页面(全零的页面).当应用程序访问此页面时,将生成页面故障并分配物理页面.
问题是:是否会在第一次读取访问时或从bss部分对页面进行第一次写访问时生成此类页面错误?
父进程在尝试分叉子进程时失败,并且errno = 12(内存不足).父进程在Linux 3.0内核上运行 - SLES 11.在分叉子进程时,父进程已经占用了大约70%的RAM(180GB/256GB).这个问题有解决方法吗?
该应用程序是用C++编写的,用g ++ 4.6.3编译.
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.)

我已经尝试过的事情:
virtual-memory ×10
linux ×5
linux-kernel ×3
c++ ×2
64-bit ×1
file-io ×1
fork ×1
haskell ×1
heap ×1
heap-memory ×1
io ×1
macos ×1
memory ×1
mmap ×1
page-fault ×1
ram ×1
vmware ×1
winapi ×1