چگونگی پیاده‌سازی بافرها

استخر حافظه

انباره‌های داده همانند ‌malloc‌ در++ ‌C‌ عمل می‌کنند و می‌توان به‌صورت کاملا دینامیک داده‌ها را در حافظه ذخیره کرد و به آنها فضا تخصیص داد. از آنجایی که استفاده از این انباره‌های داده، به‌دلیل رخ دادن پراکندگی ‌(Fragmentation)‌ بسیار کند می‌شود، از این رو در دنیای واقعی نمی‌شود از آنها استفاده کرد. چرا که انباره‌های داده مقدار خود را در هر لحظه از کاربر می‌گیرند و اندازه هر بلاک آنها با یکدیگر متفاوت است. ‌ ‌
کد خبر: ۳۰۸۸۴۴

برای این‌که بشود از این قابلیت مهم و مفید استفاده کرد، باید یک ظرف ثابت تعریف کرد که بلاک‌های حافظه را از پیش تعریف کرده باشد و در کنار هم در حافظه قرار داده باشد. بدین ترتیب، عمل تخصیص، استفاده، و آزادسازی داده‌ها را باید در لایه برنامه‌نویسی انجام دهیم. ‌ ‌

پیاده‌سازی

یک ماژول ساده انباره داده می‌تواند 3 انبار داده را در زمان کامپایل به‌خود اختصاص دهد، این انباره‌ها داده را می‌توان با کمک توابع فرضی زیر پیاده کرد: ‌ ‌

برای تخصیص فضا:

MemPoolHandle allocateMemory

‌(size_t bytes);‌

برای دسترسی به یک خانه از انباره: ‌ ‌

‌void * getPointer(MemPoolHandle h);‌

برای آزادسازی حافظه:

‌void freeMemory(MemPoolHandle h);‌

وقتی یک برنامه می‌نویسید، مشخص نمی‌شود که برنامه چه‌مقدار حافظه به‌خود اختصاص می‌دهد. بنابراین طول یک آرایه که از مجموعه‌ای از ‌Structure‌ها تشکیل شده است، تا زمان اجرای برنامه و تخصیص حافظه پویا، مشخص نخواهد شد. در ‌C++‌ برای تخصیص حافظه از عملگری به‌نام ‌new‌ استفاده می‌کنیم. و در صورتی که بخواهیم یک مکان حافظه را حذف کنیم، از ‌delete‌ استفاده می‌کنیم.

ویژگی‌های انباره داده

تخصیص حافظه در انباره‌های داده زمان ثابتی دارد. آزادکردن حافظه برای هزاران شیء در انباره داده، تنها یک عملیات به‌حساب می‌آید. اما در صورتی که از ‌malloc‌ استفاده شود، باید تک‌تک خانه‌ها را سوا کرد.

سوم این‌که انباره‌های داده می‌توانند به‌صورت ساختار درختی مرتبط شوند، بنابراین برای ساختارهای خاص برنامه‌نویسی چون حلقه‌ها و توابع بازگشتی کاربرد زیادی خواهند داشت. از طرف دیگر، بهتر است انباره‌های داده را برای کاربرد مناسب در هر برنامه، بهینه کرد.

وظایفی همچون تخصیص حافظه کافی برای استفاده، رهگیری و کنترل تخصیص‌ها، آزادسازی حافظه وقتی نیازی به متغیر نیست، وظایف پیچیده‌ای هستند. اگر در این وظایف کوتاهی شود، احتمال زیادی وجود دارد که برنامه زیر فشار کاملا خرد شود و یا در حالت بدتر، به بقیه سیستم هم آسیب برساند. انباره داده، یعنی شیوه دیگری به‌جز ‌malloc()‌ و عدم استفاده مستقیم از سیستم عامل برای تخصیص حافظه. ‌ ‌

انباره‌ها به‌طور خودکار اندازه خود را افزایش می‌دهند تا نیازهای برنامه را رفع کنند و هر بار مقدار بیشتری حافظه دریافت می‌کنند.

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

انباره‌های داده برای مدیریت پایه حافظه بسیار مفید است، ساختار انباره داده در سناریوی توابع بازگشتی و حلقه‌ها نقش مهمی دارد. هرچند که ممکن است انباره‌های داده برای همه برنامه‌هایی که می‌نویسید ایده‌آل نباشد. همچنین استفاده از انباره داده نیاز به زمان دارد تا ویژگی‌ها و ضعف‌های آن را بشناسید. توجه داشته باشید که رفع ایراد در برنامه‌هایی که حافظه زیادی مصرف می‌کنند، دشوارتر است.

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

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها