ورود

نسخه کامل مشاهده نسخه کامل : چگونگي پياده‌سازي بافرها



sasan816
29-01-2010, 12:59
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
انباره‌هاي داده همانند ‌malloc‌ در++ ‌C‌ عمل مي‌كنند و مي‌توان به‌صورت كاملا ديناميك داده‌ها را در حافظه ذخيره كرد و به آنها فضا تخصيص داد. از آنجايي كه استفاده از اين انباره‌هاي داده، به‌دليل رخ دادن پراكندگي ‌(Fragmentation)‌ بسيار كند مي‌شود، از اين رو در دنياي واقعي نمي‌شود از آنها استفاده كرد. چرا كه انباره‌هاي داده مقدار خود را در هر لحظه از كاربر مي‌گيرند و اندازه هر بلاك آنها با يكديگر متفاوت است. ‌ ‌
براي اين‌كه بشود از اين قابليت مهم و مفيد استفاده كرد، بايد يك ظرف ثابت تعريف كرد كه بلاك‌هاي حافظه را از پيش تعريف كرده باشد و در كنار هم در حافظه قرار داده باشد. بدين ترتيب، عمل تخصيص، استفاده، و آزادسازي داده‌ها را بايد در لايه برنامه‌نويسي انجام دهيم. ‌ ‌

پياده‌سازي
يك ماژول ساده انباره داده مي‌تواند 3 انبار داده را در زمان كامپايل به‌خود اختصاص دهد، اين انباره‌ها داده را مي‌توان با كمك توابع فرضي زير پياده كرد: ‌ ‌
براي تخصيص فضا:
MemPoolHandle allocateMemory
‌(size_t bytes);‌
براي دسترسي به يك خانه از انباره: ‌ ‌
‌void * getPointer(MemPoolHandle h);‌
براي آزادسازي حافظه:
‌void freeMemory(MemPoolHandle h);‌
وقتي يك برنامه مي‌نويسيد، مشخص نمي‌شود كه برنامه چه‌مقدار حافظه به‌خود اختصاص مي‌دهد. بنابراين طول يك آرايه كه از مجموعه‌اي از ‌Structure‌ها تشكيل شده است، تا زمان اجراي برنامه و تخصيص حافظه پويا، مشخص نخواهد شد. در ‌C++‌ براي تخصيص حافظه از عملگري به‌نام ‌new‌ استفاده مي‌كنيم. و در صورتي كه بخواهيم يك مكان حافظه را حذف كنيم، از ‌delete‌ استفاده مي‌كنيم.

ويژگي‌هاي انباره داده
تخصيص حافظه در انباره‌هاي داده زمان ثابتي دارد. آزادكردن حافظه براي هزاران شيء در انباره داده، تنها يك عمليات به‌حساب مي‌آيد. اما در صورتي كه از ‌malloc‌ استفاده شود، بايد تك‌تك خانه‌ها را سوا كرد.
سوم اين‌كه انباره‌هاي داده مي‌توانند به‌صورت ساختار درختي مرتبط شوند، بنابراين براي ساختارهاي خاص برنامه‌نويسي چون حلقه‌ها و توابع بازگشتي كاربرد زيادي خواهند داشت. از طرف ديگر، بهتر است انباره‌هاي داده را براي كاربرد مناسب در هر برنامه، بهينه كرد.
وظايفي همچون تخصيص حافظه كافي براي استفاده، رهگيري و كنترل تخصيص‌ها، آزادسازي حافظه وقتي نيازي به متغير نيست، وظايف پيچيده‌اي هستند. اگر در اين وظايف كوتاهي شود، احتمال زيادي وجود دارد كه برنامه زير فشار كاملا خرد شود و يا در حالت بدتر، به بقيه سيستم هم آسيب برساند. انباره داده، يعني شيوه ديگري به‌جز ‌malloc()‌ و عدم استفاده مستقيم از سيستم عامل براي تخصيص حافظه. ‌ ‌
انباره‌ها به‌طور خودكار اندازه خود را افزايش مي‌دهند تا نيازهاي برنامه را رفع كنند و هر بار مقدار بيشتري حافظه دريافت مي‌كنند.
اين اتفاق تا زماني مي‌افتد كه ديگر حافظه در دسترس براي سيستم وجود نداشته باشد. البته، اين پايان ماجرا نيست. انباره‌هاي داده در صورتي كه كنترل شوند، مي‌توانند با فراخواني توابع، تميز و نابود شوند. چنين توابعي به‌برنامه‌نويسان اجازه مي‌دهد بي‌دغدغه و با فراخواني يك دو جين تابع، كليه نيازهاي حافظه‌اي خود را با انباره‌هاي داده برطرف كنند و بعد از استفاده آن را تميز كنند. همانطور كه گفتيم، انباره‌هاي داده، ساختاري سلسله مراتبي هم دارند. بدين ترتيب مي‌توان براي هر انباره داده، تعدادي زيرانباره‌‌(Subpool)‌ نيز تعريف كرد. ‌ ‌از اين ويژگي مي‌توان در هنگام خالي كردن تمام زيرانباره‌ها استفاده كرد كه با خالي كردن انباره والد، تمام زيرانباره‌ها نيز خالي مي‌شوند. ‌ ‌
انباره‌هاي داده براي مديريت پايه حافظه بسيار مفيد است، ساختار انباره داده در سناريوي توابع بازگشتي و حلقه‌ها نقش مهمي دارد. هرچند كه ممكن است انباره‌هاي داده براي همه برنامه‌هايي كه مي‌نويسيد ايده‌آل نباشد. همچنين استفاده از انباره داده نياز به زمان دارد تا ويژگي‌ها و ضعف‌هاي آن را بشناسيد. توجه داشته باشيد كه رفع ايراد در برنامه‌هايي كه حافظه زيادي مصرف مي‌كنند، دشوارتر است.


اميربهاالدين سبط‌الشيخ