Foundationপ্রথম নীতি থেকে
LEVEL 4 · Operating Systems

Spinlock

স্পিনলক

এমন lock যা অপেক্ষার সময় ঘুমায় না — একটা loop-এ atomic operation চালিয়ে যায়। Critical section context switch-এর চেয়ে ছোট হলেই কেবল যুক্তিসঙ্গত।

also: busy wait

void lock(atomic_flag *l) {
    while (atomic_flag_test_and_set_explicit(l, memory_order_acquire))
        __builtin_ia32_pause();        /* PAUSE — CPU-কে ইঙ্গিত */
}

কখন spinlock জেতে: wait-এর প্রত্যাশিত সময় < context switch-এর খরচ (~১–১০ μs)। অর্থাৎ critical section কয়েক ডজন instruction-এর বেশি নয়।

Userspace-এ এটা প্রায় কখনোই সত্য নয় — কারণ scheduler যেকোনো মুহূর্তে lock-ধারী thread-কে preempt করতে পারে, আর তখন spinner পুরো quantum ধরে অর্থহীনভাবে CPU পোড়ায়।

Kernel-এ ভিন্ন গল্প — সেখানে preemption বন্ধ করে spinlock নেওয়া যায়, তাই holder নিশ্চিতভাবে দ্রুত ছাড়বে। এজন্যই Linux kernel-এ spinlock সর্বত্র, কিন্তু glibc-তে নেই।

PAUSE instruction গুরুত্বপূর্ণ — এটা CPU-কে বলে “আমি spin করছি”, যাতে memory order violation-এর pipeline flush এড়ানো যায় আর hyperthread sibling বেশি resource পায়।

বাস্তব সমাধান — adaptive mutex: কিছুক্ষণ spin করো, তারপর ঘুমাও। glibc-র PTHREAD_MUTEX_ADAPTIVE_NP আর Java-র biased/ adaptive locking এটাই করে।