假设进程正在共享内存中创建互斥锁并锁定它并在互斥锁被锁定时转储核心.
现在在另一个过程中,如何检测互斥锁已被锁定但不属于任何进程?
上下文是进程间通信,其中一个进程("服务器")必须将固定大小的结构发送到在同一台机器上运行的许多侦听进程("客户端").
在Socket Programming中我很自在.为了使服务器和客户端之间的通信更快并减少副本数量,我想尝试使用共享内存(shm)或mmaps.
操作系统是RHEL 64位.
由于我是新手,请建议我应该使用哪个.如果有人能指点我一本书或在线资源来学习同样的东西,我会很感激.
谢谢你的回答.我想补充一点,服务器(市场数据服务器)通常会接收多播数据,这将导致它每秒向"客户端""发送"大约200,000个结构,其中每个结构大约为100字节.shm_open/mmap的实现是否仅对大型数据块或大量小型结构的性能优于套接字?
我花了一些时间研究我正在处理的应用程序的内存映射IO.我有一些非常大的(TB级)文件,我想将它们的段映射到内存中,用于读取和写入,最大限度地利用操作系统级缓存.我正在编写的软件需要在Unix/Linux和Windows下运行......性能至关重要.
我发现boost::iostreams::mapped_file_source和boost::iostreams::mapped_file_sink,其提供了大部分我在寻找的设施.我喜欢但尚未找到的设施是:
msync在Unix FlushViewOfFile上为(2); 在Windows上)我可以使用这些东西"boost/iostreams/device/mapped_file.hpp"吗?是否有其他独立于平台的库可以更好地满足我的要求?我必须开发自己的跨平台库才能获得这种灵活性吗?
我对Linux的困惑man pages了shmctl().我使用以下命令:shmctl (id , IPC_RMID , 0)删除共享段.这man pages似乎与记忆的生命周期相矛盾.
该手册页指出:
IPC_RMID
标记要销毁的细分.该段仅在最后一个进程分离之后才被实际销毁(即,当关联结构shmid_ds的shm_nattch成员为零时).呼叫者必须是所有者或创建者,或具有特权.如果段已被标记为销毁,则将设置IPC_STAT检索的关联数据结构中的shm_perm.mode字段的(非标准)SHM_DEST标志.
如果我是正确的,我相信这意味着如果你有两个附加到共享内存中的两个过程,(让我们称他们为Process1和Process2),Process1可以创建共享内存,连接,分离,破坏了共享内存,并最终终止.然后内存仍然存在,直到Process2分离.
它是否正确?
其次,这句话的man pages意思是:
调用者必须确保段最终被销毁; 否则其故障的页面将保留在内存或交换中.
这似乎是Process1因为它标记了要删除的段,因此需要阻塞直到所有其他进程都被分离,以确保删除内存.但这似乎与上述说法相矛盾.我也不知道如何做到这一点(如果应该这样做的话),所以如果是这样的话,你能解释一下我会怎么做.
我正在寻找有关.NET应用程序何时以及如何共享加载程序集的更多详细信息.我有兴趣在OS进程之间共享,也在同一进程内的AppDomains之间共享.共享程序集通过避免在内存中具有相同程序集的多个副本来减少系统内存使用量,我认为这是主要的好处,但有兴趣知道是否存在其他好处和/或影响.
到目前为止我学到的内容摘要......
Sysinternals进程资源管理器可用于列出.NET进程的AppDomain以及加载到每个AppDomain中的程序集.
.NET进程似乎总是将"核心"程序集加载到名为"SharedDomain"的AppDomain中(假设这在当前进程中的AppDomain之间共享是合理的).
任务管理器和Process Explorer报告"工作集共享"和"工作集可共享"的内存使用数量不是无关紧要,但不清楚共享的内容.(它是共享AppDomain中的'核心'程序集吗?其他[非核心]程序集是否也共享?
在一个简单的测试中,我推出了两个独立的.NET应用程序副本,并为每个应用程序附加了一个Visual Studio调试器."模块"视图显示已加载的程序集及其在内存中的地址.在我的测试用例中,每个加载的模块都位于两个进程中的相同地址.(这是否表示共享,或者这个虚拟地址空间是否必须共享?)
ASP.NET 4.5通过一个叫做装配实习机制支持组件的共享(见看在ASP.NET 4.5共享通用组件,分享共同组件,与aspnet_intern.exe共享通用组件).它似乎通过设置文件系统符号链接(符号链接)来工作,以便不同的Web应用程序指向共享bin文件夹,因此这就提出了一个问题,即ASP.NET是否只是使用符号链接来触发.NET中的标准程序集共享行为,或者是否有更具体的ASP.NET和IIS AppPools正在进行.
注意.在安装了Visual Studio 2013的计算机上,可以在以下位置找到aspnet_intern.exe:
C:\ Program Files(x86)\ Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1工具\
在更高版本的.NET和Windows Server中,ASP.NET启动时间和内存使用情况有了进一步的改进; 请参阅ASP.NET应用程序暂停 - 响应式共享.NET Web主机,.Net 4.5中的ASP.NET共享主机方案的性能改进,但我不确定这些更改与此问题的相关性如何.
ASP.NET程序集共享也包含在.NET 4.5简介中.
还想知道JITted代码是否共享,因为加载的程序集由MSIL,资源,元数据等组成,并且当代码被JIT时必须分配更多内存.
在紧凑框架中也有关于汇编共享的讨论(我们相信共享,MSDN博客,Abhinaba Basu)
--- UPDATE ---
我使用sysinternals VMMap工具来检查两个AppPools,一个用asp.net程序集internign设置,另一个没有.我还"触摸"了一个测试aspx页面,导致ASP.NET加载所有程序集(并且global.asax运行少量代码,因此导致一些JITting).
报告的两个AppPools的内存使用数据非常相似,工作集,WS Private和WS Shareable基本相同.但是,在"实习"AppPool中,WS Shared要大得多.这是意外的(对我来说),因为没有其他进程可以与之共享,但VMMap显示的是内存块(标记为'.text'并具有执行/读保护),这些内存块在实习AppPool中显示为共享内存,而另一个AppPool中的相同程序集不共享.我对此的解释是,进程中的虚拟内存块被映射到同一物理内存,然后报告为"WS Shared".
ASLR
关于装配空间布局随机化.VMMap工具显示许多类型为"Image(ASLR)"的内存块.ASLR随机化了内存中程序集的位置以阻止恶意软件,我想知道这是否会阻止程序集实习工作正常.使用EMET工具禁用机器的ASLR 会导致程序集地址更加规则,但不会更改报告的内存数,因此它似乎不会影响程序集实习.值得注意的是VMMap仍然显示带有'ASLR'的图像,我怀疑这只是意味着装配/图像被标记为支持/允许ASLR,而不是ASLR生效.
我正在阅读Sun关于并发的教程.
但我无法准确理解内存一致性错误是什么?我搜索了一下,但没有找到任何有用的教程或文章.
我知道这个问题是主观的,所以你可以给我链接到上述主题的文章.
如果你用一个简单的例子解释它会很棒.
我有以下代码模式:
class A {
double a, b, c;
...
};
class B {
map<int, A> table; // Can have maximum of MAX_ROWS elements.
...
};
class C {
B entries;
queue<int> d;
queue<int> e;
...
};
Run Code Online (Sandbox Code Playgroud)
现在我想将一个C类型的对象存储在共享内存中,以便不同的进程可以追加,更新和读取它.我怎样才能做到这一点?(注意:我知道如何在共享内存中存储一个具有固定大小的简单C数组.另外,请记住B.table可能有任意条目.
我正在使用Python multiprocessing.Manager来共享对一个进程将生成而其他进程将查看的数据集的访问.但是,我遇到了返回的dict代理manager.dict()不支持的问题iteritems().
我可以迭代items(),但这意味着构建dict中所有项目的新元组,这是一个很大的数字.有没有办法在不构建中间列表/元组的情况下完成它,因此只使用一定量的额外内存?
注意:如果解决方案要求生成过程暂停迭代,则可以.
我需要读取主进程中的multiprocessing.Process实例编写的字符串.我已经使用Managers和队列将参数传递给进程,因此使用Managers似乎很明显,但Managers不支持字符串:
Manager()返回的管理器将支持类型列表,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array.
如何使用多处理模块中的Managers共享由字符串表示的状态?
我已经编写了一个神经网络分类器,该分类器可以获取海量图像(每张图像约1-3 GB),对其进行修补,然后分别将修补程序通过网络。培训的进行非常缓慢,因此我对其进行了基准测试,发现花大约50 秒钟的时间将补丁从一个图像加载到内存中(使用Openslide库),而仅需0.5秒钟就可以将它们通过模型。
但是,我正在使用具有1.5Tb RAM的超级计算机,其中仅使用了约26 Gb。数据集总计约500Gb。我的想法是,如果我们可以将整个数据集加载到内存中,它将极大地加快训练速度。但是我正在与一个研究团队合作,我们正在多个Python脚本之间进行实验。因此,理想情况下,我想将一个脚本中的整个数据集加载到内存中,并能够在所有脚本中对其进行访问。
更多细节:
.tif格式存储。我发现了很多关于如何在多个Python脚本之间共享Python对象或内存中的原始数据的文章:
多处理模块中具有SyncManager和BaseManager的服务器进程| 示例1 | 示例2 | Docs-服务器进程 | 文件-SyncManager
Manager对象在发送对象之前先对其进行腌制,这可能会使事情变慢。mmap将文件映射到虚拟内存,而不是物理内存 -它会创建一个临时文件。适用于Python 的sysv_ipc模块。这个演示看起来很有希望。
multi-processing模块中可用的功能?我还在Python中找到了IPC /网络选项列表。
有些人讨论服务器-客户端设置,有些人讨论序列化/反序列化,这恐怕会比从磁盘读取花费更多的时间。我找不到任何答案可以解决我的问题,这些答案是否会导致I / O性能的提高。
我们不仅需要在脚本之间共享Python对象/内存;我们需要在Docker容器之间共享它们。
Docker 文档--ipc很好地解释了该标志。根据文档的运行情况,对我来说有意义的是:
docker run …Run Code Online (Sandbox Code Playgroud)