# செமாஃபோர் (நிரலாக்கம்)

## முன்னுரை

கீழ்க்கண்ட செய்முறைகளைப் பயன்படுத்தி மட்டுமே சேமாஃபோரை அணுக முடியும். கீழே விளக்கப்பட்டிருக்கும் காரணங்களுக்காக அட்டாமிக்காக (atomic) குறிக்கப்பட்டிருப்பவை இடைமறிக்கப்படக் கூடாது, அதாவது இந்த புரோகிராமைச் செய்வதற்கு இது செயல்பட்டுக் கொண்டிருக்க வேண்டும் என்று அமைப்பு முடிவு செய்திருந்தால், அந்த செயல்முறைக்கு இடையில் அது இடைமறிக்கப்படக்கூடாது.  
<source lang="pascal">
procedure V (S : Semaphore);
begin
(சேமாஃபோர் விவாதத்தின் மதிப்பில் ஒன்றை அதிகரிக்கிறது;
இந்த அதிகரிப்பு ஒரு மாற்ற முடியாத செயல்முறையாக ஆகும், அதாவது அட்டாமிக் ஆகும்.*)
S := S + 1;
end;  
procedure P (S : Semaphore);
begin
(*சேமாஃபோர் அதன் மதிப்பில் ஒன்றைக் குறைக்கிறது
இறுதி மதிப்பு எதிர்மறையாக இல்லாத வகையில், உடனடியாக இவ்வாறு குறைத்துவிடுகிறது. இந்த ெயல்முறையும் ஒரு மாற்ற முடியாத செயல்முறையாக ஆகும், அதாவது அட்டாமிக் ஆகும். *)
repeat
Wait;
until S > 0;
S := S - 1;
end;
</source>  
மாறுபடும் S இன் அதிகரிப்பு இடைமறிக்கப்படக் கூடாது என்பதையும், S என்பது பூஜ்ஜியத்தை விட அதிகமாக இருந்தால், P செயல்முறையும் இடைமறிக்கப்படக் கூடாது என்பதையும் கவனிக்கவும். பிற செயல்முறைகள் செயல்பாட்டிற்கு வருவதைத் தடுக்க டெஸ்ட்-அண்ட்-செட் (ஆர்க்கிடெக்சரின் நெறிமுறைக் கட்டளைத் தொகுப்பு இதற்கு ஏற்றதாக இருந்தால் மட்டும்) அல்லது (யூனிபுரோசஸர் அமைப்புகளில்) இடைமறிப்புகளைத் (interrupts) தவிர்ப்பது போன்ற சிறப்புக் குறிப்புகளைப் பயன்படுத்தி இதைச் செய்யலாம்.  
செயல்பாட்டில் இல்லாத ஆதாரங்களின் எண்ணிக்கையே சேமாஃபோரின் எண்ணிக்கை மதிப்பாகும். (ஒரேயொரு ஆதாரம் மட்டும் இருந்தால், 0 அல்லது 1 என்ற மதிப்புகளுடன் ஒரு "பைனரி சேமாஃபோர்" பயன்படுத்தப்படுகிறது) ஓர் ஆதாரம் கிடைக்கும் வரை <code>P</code> செயல்பாடு உறக்கநிலையில் (அதாவது தன்னுடைய முறையைக் கொண்டு வரவேண்டாம் என்று அமைப்பிற்குச் சொல்லிவிடும்) இருக்கும் அல்லது நெருக்கடி-காத்திருப்பு (எதையும் செய்யாமல் அதன் முறை வரும் வரை காத்திருக்கும்) நிலையில் இருந்து உடனடியாக ஓர் ஆதாரத்தைக் கோரும். <code>V</code> செயல்பாடு இதற்குத் தலைகீழானாது; ஒரு செயல்பாடு ஆதாரத்தைப் பயன்படுத்தி முடித்த உடனேயே இது அந்த ஆதாரம் கிடைத்திருப்பதை எடுத்துக்காட்டும். இந்த <code>P</code> மற்றும் <code>V</code> செயல்பாடுகள் அட்டாமிக் ஆனவை, அதாவது இந்தச் செயல்பாடுகளில் ஏதாவதொன்றின் போது அதே சேமிப்போரில் வேறு நடவடிக்கைகளைச் செயல்படுத்த எந்தச் செயல்முறையும் இடையில் குறுக்கிட முடியாது.  
அடிப்படை பெயர்களான <code>P</code> மற்றும் <code>V</code> ஆகியவை டச் வார்த்தைகளின் துவக்க எழுத்தில் இருந்து வருகின்றன. <code>V</code> என்பது *வெர்ஹோஜென்* (verhogen), அல்லது "அதிகரிப்பு" என்பதாகும். <code>P</code> என்பதற்கு ("பரிசோதிப்பதற்கான" என்பதற்கான *புரோபெரென்*, "அனுப்பு" என்பதற்கான *பஸ்ஸீர்*, "முயற்சி செய்" என்பதற்கான *ப்ரோபீர்* மற்றும் "பறி" என்பதற்கான *பேக்கென்* உட்பட) பல்வேறு விளங்கங்கள் அளிக்கப்படுகின்றன, ஆனால் உண்மையில் டிஜிக்ட்ஸ்ரா, கருத்தளவில் "குறைப்பதற்கு முயற்சி செய்" என்ற பொருளில் அல்லது "சரிவுக்குக் கொண்டு வர முயற்சி செய்" என்ற வேறு சொல்லுக்கு இணையாக வரும் *probeer te verlagen* என்பதன் சுருக்கமான *புரோலேங்க்* என்ற சொல்லுக்காக *P* என்பதை தாம் எடுத்தாண்டதாக எழுதினார்.*அதிகரிப்பது*, *குறைப்பது* இரண்டுமே டச் மொழியில் *V* என்ற எழுத்தில் தொடங்குவதால் குழப்பம் ஆரம்பித்துவிடுகிறது, அதேசமயம் அந்த வார்த்தையை முழுவதுமாக உச்சரிப்பதும் டச் மொழி தெரியாதவர்களுக்குச் சாத்தியப்படாத வகையில் குழப்பக்கூடும்.  
புரோகிராமிங் மொழியான ALGOL 68 லும், லினக்ஸ் கெர்னலிலும் மற்றும் சில ஆங்கில பாடப்புத்தகங்களிலும், <code>P</code> மற்றும் <code>V</code> செயல்பாடுகள் முறையே <code>கீழ்</code> மற்றும் <code>மேல்</code> என்று அழைக்கப்படுகின்றன. மென்பொருள் பொறியியல் பயிற்சியில், பொதுவாக இவை <code>காத்திரு</code> மற்றும் <code>சமிக்கை</code> அல்லது <code>பெறு</code> மற்றும் <code>விடு</code> (இதை நிலையான ஜாவா லைப்ரரி பயன்படுத்துகிறது)) அல்லது <code>தேங்கு</code> மற்றும் <code>அனுப்பு</code> என்று அழைக்கப்படுகிறது. உண்மையான டச் எழுத்துகளுக்குப் பொருந்தி வரும் வகையில், சில புத்தகங்கள் <code>வாங்கு</code> மற்றும் <code>வெளியேறு</code> என்று அவற்றைக் குறிப்பிடுகின்றன.  
நெருக்கடி-காத்திருப்பைத் தவிர்க்க, சேமாஃபோர் செயல்பாடுகளின் ஒரு இணைப்பு வரிசையைக் (வழக்கமாக முதலில் வருபவர் முதலில் செல்லலாம் என்ற பாணியில்) கொண்டிருக்கக் கூடும். பூஜ்ஜியம் மதிப்பைக் கொண்டிருக்கும் சேமாஃபோரில் ஒரு செயல்முறை <code>P</code> நடவடிக்கையைச் செய்கிறது என்றால், அந்தச் செயல்பாடு சேமாஃபோரின் வரிசையில் சேர்க்கப்படும். மற்றொரு செயல்பாடு <code>V</code> நடவடிக்கையைச் செய்து சேமாஃபோரை அதிகரிக்கும் போது, ஏற்கனவே அங்கு வரிசையில் செயல்பாடுகள் இருப்பதால், அவற்றில் ஒன்று வரிசையில் இருந்து நீக்கப்பட்டு செயல்படுத்தப்படும். செயல்பாடுகளுக்கு வெவ்வேறு முன்னுரிமைகள் இருக்குமானால், முன்னுரிமையின் அடிப்படையில் வரிசையில் அடுக்கப்படும், இதனால் அதிக முக்கியமான முன்னுரிமையில் இருக்கும் செயல்பாடு முதலில் வரிசையில் இருந்து எடுத்துக் கையாளப்படும்.