当前位置:首页 > 内存 > 正文

c共享内存实现(共享内存的实现详解)

  • 内存
  • 2024-08-28 05:12:35
  • 1303

一、c#可以通过内存映射的方式从一个工程中读另一个工程共享内存的数据吗内存映射文件使用虚拟内存将文件映射到进程地址空间。接下来进程运行该文件就像运行进程空间中的地址一样,例如C语言函数中使用memcpy等内存操作。这种方法可以很好地应用于需要频繁处理文件或大文件的情况。这种方式的I/O处理效率比普通的I/O处理要高
共享内存是一部分。内存映射文件在这种特殊情况下,内存映射是内存的一部分而不是磁盘上的文件。共享内存的主体是进程。操作系统默认会给每个进程分配内存空间。每个进程只允许访问操作系统分配给它的内存,不能访问其他进程。有时候我们需要在不同进程之间访问同一块内存,那么该怎么办呢?操作系统提供用于创建和访问共享内存的API。需要共享内存的进程可以使用这组特定的API来访问多个进程之间共享的内存。每个进程访问该内存就像访问硬盘上的文件一样。.
MemoryMappedFiles命名空间是在.Net4.0中引入的。该命名空间中的类包含与Windows共享内存相关的API,允许.Net程序员更方便地使用内存映射文件。
在C#中使用共享内存。App1的以下代码允许用户将一行文本输入到共享内存中;App2不断更新控制台,输出最新内容到共享内存;App3与App2的功能相同,但读取方式不同。
应用程序代码1:
usingSystem;
c;android从资源文件中读取文件流并显示
;
;
;
//内存映射文件命名空间引用
MappedFiles;
namespaceApp1
{
classProgram
{
staticvoidMain(string[]args)
{
longcapacity=1<<​10<<10;
//创建或打开共享内存
using(varmmf=OrOpen("testMmf",capacity,ite))
{
//通过MemoryMappedFile的CreateViewAccessor方法获取共享内存访问器
varviewAccessor=ViewAccessor(0,capacity);
//重复写入,直到可以写入共享内存此操作有不同的字符串值
while(true)
{
ine("请输入一行写入共享内存的文本:");
stringinput=ne();
//将字符串的长度写入共享内存的开头memory
(0,);
//向共享内存位置写入字符4
rray(4,y(),0,);

App2代码:
usingSystem;
c;
;
;
ing;
//表示使用内存映射文件所需的命名空间
MappedFiles;
namespaceApp2
{
classProgram
{
staticvoidMain(string[]args)
{
longcapacity=1<<10<<10;
using(varmmf=isting("testMmf"))
{
MemoryMappedViewAccessorviewAccessor=ViewAccessor(0,capacity);
//循环更新共享内存字符串的值
while(true)
{
//读取字符长度
intstrLength=t32(0);
char[]charsInMMf=newchar[strLength];
//读取字符
ray(4,charsInMMf,0,strLength);
();
(charsInMMf);
("\r");
(200);

App3代码:
usingSystem;
c;
;
;
MappedFiles;
;
namespaceApp3
{
classProgram
{
staticvoidMain(string[]args)
{
longcapacity=1<<10<<10;
//打开共享内存
using(varmmf=isting("testMmf"))
{
//使用CreateViewStream方法返回流实例
using(varmmViewStream=ViewStream(0,capacity))
{
//这里必须指定Unicode编码,否则会出现问题
using(BinaryReaderrdr=newBinaryReader(mmViewStream,e))
{
while(true)
{
(0,);
intlength=t32();
char[]chars=ars(length);
(chars);
("\r");
(200);
();

}
二、关于c语言和共享内存的问题好像叫CreateFileMapping
但是Windows下做共享内存的机制其实就是创建一个共享文件,大家一起读写,相当恶心。