PDA

View Full Version : سوال: قفل کردن حافظه استفاده نکردن از virtual memory



kochol
دوشنبه 15 تیر 1388, 19:44 عصر
سلام
من برای برنامه ام نیاز دارم که ویندوز روی مدیریت حافظه من کنترلی نداشته باشه.
می خواهم یک ارایه ای تعریف کنم و مطمین باشم که ویندوز اونو به حافظه مجازی نمی بره.
چگونه می تونم این کار رو انجام بدم.

tdkhakpur
دوشنبه 15 تیر 1388, 19:56 عصر
سلام
ببینید شما با استفاده از new و گرفتن پویای حافظه میتوانید این کار را انجام دهید.ولی فکر کنم بردن حافظه پویا به مجازی آخرین کار در ویندوز باشد.
ولی بطور کلی ارایه شما سهله ویندوز در صورت نیاز برنامه شمار را هم از حافظه به مجازی میتواند ارسال کند.من که همچین خاصیتی ندیدم که بتوان از آن برای جلوگیری از این کار استفاده کرد.

hoax3r
دوشنبه 15 تیر 1388, 22:11 عصر
می خواهم یک ارایه ای تعریف کنم و مطمین باشم که ویندوز اونو به حافظه مجازی نمی بره.

زیاد مطمعن نیستم ولی فکر نکنم همچین چیزی بشه، بخاطر اینکه تمام حافظه ی یه پروسه در واقع همین
حافظه Virtual Memory هست حتی heap , stack از این حافظه گرفته میشه.

در MSDN یه قسمتی با موضوع Memory Management هست که API های مورد نیاز برای کار با حافظه رو داده
که جوابگوی خیلی از نیازها در این مورد هست حالا باز اگه بگین دقیقا چجور مدیریتی می خواین روی حافظه انجام بدین شاید بهتر بشه راهنمایی کرد.

kochol
سه شنبه 16 تیر 1388, 08:56 صبح
سلام
من یه حافظه سریع می خوام داشته باشم.
خیلی ممنون از توضیحاتون
فکر کنم این دستور همون کاری که من می خوام بکنه.


HeapAlloc Function

Allocates a block of memory from a heap. The allocated memory is not movable.


LPVOID WINAPI HeapAlloc(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in SIZE_T dwBytes
);



فقط گفته بود که حافظه بیشتر از 512 کیلو بایت نمیتونید بگیرید. من حافظه ای که می خوام بگیرم حدود 1.6 مگا بایت است.

اینو تو توضیحات دستور HeapCreate گفته بود.

If dwMaximumSize is 0, the heap is growable. The heap's size is limited only by the available memory. Requests to allocate blocks larger than 0x7FFF8 bytes do not automatically fail. The system calls the VirtualAlloc function to obtain the memory that is needed for large blocks. Applications that need to allocate large memory blocks should set dwMaximumSize to 0.

hoax3r
سه شنبه 16 تیر 1388, 20:59 عصر
آره با این API میشه اول باید یه فضای heap درست کنی یا با GetProcessHeap هیپ پیشفرض رو گرفت
یا با HeapCreate یکی بسازی البته برای کار با این تابع برای اینکه از نظر اندازه مشکل نداشته باشی پارامتر dwMaximumSize رو صفر باید گذاشت
بعد از HeapAlloc برای گرفتن حافظه استفاده میکنید و HeapFree برای آزاد کردن حافظه

من درست منظور قسمتی از این متن که خودت اشاره کردی 512 و ... رو نفهمیدم (یعنی سوادمون نمیکشه :لبخند: )
ولی میدونم میتونی هر چقدر می خوای با این API هم حافظه بگیری.

Nima_NF
چهارشنبه 17 تیر 1388, 00:48 صبح
فقط گفته بود که حافظه بیشتر از 512 کیلو بایت نمیتونید بگیرید. من حافظه ای که می خوام بگیرم حدود 1.6 مگا بایت است.

در صورتی که شما از HeapCreate استفاده کنید آنوقت heap شما از نوع non-growable هست و این محدودیت را دارید. در غیر این صورت خیر، یعنی مثلا وقتی از GetProcessHeap استفاده می کنید گرفتن حافظه فراتر از آن میزان ممکن است.

دقت کنید که حافظه HeapAlloc در تخصیص حافظه virtual تفاوت چندانی با حافظه های new و malloc و غیره ندارد. HeapAlloc با مدیریت کننده virtual memory در ارتباط هست. پس این طوری فکر نکنید که با حافظه virtual کاری ندارد، بلکه خودش تشخیص می دهد و از VirtualAlloc در مواقع نیاز استفاده خواهد کرد.

در کل همواره پیشنهاد می کنند که مخصوصا برای حافظه های بزرگ که مدام تخصیص حافظه و آزاد کردن در کار هست از همان new/malloc استفاده شود که performance را در کل افزایش می دهند و fragmentation حافظه را کاهش می دهند(خودشان heap را دستکاری می کنند).

kochol
چهارشنبه 17 تیر 1388, 08:05 صبح
سلام


قت کنید که حافظه HeapAlloc در تخصیص حافظه virtual تفاوت چندانی با حافظه های new و malloc و غیره ندارد. HeapAlloc با مدیریت کننده virtual memory در ارتباط هست. پس این طوری فکر نکنید که با حافظه virtual کاری ندارد، بلکه خودش تشخیص می دهد و از VirtualAlloc در مواقع نیاز استفاده خواهد کرد.



پس منظورش از اینکه گفته این حافظه جابه جا پذیر نیست چیه؟

Allocates a block of memory from a heap. The allocated memory is not movable.

Nima_NF
پنج شنبه 18 تیر 1388, 20:30 عصر
سلام

پس منظورش از اینکه گفته این حافظه جابه جا پذیر نیست چیه؟

Allocates a block of memory from a heap. The allocated memory is not movable.

یعنی در دفعات مختلفی که با HeapAlloc حافظه تخصیص می دهید، مدیریت کننده حافظه مکان های تکه تکه شده را که پشت سر هم نیستند برای بهینه سازی جابجا نمی کند، در نتیجه اگر دفعات این تخصیص و مقدار حافظه زیاد باشد fragmentation رخ می دهد. چون حافظه آن Non-movable هست. مثلا از طریق تابع HeapCompact می توان برای سایر heap های movable مرتب سازی و بهینه کردن انجام داد. (همانند defragmentation برای هارد دیسک)

در هر حال برای ویندوز XP به بعد قابلیت LFH عرضه شده است که با تخصیص بازه های پیش فرض این تکه تکه شدن را کاهش می دهد و از طریق HeapSetInformation قابل فعال کردن هست.