حافظه های LIFO و FIFO – کاربردها و تفاوتها
حافظه های LIFO و FIFO
ساختار های مختلفی برای نگهداری و مدیریت داده ها در سیستم های کامپیوتری موجودی میباشد. آرایه ها، گراف ها، حافظه های LIFO و FIFO و … نمونه هایی از آنها هستند. هریک از این ساختارها برای پیاده سازی راهکاری خاص در دنیای برنامه نویسی مناسب میباشند. در ادامه به بررسی کاربردها و تفاوت های حافظه های LIFO و FIFO خواهیم پرداخت.
حافظه های LIFO
این نوع از ساختار حافظه، به شکلی است که عناصر در آن بر روی هم انباشته میشوند. میتوانید بشقاب را تصور کنید که بر روی یکدیگر قرارگرفته اند. قاعدتا شما میتوانید بالاترین بشقاب را بردارید. و به یاد داشته باشید، بالاترین بشقاب، آخرین بشقابی است که بر روی سایر بشقاب ها قرار داده اید. در این حالت همواره به آخرین عنصر دسترسی خواهید داشت. برای همین به این نوع ساختار حافظه Last In First Out و یا به اختصار LIFO گفته میشود. تصویر زیر نمایی از ساختار حافظه LIFO را نشان میدهد.
Stack یکی از نمونه های حافظه LIFO است. این نوع ساختار به شما اجازه میدهد با Push کردن عناصر را به Stack اضافه نمایید. برای دسترسی به آخرین عنصر و بیرون آوردن آن از Stack میتوانید آن را Pop کنید. همچنین تعداد عناصر موجود در Stack برای شما از طریق خصوصیتی به نام Count قابل دسترس است.
Stack یکی از کاربردی ترین ساختارها در بین Collection های موجود در دات نت میباشد. (برای آشنایی با Collection ها در دات نت، مطلب: Collection ها در دات نت را مطالعه نمایید). نوع متداول آن که عناصر را در قالب Object دریافت و نگهداری میکند در System.Collections قابل دسترس میباشد. برای افزایش کارایی دستورات و جلوگیری از بروز Exception حین تبدیل انواع، میتوانید از نسخه Generic آن که در System.Collections.Generic موجود است بهره ببرید. (برای آشنایی بیشتر با تبدیل انواع مطلب: تبدیل انواع داده ها در سی شارپ را مطالعه نمایید). (برای آشنایی بیشتر با Generic ها مطلب: آشنایی با مفهوم برنامه نویسی Generic را مطالعه نمایید).
حافظه های FIFO
نوع دیگری از ساختارهای حافظه که نقطه مقابل حافظه های LIFO است، حافظه FIFO می باشد. برای تجسم عملکرد آن می توانید یک صف از افراد را در نظر بگیرید. افراد به ترتیب وارد صف می شوند. به مرور طول صف افزایش مییابد. سپس افراد به ترتیبی که وارد صف شده اند، از صف خارج میشوند. در این صورت اولین نفری که وارد صف شده، اولین نفری است که از صف خارج خواهد شد. به همین دلیل به این نوع حافظه First In First Out و یا به اختصار FIFO میگویند. تصویر زیر نمایی از ساختار حافظه FIFO را نمایش میدهد.
Queue یک نمونه از حافظه های FIFO میباشد. در این ساختار با Enqueue کردن میتوانید عناصر را در Queue قرار دهید. در این صورت تعداد عناصر موجود در Queue افزایش یافته و از طریق خصوصیتی به نام Count قابل دسترس خواهد بود. سپس میتوانید با استفاده از تابع Dequeue اولین عنصری را که در صف قرار داده اید از صف خارج نمایید.
Queue نیز یکی از کاربردی ترین ساختارها در بین Collection های موجود در دات نت میباشد. نوع متداول آن که عناصر را با روش Boxing در قالب Object دریافت و نگهداری میکند و در System.Collections قابل دسترس میباشد. برای افزایش کارایی دستورات و جلوگیری از بروز Exception حین Unbox کردن عناصر، میتوانید از نسخه Generic آن که در System.Collections.Generic موجود است بهره ببرید.
کاربردهای حافظه های LIFO و FIFO
برای پیاده سازی راهکارهای مختلف میتوانید از این دو نوع حافظه بهره ببرید. به عنوان مثال برای بررسی درخواست های ارسالی مشتریان توسط یک کاربر بهترین ساختار Queue میباشد. بنابراین درخواست ها به ترتیب ارسال، و تقدم زمانی، بررسی میشوند. اگرچه با مرتب سازی درخواست ها بر اساس زمان ارسال یا ثبت آنها نیز میتوان به نتیجه مشابه دست یافت. ولی از بار کاری زیادی که مرتب سازی بر دوش سیستم خواهد گذاشت، مخصوصا وقتی درخواست ها بسیار زیاد باشند نباید غافل شوید.
در یک سیستم اتومایسون، برای مدیریت روال پیشرفت کار، وقتی اموری با اولوبت بالا پیش میآیند، Stack میتواند راهکار مناسبی باشد. در این صورت آخرین Task را میتوان در Stack قرار داد و به کار با اولویت بالا رسیدگی کرد. پس از پایان کار جاری، میتوان از Stack عنصر جاری را Pop کرد و آن کار را ادامه داد. همین روال در مدیریت Interrupt ها در CPU رخ میدهد.