موضوع مقاله: تست و ست | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # تست و ست | مقدمه: پیاده‌سازی سخت‌افزاری تست و سِت دستورالعمل‌های تست و سِت در DPRAM می‌تواند به شیوه‌های مختلفی پیاده‌سازی شود. | ## بخش 1: تست و ست | در اینجا دو حالت مختلف شرح داده می‌شود که در هر دو حالت یک DPRAM داریم که دو پورت را فراهم می‌کند و این امکان را می‌دهد که فقط دو قطعه الکترونیک مجزا، مانند دو واحد پردازش مرکزی (CPU)، به هر مکان حافظه در DPRAM دسترسی پیدا کنند. حالت اول زمانی که واحد پردازش مرکزی شماره یک (CPU1) دستورالعمل تست و سِت را آغاز می‌کند، DPRAM ابتدا آدرس مکان حافظه را در یک محل خاص ذخیره کرده و یک یادداشت داخلی برای آن ایجاد می‌کند. در این مرحله، CPU2 می‌تواند یک دستور تست و سِت آغاز کند که به‌احتمال زیاد موفقیت‌آمیز خواهد بود. حالت دوم در این حالت، CPU1 دستورالعمل تست و سِت را برای نوشتن در مکان حافظه A آغاز می‌کند. DPRAM بلافاصله مقدار موردنظر را در مکان حافظه A ذخیره نمی‌کند، بلکه به‌طور هم‌زمان مقدار کنونی را به یک رجیستر خاص منتقل کرده و محتویات محل حافظه A را به یک مقدار پرچم خاص سِت می‌کند. اگر در این لحظه، CPU2 دستور تست و سِت را برای محل حافظه A آغاز کند، DPRAM پرچم مذکور را شناسایی کرده و مشابه حالت اول، یک وقفه فعال ایجاد می‌کند. در غیر این صورت، DPRAM مقدار موردنظر را از رجیستر خاص مذکور به مکان حافظه A کپی می‌کند. حالا، اگر CPU1 دوباره یک دستور تست و سِت را آغاز کند، این بار به احتمال زیاد موفقیت‌آمیز خواهد بود. | ## بخش 2: تست و ست | پیاده‌سازی نرم‌افزاری تست و سِت برخی مجموعه‌های دستورالعمل مانند x86 و IBM System/360 (و مجموعه‌های دستورالعمل‌های بعدی، از جمله معماری z) دارای دستورالعمل زبان ماشین تست و سِت اتوماتیک هستند. مجموعه دستورالعمل‌هایی که فاقد دستور تست و سِت هستند، می‌توانند این عملیات را با استفاده از دستورالعمل‌های خواندن-تغییر-نوشتن یا دستورالعمل مقایسه-و-جابه‌جایی پیاده‌سازی کنند. دستور تست و سِت زمانی که با مقادیر بولین (Boolean) استفاده می‌شود، معمولاً از منطقی مشابه با آنچه که در تابع زیر نشان داده شده است، استفاده می‌کند. به این معنا که هیچ فرآیند دیگری نباید بتواند اجرای آن را در میانه کار متوقف کند. برای پیاده‌سازی این حالت به پشتیبانی سخت‌افزاری نیاز است و به‌طور مستقیم قابل پیاده‌سازی نیست. در اینجا، مقدار تست و سِت به‌صورت ثابت و بدون تغییر است، و این مقدار صرف‌نظر از نتیجه تست به‌روز می‌شود. در حالی که در پیاده‌سازی DPRAM، حافظه تنها زمانی سِت می‌شود که تست با موفقیت انجام شده باشد، و مقداری که باید سِت شود و شرایط آن توسط CPU مشخص می‌شود. در این پیاده‌سازی، مقدار موردنظر فقط می‌تواند یک باشد، اما اگر مقادیر صفر و یک تنها مقادیر معتبر برای مکان حافظه در نظر گرفته شوند و فقط تست «مقدار غیر صفر است» مجاز باشد، آنگاه این وضعیت معادل پیاده‌سازی سخت‌افزاری DPRAM خواهد بود. | ## بخش 3: تست و ست | این به این معناست که تأخیر در مقایسه مقدار در هر زمان، پس از دریافت مقدار تست، هیچ‌گونه تاثیری در نتیجه نخواهد داشت. انحصار متقابل با استفاده از تست و سِت یکی از روش‌های پیاده‌سازی انحصار متقابل، استفاده از یک قفل مبتنی بر تست و سِت است. توجه داشته باشید که از کلمه کلیدی volatile استفاده شده است تا به کامپایلر اعلام شود که این متغیر به‌طور مستقیم از حافظه خوانده و نوشته می‌شود و نباید در عملیات‌های بهینه‌سازی تغییر یابد. بدون این کلمه، کامپایلر ممکن است دسترسی به قفل را بهینه‌سازی کرده و خطا ایجاد کند. این تابع را می‌توان توسط پروسه‌های مختلفی فراخوانی کرد، با این حال، تضمین می‌شود که فقط یک پروسه در هر لحظه می‌تواند وارد بخش بحرانی شود. اگر پروسه‌ای هرگز نتواند به قفل دسترسی پیدا کند، ممکن است تا ابد در حلقه گرفتار شود. | ## جمع‌بندی | این مشکل یکی از ضعف‌های این نوع پیاده‌سازی است، زیرا در آن هیچ تضمینی برای انصاف (fairness) وجود ندارد.