PDA

View Full Version : سوال: درباره Shared memory کسی اطلاعاتی داره؟



water_lily_2012
سه شنبه 09 مهر 1392, 16:37 عصر
سلام

آیا کسی تا بحال با Shared Memory کاری کرده و جواب گرفته؟
خواهشا کسی بلده کمک کنه. مثال کاملی هم اگر کسی داره قرار بده.

تشکر

FastCode
سه شنبه 09 مهر 1392, 17:27 عصر
ببخشید که بی پرده میگم ولی یه سری سوالات هستند که معمولا اشتباه هستند چون با توجه به پیچیدگیشون شخصی که سوال پرسیده بهشون نیاز نداره.دقیقا مثل اینکه من بپرسم روش ساخت سوخت فضاپیما چیه.مطمئنا هدفی بزرگتر از درست کردن ۴ تا فشفشه و ترقه ندارم و راه حل بهتری برای من وجود دارد.شما هم اول هدفتون رو مشخص کنید.و بگید میخواهید چه نوع داده ای رو منتقل کنید و تا الان چی نوشتید و چه مشکلاتی دارید.

water_lily_2012
چهارشنبه 10 مهر 1392, 10:51 صبح
سلام
می خواهم به جای اینکه اطلاعات را در یک فایل بین چند پروسس جابجا کنم در حافظه این کار را انجام دهم. اطلاعات هر چیزی می تونه باشه ولی بیشتر ساختار یک جدول هست.
این پروسس ها هر کدام می تواند در یک برنامه جدا باشه. و باید بتوانند از اطلاعات این قسمت حافظه به صورت مشترک استفاده کنند.
تشکر

FastCode
چهارشنبه 10 مهر 1392, 12:26 عصر
فکر میکنم بهتر باشه توی این وضعیت از NamedPipe استفاده کنید.
البته اگر بیشتر توضیح میدادید که هر برنامه با چه زبونی نوشته شده و به کد کدومها دسترسی دارید شاید میشد راه حل بهتری ارائه داد.

water_lily_2012
چهارشنبه 10 مهر 1392, 12:29 عصر
سلام
قرار هست خودم بنویسم و زبان C# هست.
مثالی از NamedPipe دارید یا یه توضیحی که دقیقا چیه و چه فرقی با shared memory داره.

FastCode
چهارشنبه 10 مهر 1392, 14:05 عصر
اگر قرار هست بنویسید پیشنهاد میکنم از shared memory استفاده نکنید.
توی برنامه های managed زمانی از shared memory استفاده میشه که برنامه نوشته شده و هیچ راهی برای تغییرش وجود نداره.
پیشنهاد من اینه که از چیزی مثل MEF برای ارتباط قسمتهای مختلف استفاده کنید.یا حتی خودتون کاری که قرار هست MEF انجام بده رو انجام بدید.
برای روش کار MEF و اینکه چی هست و چرا و چطوری استفاده میشه جست و جو کنید.

مهرداد صفا
چهارشنبه 10 مهر 1392, 14:12 عصر
با سلام.

Sharing Files and Memory (Windows) (http://msdn.microsoft.com/en-us/library/aa366878%28v=vs.85%29.aspx)

Creating Named Shared Memory (Windows) (http://msdn.microsoft.com/en-us/library/aa366551%28v=vs.85%29.aspx)

Programming Memory-Mapped Files with the .NET Framework - CodeProject (http://www.codeproject.com/Articles/138290/Programming-Memory-Mapped-Files-with-the-NET-Frame)

pinvoke.net: createfilemapping (kernel32) (http://www.pinvoke.net/default.aspx/kernel32.createfilemapping)

System.IO.Pipes Namespace () (http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k%28SYSTEM.IO.PIPES%29;k%28VS.OBJECTBROWSER%29;k %28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29&rd=true)

Inter-Process Communication in .NET Using Named Pipes, Part 1 - CodeProject (http://www.codeproject.com/Articles/7176/Inter-Process-Communication-in-NET-Using-Named-Pip)


Inter-Process Communication in .NET Using Named Pipes, Part 2 (http://www.codeproject.com/KB/threads/dotnetnamedpipespart2.aspx)

.NET Remoting in Simple English (http://www.codeproject.com/KB/XML/remotingsimpleeng.aspx)

.NET Remoting with an easy example (http://www.codeproject.com/KB/IP/Net_Remoting.aspx)

Getting started with named pipes - B# .NET Blog (http://bartdesmet.net/blogs/bart/archive/2007/04/12/getting-started-with-named-pipes.aspx)

Inter Process Communication in C# | Ultimate Programming Tutorials (http://www.ultimateprogrammingtutorials.info/2013/06/inter-process-communication-in-c.html)

water_lily_2012
چهارشنبه 10 مهر 1392, 14:23 عصر
چه تفاوتی بین این سه تا مورد هست؟
MEF
Pipe
Shared memory

داخل کدامیک میشه یک ساختار را ذخیره کرد؟

FastCode
چهارشنبه 10 مهر 1392, 15:33 عصر
با MEF همه ی قسمتهای برنامه در یک پروسس هستند ولی به یکدیگر دسترسی ندارند و سطح دسترسی رو شما تعیین میکنید.
در Pipe میتونید تحت شبکه هم کار کنید ولی اگر درست طراحی نکنید خیلی بد میشه.
در Shared Memory هم برنامه ها یک قسمت حافظه مشترک دارند که هر کدوم که تغییرش بده, بقیه میبینند.
Pipe اگر تحت شبکه نباشه مثل Shared Memory یک نوع IPC حساب میشه.

water_lily_2012
چهارشنبه 10 مهر 1392, 16:54 عصر
امکان قرار دادن یک جدول و اطلاعاتش در Shared memory هست یا نه؟

FastCode
چهارشنبه 10 مهر 1392, 21:53 عصر
امکان قرار دادن یک جدول و اطلاعاتش در Shared memory هست یا نه؟
بله.ولی خیلی خیلی سخته.

water_lily_2012
پنج شنبه 11 مهر 1392, 12:51 عصر
سلام
این مثال را پیدا کردم. کار هم میده یک رشته وارد می کنه و دوباره از حافظه می خونه. دو تا تابع در سرور هست و دو تا تابع اصلی هم در کلاینت.
فقط مشکل اینکه فقط یک رشته دریافت میکنه لطفا ببینید میشه یک ساختار را بهش ارسال و سپس دریافت کرد.
و اینکه از کجا بفهمیم چه موقع داده جدید وارد شده تا کلاینت بتونه آنرا بخونه؟؟

http://code.msdn.microsoft.com/windowsdesktop/CSFileMappingServer-1ec32972#content
تشکر

FastCode
پنج شنبه 11 مهر 1392, 14:41 عصر
NamedEvent
http://stackoverflow.com/questions/10175691/shared-memory-need-for-synchronization

water_lily_2012
جمعه 12 مهر 1392, 15:06 عصر
سلام
در اون برنامه که گذاشتم در پروژه سرور، یک خط یک string را به byte تبدیل می کنه. و البته قبل از تبدیل یک '0\' نیز به string اضافه می کنه. حالا چطور می تونم یک کلاس بسازم و اون را تبدیل به بایت کنم.

byte[] bMessage = Encoding.Unicode.GetBytes(Message + '\0');
تشکر

FastCode
جمعه 12 مهر 1392, 16:43 عصر
Serialization
برای شروع جست و جو کنید:
XMLFormatter
BinaryFormatter
ProtocolBuffers
اولی اصلا به درد نمیخوره و فقط برای نمایش به خود برنامه نویس خوبه.
دومی یک مقدار قابل تحمله ولی هر دو برنامه باید با یک سری Reference کامپایل شده باشن
و سومی که میشه گفت همه چیزش عالیه ولی شاید به راحتی اون دو تای دیگه نباشه.

برای علت و اون صفر هم جست و جو کنید comparison of bstr and cstring