ஒத்திசைவு கட்டுப்பாட்டில் உலகளாவிய டெவலப்பர்களுக்கான ஒரு விரிவான வழிகாட்டி. பூட்டு அடிப்படையிலான ஒத்திசைவு, மியூடெக்ஸ், செமாஃபோர்கள், முட்டுக்கட்டைகள் மற்றும் சிறந்த நடைமுறைகளை ஆராயுங்கள்.
ஒத்திசைவு தேர்ச்சி: பூட்டு அடிப்படையிலான ஒத்திசைவுக்குள் ஆழமான ஒரு மூழ்கல்
ஒரு பரபரப்பான தொழில்முறை சமையலறையை கற்பனை செய்து பாருங்கள். பல சமையல்காரர்கள் ஒரே நேரத்தில் வேலை செய்கிறார்கள், அவர்கள் அனைவரும் பொருட்களின் பகிரப்பட்ட சரக்கறைக்கு அணுகல் வேண்டும். இரண்டு சமையல்காரர்கள் ஒரே சரியான தருணத்தில் ஒரு அரிய மசாலாவின் கடைசி ஜாடியைப் பிடிக்க முயற்சித்தால், யாருக்கு அது கிடைக்கும்? ஒரு சமையல்காரர் ஒரு செய்முறை அட்டையைப் புதுப்பிக்கும்போது மற்றொருவர் அதைப் படித்து, பாதி எழுதப்பட்ட, அர்த்தமற்ற அறிவுறுத்தலுக்கு வழிவகுத்தால் என்ன செய்வது? இந்த சமையலறை குழப்பம் நவீன மென்பொருள் உருவாக்கத்தில் மைய சவாலுக்கு ஒரு சரியான ஒப்புமை: ஒத்திசைவு.
மல்டி-கோர் செயலிகள், விநியோகிக்கப்பட்ட அமைப்புகள் மற்றும் அதிக பதிலளிக்கக்கூடிய பயன்பாடுகள் நிறைந்த இன்றைய உலகில், ஒத்திசைவு - ஒரு நிரலின் வெவ்வேறு பகுதிகள் இறுதி முடிவை பாதிக்காமல் வரிசைக்கு வெளியே அல்லது பகுதி வரிசையில் செயல்படும் திறன் - ஒரு ஆடம்பரம் அல்ல; இது ஒரு அவசியம். வேகமான வலை சேவையகங்கள், மென்மையான பயனர் இடைமுகங்கள் மற்றும் சக்திவாய்ந்த தரவு செயலாக்க குழாய்களுக்குப் பின்னால் இருப்பது இதுதான். இருப்பினும், இந்த சக்தி குறிப்பிடத்தக்க சிக்கலுடன் வருகிறது. பல நூல்கள் அல்லது செயல்முறைகள் ஒரே நேரத்தில் பகிரப்பட்ட ஆதாரங்களை அணுகும்போது, அவை ஒருவருக்கொருவர் குறுக்கிடக்கூடும், இது சிதைந்த தரவு, கணிக்க முடியாத நடத்தை மற்றும் முக்கியமான கணினி செயலிழப்புகளுக்கு வழிவகுக்கும். இங்கேதான் ஒத்திசைவு கட்டுப்பாடு செயல்படுகிறது.
இந்த விரிவான வழிகாட்டி, இந்தக் கட்டுப்படுத்தப்பட்ட குழப்பத்தை நிர்வகிப்பதற்கான மிக அடிப்படையான மற்றும் பரவலாகப் பயன்படுத்தப்படும் நுட்பத்தை ஆராயும்: பூட்டு அடிப்படையிலான ஒத்திசைவு. பூட்டுகள் என்றால் என்ன என்பதை நாங்கள் தெளிவுபடுத்துவோம், அவற்றின் பல்வேறு வடிவங்களை ஆராய்வோம், அவற்றின் ஆபத்தான ஆபத்துக்களைச் சமாளிப்போம், மேலும் வலுவான, பாதுகாப்பான மற்றும் திறமையான ஒத்திசைவான குறியீட்டை எழுதுவதற்கான உலகளாவிய சிறந்த நடைமுறைகளின் தொகுப்பை நிறுவுவோம்.
ஒத்திசைவு கட்டுப்பாடு என்றால் என்ன?
அதன் மையத்தில், ஒத்திசைவு கட்டுப்பாடு என்பது கணினி அறிவியலுக்குள் பகிரப்பட்ட தரவில் ஒரே நேரத்தில் செயல்பாடுகளை நிர்வகிப்பதற்கான ஒரு ஒழுக்கம் ஆகும். அதன் முதன்மை நோக்கம் என்னவென்றால், தரவு ஒருமைப்பாடு மற்றும் நிலைத்தன்மையைப் பாதுகாத்து, ஒரே நேரத்தில் செயல்பாடுகள் ஒருவருக்கொருவர் குறுக்கிடாமல் சரியாகச் செயல்படுவதை உறுதி செய்வதாகும். கசிவுகள், கலவைகள் மற்றும் வீணான பொருட்களைத் தடுக்க சமையல்காரர்கள் சரக்கறையை எவ்வாறு அணுகலாம் என்பதற்கான விதிகளை அமைக்கும் சமையலறை மேலாளராக இதைப் பற்றி சிந்தியுங்கள்.
தரவுத்தளங்களின் உலகில், ACID பண்புகளை (அணுத்தன்மை, நிலைத்தன்மை, தனிமைப்படுத்தல், நீடித்து நிலைத்தல்), குறிப்பாக தனிமைப்படுத்தல் ஆகியவற்றை பராமரிக்க ஒத்திசைவு கட்டுப்பாடு அவசியம். பரிவர்த்தனைகளின் ஒரே நேரத்தில் செயல்படுத்தல், பரிவர்த்தனைகள் தொடர்ச்சியாக, ஒன்றன்பின் ஒன்றாக செயல்படுத்தப்பட்டால் பெறக்கூடிய கணினி நிலைக்கு வழிவகுப்பதை தனிமைப்படுத்தல் உறுதி செய்கிறது.
ஒத்திசைவு கட்டுப்பாட்டை செயல்படுத்த இரண்டு முதன்மை தத்துவங்கள் உள்ளன:
- ஆశాवादी ஒத்திசைவு கட்டுப்பாடு: இந்த அணுகுமுறை மோதல்கள் அரிதானவை என்று கருதுகிறது. இது எந்தவிதமான முன்பக்க சோதனைகளும் இல்லாமல் செயல்பாடுகளைத் தொடர அனுமதிக்கிறது. ஒரு மாற்றத்தைச் செய்வதற்கு முன், கணினி மற்றொரு செயல்பாடு இடைப்பட்ட நேரத்தில் தரவை மாற்றியுள்ளதா என்பதைச் சரிபார்க்கிறது. ஒரு மோதல் கண்டறியப்பட்டால், செயல்பாடு பொதுவாக உருட்டப்பட்டு மீண்டும் முயற்சிக்கப்படுகிறது. இது ஒரு "மன்னிப்பு கேளுங்கள், அனுமதி கேட்க வேண்டாம்" உத்தி.
- அசாதார்ப ஒத்திசைவு கட்டுப்பாடு: இந்த அணுகுமுறை மோதல்கள் ஏற்பட வாய்ப்புள்ளது என்று கருதுகிறது. இது ஒரு செயல்பாடு ஒரு வளத்தை அணுகுவதற்கு முன்பு ஒரு பூட்டைப் பெறும்படி கட்டாயப்படுத்துகிறது, மற்ற செயல்பாடுகள் குறுக்கிடுவதைத் தடுக்கிறது. இது ஒரு "அனுமதி கேளுங்கள், மன்னிப்பு கேட்க வேண்டாம்" உத்தி.
இந்த கட்டுரை பூட்டு அடிப்படையிலான ஒத்திசைவின் அடித்தளமான எதிர்மறை அணுகுமுறையில் பிரத்தியேகமாக கவனம் செலுத்துகிறது.
மைய பிரச்சனை: பந்தய நிலைகள்
தீர்வை நாங்கள் பாராட்ட முடியும் முன், நாங்கள் பிரச்சினையை முழுமையாக புரிந்து கொள்ள வேண்டும். ஒரே நேரத்தில் நிரலாக்கத்தில் மிகவும் பொதுவான மற்றும் கபடமான பிழை பந்தய நிலை ஆகும். ஒரு அமைப்பின் நடத்தை கட்டுப்பாடற்ற நிகழ்வுகளின் கணிக்க முடியாத வரிசை அல்லது நேரத்தைப் பொறுத்து இருக்கும்போது ஒரு பந்தய நிலை ஏற்படுகிறது, அதாவது இயக்க முறைமையால் நூல்களை திட்டமிடுதல் போன்றவை.
கிளாசிக் உதாரணத்தைக் கருத்தில் கொள்வோம்: பகிரப்பட்ட வங்கிக் கணக்கு. ஒரு கணக்கில் $1000 இருப்பு இருப்பதாக வைத்துக்கொள்வோம், மேலும் இரண்டு ஒரே நேரத்தில் நூல்கள் ஒவ்வொன்றும் $100 டெபாசிட் செய்ய முயற்சிக்கின்றன.
ஒரு டெபாசிட்டிற்கான செயல்பாடுகளின் எளிமைப்படுத்தப்பட்ட வரிசை இங்கே:
- நினைவகத்திலிருந்து தற்போதைய இருப்பைப் படிக்கவும்.
- இந்த மதிப்பில் டெபாசிட் தொகையைச் சேர்க்கவும்.
- புதிய மதிப்பை மீண்டும் நினைவகத்தில் எழுதவும்.
ஒரு சரியான, தொடர்ச்சியான மரணதண்டனை $1200 இறுதி இருப்பில் விளைவிக்கும். ஆனால் ஒரே நேரத்தில் சூழ்நிலையில் என்ன நடக்கும்?
செயல்பாடுகளின் சாத்தியமான இடைமறிப்பு:
- நூல் A: இருப்பைப் படிக்கிறது ($1000).
- சூழல் சுவிட்ச்: இயக்க முறைமை நூல் A ஐ நிறுத்தி நூல் B ஐ இயக்குகிறது.
- நூல் B: இருப்பைப் படிக்கிறது (இன்னும் $1000).
- நூல் B: அதன் புதிய இருப்பைக் கணக்கிடுகிறது ($1000 + $100 = $1100).
- நூல் B: புதிய இருப்பை ($1100) மீண்டும் நினைவகத்தில் எழுதுகிறது.
- சூழல் சுவிட்ச்: இயக்க முறைமை நூல் A ஐ மீண்டும் தொடங்குகிறது.
- நூல் A: முன்பு படித்த மதிப்பின் அடிப்படையில் அதன் புதிய இருப்பைக் கணக்கிடுகிறது ($1000 + $100 = $1100).
- நூல் A: புதிய இருப்பை ($1100) மீண்டும் நினைவகத்தில் எழுதுகிறது.
இறுதி இருப்பு $1100, எதிர்பார்க்கப்பட்ட $1200 அல்ல. பந்தய நிலை காரணமாக $100 டெபாசிட் காற்றில் கரைந்துவிட்டது. பகிரப்பட்ட ஆதாரம் (கணக்கு இருப்பு) அணுகப்படும் குறியீட்டின் தொகுதி முக்கிய பிரிவு என்று அழைக்கப்படுகிறது. பந்தய நிலைகளைத் தடுக்க, எந்த நேரத்திலும் ஒரு நூல் மட்டுமே முக்கியமான பிரிவுக்குள் செயல்படுத்த முடியும் என்பதை உறுதிப்படுத்த வேண்டும். இந்த கொள்கை பரஸ்பர விலக்கல் என்று அழைக்கப்படுகிறது.
பூட்டு அடிப்படையிலான ஒத்திசைவை அறிமுகப்படுத்துதல்
பரஸ்பர விலக்கலை செயல்படுத்துவதற்கான முதன்மை வழிமுறை பூட்டு அடிப்படையிலான ஒத்திசைவு ஆகும். ஒரு பூட்டு (மியூடெக்ஸ் என்றும் அழைக்கப்படுகிறது) என்பது ஒரு முக்கியமான பிரிவுக்கு ஒரு காவலராக செயல்படும் ஒரு ஒத்திசைவு பழமையானது.
ஒற்றை ஆக்கிரமிப்பு கழிப்பறைக்கு ஒரு சாவி என்ற ஒப்புமை மிகவும் பொருத்தமானது. கழிப்பறை என்பது முக்கியமான பிரிவு, மற்றும் சாவி பூட்டு. பலர் (நூல்கள்) வெளியே காத்திருக்கலாம், ஆனால் சாவியை வைத்திருக்கும் நபர் மட்டுமே நுழைய முடியும். அவர்கள் முடித்ததும், அவர்கள் வெளியேறி சாவியைத் திருப்பித் தருகிறார்கள், வரிசையில் இருக்கும் அடுத்த நபர் அதை எடுத்து உள்ளே செல்ல அனுமதிக்கிறது.
பூட்டுகள் இரண்டு அடிப்படை செயல்பாடுகளை ஆதரிக்கின்றன:
- பெறு (அல்லது பூட்டு): ஒரு நூல் ஒரு முக்கியமான பிரிவுக்குள் நுழைவதற்கு முன்பு இந்த செயல்பாட்டை அழைக்கிறது. பூட்டு கிடைத்தால், நூல் அதைப் பெற்று தொடர்கிறது. பூட்டு ஏற்கனவே மற்றொரு நூலால் வைக்கப்பட்டிருந்தால், அழைக்கும் நூல் பூட்டு விடுவிக்கப்படும் வரை தடுக்கும் (அல்லது "தூங்கும்").
- வெளியேறு (அல்லது திற): ஒரு நூல் முக்கியமான பிரிவைச் செயல்படுத்துவதை முடித்த பிறகு இந்த செயல்பாட்டை அழைக்கிறது. இது மற்ற காத்திருக்கும் நூல்கள் பெறுவதற்கு பூட்டை கிடைக்கிறது.
எங்கள் வங்கிக் கணக்கு தர்க்கத்தை ஒரு பூட்டுடன் இணைப்பதன் மூலம், அதன் சரியான தன்மையை நாங்கள் உத்தரவாதம் அளிக்க முடியும்:
acquire_lock(account_lock);
// --- முக்கியமான பிரிவு தொடக்கம் ---
balance = read_balance();
new_balance = balance + amount;
write_balance(new_balance);
// --- முக்கியமான பிரிவு முடிவு ---
release_lock(account_lock);
இப்போது, நூல் A முதலில் பூட்டைப் பெற்றால், நூல் A மூன்று படிகள் அனைத்தையும் முடித்து பூட்டை விடுவிக்கும் வரை நூல் B காத்திருக்க வேண்டிய கட்டாயம் ஏற்படும். செயல்பாடுகள் இனி இடைமறிக்கப்படாது, மேலும் பந்தய நிலை அகற்றப்படும்.
பூட்டுகளின் வகைகள்: நிரலாளரின் கருவித்தொகுப்பு
ஒரு பூட்டின் அடிப்படை கருத்து எளிமையானது என்றாலும், வெவ்வேறு காட்சிகள் வெவ்வேறு வகையான பூட்டுதல் வழிமுறைகளை கோருகின்றன. கிடைக்கக்கூடிய பூட்டுகளின் கருவித்தொகுப்பைப் புரிந்துகொள்வது திறமையான மற்றும் சரியான ஒரே நேரத்தில் அமைப்புகளை உருவாக்குவதற்கு முக்கியமானது.
மியூடெக்ஸ் (பரஸ்பர விலக்கல்) பூட்டுகள்
மியூடெக்ஸ் என்பது எளிமையான மற்றும் பொதுவான வகை பூட்டு. இது ஒரு பைனரி பூட்டு, அதாவது இது இரண்டு நிலைகளை மட்டுமே கொண்டுள்ளது: பூட்டப்பட்டது அல்லது திறக்கப்பட்டது. இது கடுமையான பரஸ்பர விலக்கலை செயல்படுத்துவதற்காக வடிவமைக்கப்பட்டுள்ளது, எந்த நேரத்திலும் ஒரு நூல் மட்டுமே பூட்டை வைத்திருக்க முடியும் என்பதை உறுதி செய்கிறது.
- உரிமை: பெரும்பாலான மியூடெக்ஸ் செயலாக்கங்களின் முக்கிய பண்பு உரிமை ஆகும். மியூடெக்ஸைப் பெறும் நூல் அதை விடுவிக்க அனுமதிக்கப்படும் ஒரே நூல் ஆகும். ஒரு நூல் மற்றொரு நூல் பயன்படுத்தும் ஒரு முக்கியமான பிரிவை கவனக்குறைவாக (அல்லது தீங்கிழைக்கும் வகையில்) திறப்பதைத் தடுக்கிறது.
- பயன்பாட்டு வழக்கு: பகிரப்பட்ட மாறி ஒன்றைப் புதுப்பிப்பது அல்லது தரவு கட்டமைப்பை மாற்றுவது போன்ற குறுகிய, எளிய முக்கியமான பிரிவுகளைப் பாதுகாப்பதற்கான இயல்புநிலை தேர்வு மியூடெக்ஸ் ஆகும்.
செமாஃபோர்கள்
செமாஃபோர் என்பது டச்சு கணினி விஞ்ஞானி எட்ஸ்கர் டபிள்யூ. டிஜ்க்ஸ்ட்ராவால் கண்டுபிடிக்கப்பட்ட மிகவும் பொதுவான ஒத்திசைவு பழமையானது. மியூடெக்ஸைப் போலன்றி, செமாஃபோர் எதிர்மறையற்ற முழு எண் மதிப்பைக் கொண்டுள்ளது.
இது இரண்டு அணு செயல்பாடுகளை ஆதரிக்கிறது:
- wait() (அல்லது P செயல்பாடு): செமாஃபோரின் எண்ணைக் குறைக்கிறது. எண்ணிக்கை எதிர்மறையாக மாறினால், எண்ணிக்கை பூஜ்ஜியத்திற்கு சமமாக அல்லது அதிகமாக இருக்கும் வரை நூல் தடுக்கிறது.
- signal() (அல்லது V செயல்பாடு): செமாஃபோரின் எண்ணிக்கையை அதிகரிக்கிறது. செமாஃபோரில் எந்த நூல்கள் தடுக்கப்பட்டிருந்தால், அவற்றில் ஒன்று திறக்கப்படுகிறது.
செமாஃபோர்களின் இரண்டு முக்கிய வகைகள் உள்ளன:
- பைனரி செமாஃபோர்: எண்ணிக்கை 1 ஆக தொடங்கப்பட்டது. இது 0 அல்லது 1 ஆக மட்டுமே இருக்க முடியும், இது ஒரு மியூடெக்ஸுக்கு செயல்பாட்டுக்கு சமம்.
- எண்ணும் செமாஃபோர்: எண்ணிக்கை எந்த முழு எண் N > 1 ஆகவும் தொடங்கப்படலாம். இது N நூல்கள் வரை ஒரு வளத்தை ஒரே நேரத்தில் அணுக அனுமதிக்கிறது. இது ஒரு வரையறுக்கப்பட்ட ஆதாரங்களின் குளத்திற்கான அணுகலைக் கட்டுப்படுத்த பயன்படுகிறது.
உதாரணம்: அதிகபட்சம் 10 ஒரே நேரத்தில் தரவுத்தள இணைப்புகளை கையாளக்கூடிய ஒரு இணைப்பு குளத்துடன் ஒரு வலை பயன்பாட்டை கற்பனை செய்து பாருங்கள். 10 ஆக தொடங்கப்பட்ட ஒரு எண்ணும் செமாஃபோர் இதை முழுமையாக நிர்வகிக்க முடியும். ஒவ்வொரு நூலும் ஒரு இணைப்பை எடுப்பதற்கு முன்பு செமாஃபோரில் `wait()` செய்ய வேண்டும். 11 வது நூல் முதல் 10 நூல்களில் ஒன்று அதன் தரவுத்தள வேலையை முடித்து, செமாஃபோரில் `signal()` ஐச் செய்து, குளத்திற்கு இணைப்பை திருப்பித் தரும் வரை தடுக்கும்.
படிக்க-எழுத பூட்டுகள் (பகிரப்பட்ட/தனித்துவமான பூட்டுகள்)
ஒரே நேரத்தில் அமைப்புகளில் ஒரு பொதுவான முறை என்னவென்றால், தரவு எழுதப்படுவதை விட அடிக்கடி படிக்கப்படுகிறது. இந்த சூழ்நிலையில் ஒரு எளிய மியூடெக்ஸைப் பயன்படுத்துவது திறமையற்றது, ஏனெனில் இது பல நூல்கள் தரவைப் படிக்க ஒரே நேரத்தில் தடுக்கும், படித்தல் பாதுகாப்பான, மாற்றியமைக்காத செயல்பாடு என்றாலும்.
ஒரு படிக்க-எழுத பூட்டு இரண்டு பூட்டுதல் முறைகளை வழங்குவதன் மூலம் இதை உரையாற்றுகிறது:
- பகிரப்பட்ட (படிக்க) பூட்டு: எந்த நூலும் எழுத பூட்டை வைத்திருக்கும் வரை பல நூல்கள் ஒரே நேரத்தில் படிக்க பூட்டைப் பெறலாம். இது அதிக ஒரே நேரத்தில் வாசிப்பை அனுமதிக்கிறது.
- தனித்துவமான (எழுத) பூட்டு: ஒரு நேரத்தில் ஒரு நூல் மட்டுமே எழுத பூட்டைப் பெற முடியும். ஒரு நூல் எழுத பூட்டை வைத்திருக்கும்போது, மற்ற அனைத்து நூல்களும் (படிப்பவர்களும் எழுத்தாளர்களும்) தடுக்கப்படுகின்றன.
ஒப்புமை ஒரு பகிரப்பட்ட நூலகத்தில் உள்ள ஒரு ஆவணமாகும். பல நபர்கள் ஒரே நேரத்தில் ஆவணத்தின் பிரதியைப் படிக்கலாம் (பகிரப்பட்ட படிக்க பூட்டு). இருப்பினும், யாராவது ஆவணத்தைத் திருத்த விரும்பினால், அவர்கள் அதை பிரத்தியேகமாக சரிபார்க்க வேண்டும், மேலும் அவர்கள் முடிக்கும் வரை வேறு யாரும் படிக்கவோ அல்லது திருத்தவோ முடியாது (தனித்துவமான எழுத பூட்டு).
மறுசுழற்சி பூட்டுகள் (மீண்டும் நுழையக்கூடிய பூட்டுகள்)
ஏற்கனவே ஒரு மியூடெக்ஸை வைத்திருக்கும் ஒரு நூல் அதை மீண்டும் பெற முயற்சித்தால் என்ன நடக்கும்? ஒரு நிலையான மியூடெக்ஸுடன், இது ஒரு உடனடி முட்டுக்கட்டைக்கு வழிவகுக்கும்-நூல் பூட்டை விடுவிக்க என்றென்றும் காத்திருக்கும். ஒரு மறுசுழற்சி பூட்டு (அல்லது மீண்டும் நுழையக்கூடிய பூட்டு) இந்த சிக்கலை தீர்க்க வடிவமைக்கப்பட்டுள்ளது.
ஒரு மறுசுழற்சி பூட்டு அதே நூல் அதே பூட்டை பல முறை பெற அனுமதிக்கிறது. இது ஒரு உள் உரிமை எண்ணுயிரைப் பராமரிக்கிறது. சொந்தமான நூல் `acquire()` என்று அழைத்த அதே எண்ணிக்கையிலான முறை `release()` என்று அழைக்கும்போது பூட்டு முழுமையாக வெளியிடப்படும். இது அவர்களின் செயல்படுத்தலின் போது பகிரப்பட்ட ஆதாரத்தைப் பாதுகாக்க வேண்டிய மறுசுழற்சி செயல்பாடுகளில் குறிப்பாக பயனுள்ளதாக இருக்கும்.
பூட்டுதலின் ஆபத்துகள்: பொதுவான ஆபத்துகள்
பூட்டுகள் சக்திவாய்ந்ததாக இருக்கும்போது, அவை இரட்டை விளிம்பு வாள். பூட்டுகளின் முறையற்ற பயன்பாடு எளிய பந்தய நிலைகளை விட கண்டறிந்து சரிசெய்ய மிகவும் கடினமான பிழைகளுக்கு வழிவகுக்கும். இதில் முட்டுக்கட்டைகள், லைவ்லாக்குகள் மற்றும் செயல்திறன் குறுகிய கழுத்துகள் அடங்கும்.
முட்டுக்கட்டை
ஒரே நேரத்தில் நிரலாக்கத்தில் மிகவும் அஞ்சப்படும் சூழ்நிலை முட்டுக்கட்டை. இரண்டு அல்லது அதற்கு மேற்பட்ட நூல்கள் காலவரையின்றி தடுக்கப்படும்போது இது நிகழ்கிறது, ஒவ்வொன்றும் அதே தொகுப்பில் உள்ள மற்றொரு நூலால் வைத்திருக்கும் ஒரு ஆதாரத்திற்காக காத்திருக்கிறது.
இரண்டு நூல்கள் (நூல் 1, நூல் 2) மற்றும் இரண்டு பூட்டுகள் (பூட்டு A, பூட்டு B) கொண்ட ஒரு எளிய சூழ்நிலையை கருத்தில் கொள்வோம்:
- நூல் 1 பூட்டு A ஐப் பெறுகிறது.
- நூல் 2 பூட்டு B ஐப் பெறுகிறது.
- நூல் 1 இப்போது பூட்டு B ஐப் பெற முயற்சிக்கிறது, ஆனால் அது நூல் 2 ஆல் நடத்தப்படுகிறது, எனவே நூல் 1 தடுக்கிறது.
- நூல் 2 இப்போது பூட்டு A ஐப் பெற முயற்சிக்கிறது, ஆனால் அது நூல் 1 ஆல் நடத்தப்படுகிறது, எனவே நூல் 2 தடுக்கிறது.
இரண்டு நூல்களும் இப்போது ஒரு நிரந்தர காத்திருப்பு நிலையில் சிக்கியுள்ளன. பயன்பாடு நின்றுவிடுகிறது. இந்த நிலை நான்கு தேவையான நிபந்தனைகளின் இருப்பு காரணமாக எழுகிறது (காஃப்மேன் நிபந்தனைகள்):
- பரஸ்பர விலக்கல்: ஆதாரங்களை (பூட்டுகள்) பகிர முடியாது.
- பிடித்து காத்திரு: மற்றொருவருக்கு காத்திருக்கும்போது ஒரு நூல் குறைந்தது ஒரு ஆதாரத்தை வைத்திருக்கிறது.
- முன் தடுப்பு இல்லை: ஒரு நூல் வைத்திருக்கும் ஒரு ஆதாரத்தை கட்டாயமாக எடுக்க முடியாது.
- சுழற்சி காத்திரு: இரண்டு அல்லது அதற்கு மேற்பட்ட நூல்களின் சங்கிலி உள்ளது, அங்கு ஒவ்வொரு நூலும் சங்கிலியில் உள்ள அடுத்த நூலால் வைத்திருக்கும் ஒரு ஆதாரத்திற்காக காத்திருக்கிறது.
முட்டுக்கட்டையைத் தடுப்பது இந்த நிபந்தனைகளில் குறைந்தது ஒன்றையாவது உடைப்பதை உள்ளடக்குகிறது. பூட்டு கையகப்படுத்துதலுக்கான கடுமையான உலகளாவிய வரிசையை செயல்படுத்துவதன் மூலம் சுழற்சி காத்திருப்பு நிலையை உடைப்பதே மிகவும் பொதுவான உத்தி.
லைவ்லாக்
லைவ்லாக் என்பது முட்டுக்கட்டையின் மிகவும் நுட்பமான உறவினர். லைவ்லாக்கில், நூல்கள் தடுக்கப்படவில்லை - அவை தீவிரமாக இயங்குகின்றன - ஆனால் அவை எந்த முன்னேற்றத்தையும் செய்யவில்லை. எந்த பயனுள்ள வேலையும் செய்யாமல் ஒருவருக்கொருவர் நிலை மாற்றங்களுக்கு பதிலளிக்கும் சுழற்சியில் அவர்கள் சிக்கியுள்ளனர்.
குறுகிய தாழ்வாரத்தில் ஒருவரையொருவர் கடக்க முயற்சிக்கும் இரண்டு நபர்களுக்கு கிளாசிக் ஒப்புமை. இருவரும் மரியாதையாக இருக்க முயற்சி செய்து அவர்களின் இடதுபுறம் செல்கிறார்கள், ஆனால் அவர்கள் ஒருவருக்கொருவர் தடுப்பதை முடிக்கிறார்கள். அவர்கள் இருவரும் தங்கள் வலதுபுறம் சென்று, மீண்டும் ஒருவருக்கொருவர் தடுக்கிறார்கள். அவர்கள் தீவிரமாக நகர்கிறார்கள், ஆனால் தாழ்வாரம் கீழே முன்னேறவில்லை. மென்பொருளில், இது மோசமாக வடிவமைக்கப்பட்ட முட்டுக்கட்டை மீட்பு வழிமுறைகளுடன் நடக்கக்கூடும், அங்கு நூல்கள் மீண்டும் மீண்டும் பின்வாங்கிக் கொள்கின்றன மற்றும் மீண்டும் முயற்சிக்கின்றன, மீண்டும் மீண்டும் முரண்படுகின்றன.
பஞ்சம்
ஒரு நூல் ஒரு தேவையான வளத்திற்கான அணுகல் மறுக்கப்படும்போது பஞ்சம் ஏற்படுகிறது, இருப்பினும் ஆதாரம் கிடைக்கும். "நியாயமான" திட்டமிடல் வழிமுறைகள் இல்லாத அமைப்புகளில் இது நிகழலாம். உதாரணமாக, ஒரு பூட்டுதல் வழிமுறை எப்போதும் உயர் முன்னுரிமை நூல்களுக்கு அணுகலை வழங்கினால், உயர் முன்னுரிமை போட்டியாளர்களின் நிலையான நீரோடை இருந்தால் குறைந்த முன்னுரிமை நூல் இயங்க ஒருபோதும் வாய்ப்பு கிடைக்காது.
செயல்திறன் மேல்நிலை
பூட்டுகள் இலவசம் அல்ல. அவை பல வழிகளில் செயல்திறன் மேல்நிலையை அறிமுகப்படுத்துகின்றன:
- கையகப்படுத்துதல்/வெளியேற்றும் செலவு: ஒரு பூட்டைப் பெறுதல் மற்றும் வெளியிடுவது அணு செயல்பாடுகள் மற்றும் நினைவக வேலிகளைக் கொண்டுள்ளது, அவை சாதாரண அறிவுறுத்தல்களை விட கணக்கீட்டு ரீதியாக அதிக விலை கொண்டவை.
- போட்டி: பல நூல்கள் ஒரே பூட்டுக்காக அடிக்கடி போட்டியிடும்போது, கணினி உற்பத்தி வேலையைச் செய்வதற்குப் பதிலாக சூழல் மாறுதல் மற்றும் திட்டமிடல் நூல்களில் கணிசமான நேரத்தை செலவிடுகிறது. அதிக போட்டி திறம்பட மரணதண்டனையை வரிசைப்படுத்துகிறது, இது இணைத்தன்மையின் நோக்கத்தை தோற்கடிக்கிறது.
பூட்டு அடிப்படையிலான ஒத்திசைவுக்கான சிறந்த நடைமுறைகள்
பூட்டுகளுடன் சரியான மற்றும் திறமையான ஒரே நேரத்தில் குறியீட்டை எழுதுவதற்கு ஒழுக்கம் மற்றும் சிறந்த நடைமுறைகளின் தொகுப்பிற்கு இணங்குதல் தேவைப்படுகிறது. இந்த கொள்கைகள் உலகளாவிய அளவில் பொருந்தும், நிரலாக்க மொழி அல்லது தளம் எதுவாக இருந்தாலும்.
1. முக்கியமான பிரிவுகளை சிறியதாக வைத்திருங்கள்
பூட்டு மிகக் குறுகிய காலத்திற்கு நடத்தப்பட வேண்டும். உங்கள் முக்கியமான பிரிவில் ஒரே நேரத்தில் அணுகலில் இருந்து பாதுகாக்கப்பட வேண்டிய குறியீடு மட்டுமே இருக்க வேண்டும். முக்கியமான அல்லாத எந்தவொரு செயல்பாடுகளும் (I/O போன்றவை, பகிரப்பட்ட நிலையை உள்ளடக்கிய சிக்கலான கணக்கீடுகள் அல்ல) பூட்டப்பட்ட பகுதிக்கு வெளியே செய்யப்பட வேண்டும். நீங்கள் பூட்டை வைத்திருக்கும் வரை, போட்டிக்கு அதிக வாய்ப்பு மற்றும் நீங்கள் மற்ற நூல்களை எவ்வளவு அதிகமாகத் தடுக்கிறீர்களோ அவ்வளவு நல்லது.
2. சரியான பூட்டு துகள் அளவை தேர்வு செய்யுங்கள்
பூட்டு துகள் அளவு என்பது ஒரு ஒற்றை பூட்டால் பாதுகாக்கப்படும் தரவுகளின் அளவைக் குறிக்கிறது.
- கரடுமுரடான பூட்டுதல்: ஒரு பெரிய தரவு கட்டமைப்பை அல்லது முழு துணை அமைப்பையும் பாதுகாக்க ஒரு ஒற்றை பூட்டைப் பயன்படுத்துதல். இது செயல்படுத்துவதற்கும் காரணத்திற்கும் எளிமையானது, ஆனால் உயர் போட்டிக்கு வழிவகுக்கும், ஏனெனில் தரவின் வெவ்வேறு பகுதிகளில் தொடர்பில்லாத செயல்பாடுகள் அனைத்தும் ஒரே பூட்டால் வரிசைப்படுத்தப்படுகின்றன.
- நன்கு தானியங்கி பூட்டுதல்: தரவு கட்டமைப்பின் வெவ்வேறு, சுயாதீன பகுதிகளைப் பாதுகாக்க பல பூட்டுகளைப் பயன்படுத்துதல். உதாரணமாக, ஒரு முழு ஹாஷ் அட்டவணைக்கான ஒரு பூட்டுக்கு பதிலாக, நீங்கள் ஒவ்வொரு பக்கெட்டிற்கும் ஒரு தனி பூட்டை வைத்திருக்கலாம். இது மிகவும் சிக்கலானது, ஆனால் அதிக உண்மையான இணையை அனுமதிப்பதன் மூலம் செயல்திறனை வியத்தகு முறையில் மேம்படுத்த முடியும்.
அவற்றுக்கு இடையேயான தேர்வு எளிமைக்கும் செயல்திறனுக்கும் இடையிலான வர்த்தகம் ஆகும். கரடுமுரடான பூட்டுகளுடன் தொடங்கி, செயல்திறன் சுயவிவரம் பூட்டு போட்டி ஒரு தடையாக இருப்பதைக் காட்டினால் மட்டுமே நன்றாக தானியங்கி பூட்டுகளுக்குச் செல்லுங்கள்.
3. எப்போதும் உங்கள் பூட்டுகளை விடுவிக்கவும்
பூட்டை வெளியிடத் தவறினால் ஒரு பேரழிவு தரும் பிழை, அது உங்கள் கணினியை நிறுத்திவிடும். ஒரு பொதுவான பிழை ஒரு விதிவிலக்கு அல்லது ஆரம்ப திரும்ப ஒரு முக்கியமான பிரிவுக்குள் நிகழும்போது. இதைத் தடுக்க, சுத்தம் செய்ய உத்தரவாதம் அளிக்கும் மொழி கட்டமைப்புகளை எப்போதும் பயன்படுத்தவும், அதாவது ஜாவா அல்லது C# இல் try...finally தொகுதிகள் அல்லது C++ இல் ஸ்கோப் செய்யப்பட்ட பூட்டுகளுடன் RAII (ஆதாரம் கையகப்படுத்தல் துவக்கம்) முறைகள்.
உதாரணம் (try-finally ஐப் பயன்படுத்தி போலி குறியீடு):
my_lock.acquire();
try {
// ஒரு விதிவிலக்கை எறியக்கூடிய முக்கியமான பிரிவு குறியீடு
} finally {
my_lock.release(); // இது செயல்படுத்த உத்தரவாதம்
}
4. கடுமையான பூட்டு வரிசையைப் பின்பற்றவும்
முட்டுக்கட்டைகளைத் தடுக்க, சுழற்சி காத்திருப்பு நிலையை உடைப்பதே மிகவும் பயனுள்ள உத்தி. பல பூட்டுகளைப் பெறுவதற்கான கடுமையான, உலகளாவிய மற்றும் தன்னிச்சையான வரிசையை நிறுவவும். ஒரு நூல் பூட்டு A மற்றும் பூட்டு B இரண்டையும் வைத்திருக்க வேண்டியிருந்தால், அது எப்போதும் பூட்டு B ஐப் பெறுவதற்கு முன்பு பூட்டு A ஐப் பெற வேண்டும். இந்த எளிய விதி சுழற்சி காத்திருப்புகளை சாத்தியமற்றதாக்குகிறது.
5. பூட்டுதலுக்கு மாற்றுகளைக் கருத்தில் கொள்ளுங்கள்
அடிப்படையான பூட்டுகள் ஒரே நேரத்தில் கட்டுப்பாட்டிற்கான ஒரே தீர்வு அல்ல. உயர் செயல்திறன் அமைப்புகளுக்கு, மேம்பட்ட நுட்பங்களை ஆராய்வது மதிப்பு:
- பூட்டு இல்லாத தரவு கட்டமைப்புகள்: இவை குறைந்த அளவிலான அணு வன்பொருள் அறிவுறுத்தல்களைப் பயன்படுத்தி வடிவமைக்கப்பட்ட அதிநவீன தரவு கட்டமைப்புகள் (ஒப்பீடு-மற்றும்-மாற்று போன்றவை), அவை பூட்டுகளைப் பயன்படுத்தாமல் ஒரே நேரத்தில் அணுக அனுமதிக்கின்றன. அவற்றை சரியாக செயல்படுத்துவது மிகவும் கடினம், ஆனால் அதிக போட்டியில் சிறந்த செயல்திறனை வழங்க முடியும்.
- மாற்ற முடியாத தரவு: தரவு உருவாக்கப்பட்ட பிறகு ஒருபோதும் மாற்றப்படாவிட்டால், எந்த ஒத்திசைவும் தேவையில்லாமல் நூல்களுக்கு இடையில் சுதந்திரமாகப் பகிர முடியும். இது செயல்பாட்டு நிரலாக்கத்தின் முக்கிய கொள்கை மற்றும் ஒரே நேரத்தில் வடிவமைப்புகளை எளிதாக்குவதற்கான பெருகிய முறையில் பிரபலமான வழியாகும்.
- மென்பொருள் பரிவர்த்தனை நினைவகம் (STM): ஒரு உயர்-நிலை சுருக்கம் டெவலப்பர்கள் நினைவகத்தில் அணு பரிவர்த்தனைகளை வரையறுக்க அனுமதிக்கிறது, தரவுத்தளத்தில் உள்ளதைப் போலவே. STM அமைப்பு பின்னணியில் சிக்கலான ஒத்திசைவு விவரங்களைக் கையாள்கிறது.
முடிவுரை
பூட்டு அடிப்படையிலான ஒத்திசைவு ஒரே நேரத்தில் நிரலாக்கத்தின் ஒரு மூலக்கல்லாகும். இது பகிரப்பட்ட ஆதாரங்களைப் பாதுகாப்பதற்கும் தரவு சிதைவைத் தடுப்பதற்கும் ஒரு சக்திவாய்ந்த மற்றும் நேரடி வழியை வழங்குகிறது. எளிய மியூடெக்ஸ் முதல் அதிக நுணுக்கமான படிக்க-எழுத பூட்டு வரை, இந்த பழமையானவை பல திரிபு பயன்பாடுகளை உருவாக்கும் எந்தவொரு டெவலப்பருக்கும் அத்தியாவசிய கருவிகள்.
இருப்பினும், இந்த சக்தி பொறுப்பைக் கோருகிறது. சாத்தியமான ஆபத்துக்கள்-முட்டுக்கட்டைகள், லைவ்லாக்குகள் மற்றும் செயல்திறன் குறைபாடு-பற்றிய ஆழமான புரிதல் விருப்பமானது அல்ல. முக்கியமான பிரிவு அளவைக் குறைத்தல், பொருத்தமான பூட்டு துகள் அளவைத் தேர்ந்தெடுப்பது மற்றும் கடுமையான பூட்டு வரிசையை செயல்படுத்துவது போன்ற சிறந்த நடைமுறைகளுக்கு இணங்குவதன் மூலம், அதன் ஆபத்துகளைத் தவிர்த்து ஒத்திசைவின் சக்தியைப் பயன்படுத்தலாம்.
ஒத்திசைவை தேர்ச்சி பெறுவது ஒரு பயணம். இதற்கு கவனமாக வடிவமைப்பு, கடுமையான சோதனை மற்றும் நூல்கள் இணையான முறையில் இயங்கும்போது ஏற்படக்கூடிய சிக்கலான தொடர்புகளை எப்போதும் அறிந்திருக்கும் ஒரு மனநிலை தேவைப்படுகிறது. பூட்டுதல் கலையை தேர்ச்சி செய்வதன் மூலம், வேகமான மற்றும் பதிலளிக்கக்கூடிய மென்பொருளை உருவாக்குவதை நோக்கி ஒரு முக்கியமான படியை எடுக்கிறீர்கள், ஆனால் வலுவான, நம்பகமான மற்றும் சரியான மென்பொருளையும் உருவாக்குகிறீர்கள்.