در علوم کامپیوتر، شمارش ارجاع (به انگلیسی: Reference counting) یک فن برنامهنویسی است که در آن «تعداد» ارجاعها، اشارهگرها یا دستگیرهها برای یک منبع (مثل یک شیء، یک قطعهٔ حافظه، فضای دیسک، یا موارد دیگر) ذخیره میگردد.
در الگوریتمهای زبالهروبی از شمارش ارجاع میتوان استفاده کرد تا اشیایی را که دیگر به آنها نیازی نیست، را رهاسازی کرد.
استفاده در زباله روبی
مرجع شماری، به عنوان یک الگوریتم زباله روبی، تعداد مرجعهایی که یک شی برای اشیای دیگر نگهداری میکند را پیگیری میکند. اگر شماره مرجع یک شی صفر شود، آنگاه آن شی غیرقابل دسترس شده و نابود میشود.
هنگامی که یک شیء نابود میشود، شماره مرجع هر شیء که منبع شیء نابود شده باشد، کاهش مییابد. به همین دلیل حذف کردن یک منبع، میتواند به صورت پنهانی به آزاد شدن تعداد زیادی شیء منجر شود. یک تغییر رایج به مرجع شماری اجازه میدهد تا به صورت افزایشی عمل کند، به جای آنکه یک شیء را در زمانی که شماره مرجع آن صفر میشود، نابود کند یعنی در این حالت این شیء به لیست اشیاء بدون مرجع اضافه میشود و در زمان خاصی یک یا بیش از یک شیء از این لیست نابود میشود.
شمارههای مرجع ساده نیازمند به روز رسانی متداول هستند. هر زمان که یک مرجع نابود شده یا جایگزین میشود شماره مرجع آن شیء کم میشود، و همچنین در هر زمانی که یک مرجع ایجاد شده یا کپی میشود شماره مرجع آن شیء زیاد میشود.
همچنین مرجع شماری در سیستمهای عامل و سیستمهای توزیع شده، هر جا که دنبال کردن زباله روبی غیر افزایشی کامل، به دلیل اندازه گراف شیء و سرعت دستیابی پایین بسیار زمان بر باشد، استفاده میشود.
محاسن و معایب
مزیت اصلی مرجع شماری بر روش دنبال کردن زباله روبی، این است که اشیاء در زمانی که دیگر قابل مرجع شدن نیستند و در حالت افزایشی بدون توقفهای طولانی برای دورههای جمعآوری و با زمان تعریف شده کاملاً مشخص برای طول عمر هر شیء، اصلاح میشوند. در کاربردهای بلا درنگ و در سیستمهایی با حافظه محدود، حساسیت مهم است. مرجع شماری همچنین در میان سادهترین فرمهای زباله روبی از لحاظ اجرا شدن است. همچنین اجازه مدیریت مؤثر منابع بدون حافظه مانند اشیاء عملگر سیستم، که معمولاً از حافظه کمیاب تر هستند، را میدهد (سیستمهای دنبال گر GC، از تمام کنندهها برای این امر استفاده میکنند ولی این اصلاح با تأخیر ممکن است مشکلاتی را ایجاد کند). شمارش مرجع وزن دار یک راه حل خوب برای زباله روبی در یک سیستم گستردهاست.
دورههای زباله روبی دنبالکننده در صورتی راه اندازی میشوند که یک مجموعه از اشیاء زنده بیشتر حافظه قابل دسترس را پر کنند، این امر نیازمند حافظه اضافی است تا مؤثر واقع شود. عملکرد مرجع شماری در صورت کاهش کل فضای آزاد، بدتر نمیشود.
مرجع شماری در حالت ساده ۲ اشکال اصلی نسبت به زباله روبی دنبال کننده دارد، که هر کدام نیازمند مکانیزمهای اضافی برای بهبودشان هستند:
- به روز رسانیهای متداول، یک منبع نا کارآمدی هستند.
- الگوریتم سادهٔ مورد استفاده در مرجع شماری، قابلیت کنترل دورههای مرجع را ندارد.
تفسیر نموداری (گرافی)
به هنگام سر و کار داشتن با برنامههای زباله روبی، مفید است که دربارهٔ گراف مرجع بیندیشیم که یک گراف جهتداری است که رئوس آن اشیاء هستند و یک یال از شیء A به شیء B وجود دارد اگر A مرجعی از B را نگه دارد. همچنین ما یک راس یا رئوس خاصی داریم که نشان دهنده متغیرهای محلی و مراجع محلی هستند که به وسیله سیستم زمان اجرا نگهداری میشوند و هیچگاه هیچ یالی به این گرهها نمیروند، هر چند یالها میتوانند به وسیله آنها به گرههای دیگر بروند.
مثالهایی از کاربرد این الگوریتم
چار چوب Cocoa در Apple از مرجع شماری دستی که بسیار شبیه COM است استفاده میکنند. هر چند در Mac OS v10.5، Cocoa زباله روبی اتوماتیک دارد.
PHP از یک مکانیزم مرجع شماری برای مدیریت متغیر داخلی اش استفاده میکند. PHP به شما این اجازه را میدهد که به وسیله عملگرهای کاربر دوره جمعآوری را روشن و خاموش نماید. همچنین به شما این اجازه را میدهد تا به صورت دستی مکانیزم پاکسازی را اجرا کنید.
Python نیز همچنین از مرجع شماری استفاده میکند و امکان ردیابی دوره را میدهد.
منابع
- ویکیپدیای انگلیسی. /wiki/%D9%88%DB%8C%DA%A9%DB%8C%E2%80%8C%D9%BE%D8%AF%DB%8C%D8%A7:Reference_counting