حافظه های FIFO و LIFO - کاربردها و تفاوت ها

حافظه های LIFO و FIFO – کاربردها و تفاوت‌ها

بدون دیدگاه

حافظه های LIFO و FIFO

ساختار های مختلفی برای نگهداری و مدیریت داده ها در سیستم های کامپیوتری موجودی می‌باشد. آرایه ها، گراف ها، حافظه های LIFO و FIFO و … نمونه هایی از آنها هستند. هریک از این ساختارها برای پیاده سازی راهکاری خاص در دنیای برنامه نویسی مناسب می‌باشند. در ادامه به بررسی کاربردها و تفاوت های حافظه های LIFO و FIFO خواهیم پرداخت.

حافظه های LIFO

این نوع از ساختار حافظه، به شکلی است که عناصر در آن بر روی هم انباشته می‌شوند. می‌توانید بشقاب را تصور کنید که بر روی یکدیگر قرارگرفته اند. قاعدتا شما می‌توانید بالاترین بشقاب را بردارید. و به یاد داشته باشید، بالاترین بشقاب، آخرین بشقابی است که بر روی سایر بشقاب ها قرار داده اید. در این حالت همواره به آخرین عنصر دسترسی خواهید داشت. برای همین به این نوع ساختار حافظه Last In First Out و یا به اختصار LIFO گفته می‌شود. تصویر زیر نمایی از ساختار حافظه LIFO را نشان می‌دهد.

ساختار حافظه LIFO و نحوه عملکرد Stack

Stack یکی از نمونه های حافظه LIFO است. این نوع ساختار به شما اجازه می‌دهد با Push کردن عناصر را به Stack اضافه نمایید. برای دسترسی به آخرین عنصر و بیرون آوردن آن از Stack می‌توانید آن را Pop کنید. همچنین تعداد عناصر موجود در Stack برای شما از طریق خصوصیتی به نام Count قابل دسترس است.

توجه داشته باشید، با هر بار Pop کردن، بالاترین عنصر از Stack خارج شده و حذف می‌گردد. برای بررسی آخرین عنصر Stack بدون حذف آن از Stack می‌توانید از تابع Peek استفاده نمایید.

Stack یکی از کاربردی ترین ساختارها در بین Collection های موجود در دات نت می‌باشد. (برای آشنایی با Collection ها در دات نت، مطلب: Collection ها در دات نت را مطالعه نمایید). نوع متداول آن که عناصر را در قالب Object دریافت و نگهداری می‌کند در System.Collections قابل دسترس می‌باشد. برای افزایش کارایی دستورات و جلوگیری از بروز Exception حین تبدیل انواع، می‌توانید از نسخه Generic آن که در System.Collections.Generic موجود است بهره ببرید. (برای آشنایی بیشتر با تبدیل انواع مطلب: تبدیل انواع داده ها در سی شارپ را مطالعه نمایید). (برای آشنایی بیشتر با Generic ها مطلب: آشنایی با مفهوم برنامه نویسی Generic را مطالعه نمایید).

حافظه های FIFO

نوع دیگری از ساختارهای حافظه که نقطه مقابل حافظه های LIFO است، حافظه FIFO می باشد. برای تجسم عملکرد آن می توانید یک صف از افراد را در نظر بگیرید. افراد به ترتیب وارد صف می شوند. به مرور طول صف افزایش می‌یابد. سپس افراد به ترتیبی که وارد صف شده اند، از صف خارج می‌شوند. در این صورت اولین نفری که وارد صف شده، اولین نفری است که از صف خارج خواهد شد. به همین دلیل به این نوع حافظه First In First Out و یا به اختصار FIFO می‌گویند. تصویر زیر نمایی از ساختار حافظه FIFO را نمایش می‌دهد.

ساختار حافظه FIFO در دات نت

Queue یک نمونه از حافظه های FIFO می‌باشد. در این ساختار با Enqueue کردن می‌توانید عناصر را در Queue قرار دهید. در این صورت تعداد عناصر موجود در Queue افزایش یافته و از طریق خصوصیتی به نام Count قابل دسترس خواهد بود. سپس می‌توانید با استفاده از تابع Dequeue اولین عنصری را که در صف قرار داده اید از صف خارج نمایید.

توجه داشته باشید، Dequeue کردن اولین عنصر را از Queue خارج و حذف خواهد کرد. به همین دلیل برای بررسی آخرین عنصر Queue بدون حذف آنT می‌توانید از تابع Peek استفاده نمایید.

Queue نیز یکی از کاربردی ترین ساختارها در بین Collection های موجود در دات نت می‌باشد. نوع متداول آن که عناصر را با روش Boxing در قالب Object دریافت و نگهداری می‌کند و در System.Collections قابل دسترس می‌باشد. برای افزایش کارایی دستورات و جلوگیری از بروز Exception حین Unbox کردن عناصر، می‌توانید از نسخه Generic آن که در System.Collections.Generic موجود است بهره ببرید.

کاربردهای حافظه های LIFO و FIFO

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

در یک سیستم اتومایسون، برای مدیریت روال پیشرفت کار، وقتی اموری با اولوبت بالا پیش می‌آیند، Stack می‌تواند راهکار مناسبی باشد. در این صورت آخرین Task را می‌توان در Stack قرار داد و به کار با اولویت بالا رسیدگی کرد. پس از پایان کار جاری، می‌توان از Stack عنصر جاری را Pop کرد و آن کار را ادامه داد. همین روال در مدیریت Interrupt ها در CPU رخ می‌دهد.

آواتار کاربر

شهاب ساری اصلانی

از سال 1385 به صورت جدی مشغول تدریس در حوزه های برنامه نویسی دات نت و طراحی بانک های اطلاعاتی بوده ام. تدریس به عنوان یک حرفه همیشه برایم جذاب بوده و یادگیری جدیدترین مباحث لذت بخش است.

ارسال یک دیدگاه

آدرس ایمیل شما منتشر نخواهد شد.