സെമാഫോർ (പ്രോഗ്രാമിങ്ങ്)

കമ്പ്യൂട്ടർ സയൻസിൽ, ഒന്നോ അതിലധികമോ പ്രോസസ്സുകൾക്ക് പൊതുവായി ഉപയോഗിക്കേണ്ടി വരുന്ന കമ്പ്യൂട്ടർ വിഭവങ്ങളെ  പ്രശ്നങ്ങളില്ലാതെ ഉപയോഗിക്കുന്നതിനു വേണ്ടി നിർവചിക്കപ്പെട്ടിരിക്കുന്ന ഒരു പ്രത്യേക വേരിയബിൾ ആണ് **സെമാഫോർ.** പങ്കിടപ്പെട്ടിരിക്കുന്ന കമ്പ്യൂട്ടർ വിഭവം ഉപയോഗിക്കുവാൻ സാധ്യമാണോ, ഇനി സാധ്യമെങ്കിൽ ആ വിഭവം ഒരേ സമയം എത്ര പ്രോസസ്സുകൾക്ക് ഉപയോഗിക്കുവാൻ സാധിക്കും എന്നിങ്ങനെയുള്ള വിവരങ്ങൾ ഒരു സെമാഫോർ ഉപയോഗിച്ച് നിയന്ത്രിക്കുവാൻ സാധിക്കും. ഒരു വിഭവം എത്ര മാത്രം ഉപയോഗത്തിനു ലഭ്യമാണ് എന്നത് രേഖപ്പെടുത്തിയ കണക്കു പുസ്തകമായി സെമാഫോറിനെ കണക്കാക്കാം.

1965 കാലഘട്ടത്തിൽ ഡച്ച് കമ്പ്യൂട്ടർ ശാസ്ത്രജ്ഞനായ എഡ്ഗർ ഡൈക്സ്ട്രാ ആണ് സെമാഫോർ എന്ന ആശയം മുന്നോട്ടു വെച്ചത്.

## സെമാഫോർ നിത്യജീവിതത്തിൽ
ഒരു ലൈബ്രറിയിൽ ഒരേസമയം ഒരു വിദ്യാർത്ഥികൾക്ക് ഉപയോഗിക്കുന്നതിന് സമാനമായ 10 പഠനമുറികൾ ഉണ്ടെന്ന് കരുതുക. വിദ്യാർത്ഥികൾക്ക് പഠനമുറി ഉപയോഗിക്കാൻ ലൈബ്രറി സൂക്ഷിപ്പുകാരനോട് ഒരു മുറി അഭ്യർത്ഥിക്കാം. ഉപയോഗിക്കാത്ത് മുറികളൊന്നും ലഭ്യമല്ലെങ്കിൽ, ആരെങ്കിലും ഒരു മുറി വിട്ടുനൽകുന്നത് വരെ വിദ്യാർത്ഥികൾ കാത്തിരിക്കണം. ഒരു മുറി ഉപയോഗിച്ചുകഴിഞ്ഞാൽ, അത് ഉപയോഗിച്ചുകൊണ്ടിരുന്ന വിദ്യാർത്ഥി പുറത്തുവരികയും ലൈബ്രറി സൂക്ഷിപ്പുകാരനോട് ഒരു മുറി സൗജന്യമായി എന്ന് സൂചിപ്പിക്കുകയും വേണം.

ഈ പ്രക്രിയ ഏറ്റവും ലളിതമായി നടപ്പിലാക്കിയാൽ, ഏതൊരു സമയത്തും ലൈബ്രറി സൂക്ഷിപ്പുകാരൻ്റെ കൈവശം ലഭ്യമായ ഒഴിഞ്ഞ മുറികളുടെ എണ്ണം മാത്രമേ ഉണ്ടാവുകയുള്ളൂ. എല്ലാ വിദ്യാർത്ഥികളും അവർക്കായി നൽകിയിട്ടുള്ള മുറി യഥാർത്ഥത്തിൽ ഉപയോഗിക്കുകയും ഉപയോഗം കഴിഞ്ഞാൽ കൃത്യമായി തിരികെ നൽകുകയും ചെയ്യുന്നുവെങ്കിൽ മാത്രമേ ഈ കണക്ക് കൃത്യമാകൂ. ഒരു വിദ്യാർത്ഥി ഒരു മുറി ആവശ്യപ്പെടുമ്പോൾ, ലൈബ്രറി സൂക്ഷിപ്പുകാരൻ മുറികളുടെ എണ്ണം 1 കുറയ്ക്കുന്നു. ഒരു വിദ്യാർത്ഥി ഒരു മുറി വിടുമ്പോൾ, അദ്ദേഹം ഈ എണ്ണം 1 വർദ്ധിപ്പിക്കുന്നു. വിദ്യാർഥിക്ക് അനുവദിക്കപ്പെട്ട മുറി ഇഷ്ടമുള്ളിടത്തോളം ഉപയോഗിക്കാം, മുറികൾ മുൻകൂട്ടി ബുക്ക് ചെയ്യാൻ കഴിയുകയുമില്ല

ഈ ഉദാഹരണത്തിൽ മുറികളുടെ എണ്ണം രേഖപ്പെടുത്തുന്ന പുസ്തകം ഒരു സെമാഫോറിനെ പ്രതിനിധീകരിക്കുന്നു.  മുറികളാണ് പങ്കുവെക്കപ്പെടുന്ന വിഭവം. വിദ്യാർത്ഥികൾ പ്രോസസുകൾ/ത്രെഡുകളെ പ്രതിനിധീകരിക്കുന്നു. ഇവിടെ സെമാഫോറിൻ്റെ മൂല്യം തുടക്കത്തിൽ 10 ആണ്; എല്ലാ മുറികളും ശൂന്യമാണ് എന്നർത്ഥം. ഒരു വിദ്യാർത്ഥി ഒരു മുറി അഭ്യർത്ഥിക്കുമ്പോൾ, അവർക്ക് പ്രവേശനം അനുവദിക്കുകയും സെമാഫോറിൻ്റെ മൂല്യം 9 ആയി കുറയ്കുകയും ചെയ്യുന്നു. ഓരോ  വിദ്യാർത്ഥിക്ക് മുറി അനുവദിക്കുമ്പോഴും  അത് 8, തുടർന്ന് 7 എന്നിങ്ങനെ കുറയുന്നു. ആരെങ്കിലും ഒരു മുറി അഭ്യർത്ഥിക്കുമ്പോൾ സെമാഫോറിൻ്റെ നിലവിലെ മൂല്യം 0 ആണെങ്കിൽ, ഒരു മുറി ഒഴിവാകുന്നതുവരെ കാത്തിരിക്കാൻ അവർ നിർബന്ധിതരാകുന്നു. ഒരു വിദ്യാർത്ഥി അവരുടെ മുറിയിൽ നിന്നും പുറത്തു വന്നു കഴിയുമ്പോൾ ലൈബ്രറി സൂക്ഷിപ്പുകാരനെ അറിയിക്കേണ്ടതുണ്ട്. തുടർന്ന് അദ്ദേഹം തൻ്റെ പുസ്തകത്തിൽ മുറികളുടെ എണ്ണം 1 വർദ്ധിപ്പിക്കുന്നു. ഒന്നിലധികം വിദ്യാർത്ഥികൾ  മുറിക്കു വേണ്ടി കാത്തിരിക്കുന്നുണ്ടെങ്കിൽ, അടുത്ത ആളെ തിരഞ്ഞെടുക്കുന്നതിന് ഏതു രീതിയും അവലംബിക്കാം (ആദ്യം വന്നയാൾ ആദ്യം, അല്ലെങ്കിൽ ഒരു നാണയം ടോസ് ചെയ്യുന്നതിലൂടെ എന്നിങ്ങനെ).

## സെമാഫോർ
സെമാഫോറുകളെ സൂചിപ്പിക്കുവാൻ പൊതുവായി ഉപയോഗിച്ചു വരുന്നത് ***S*** എന്ന അക്ഷരമാണ്. സാധാരണയായി എണ്ണം രേഖപ്പെടുത്തുന്നതിന് ഉപയോഗിക്കുന്നതു കൊണ്ട് ഇവ integer ടൈപ്പ് വേരിയബിളുകൾ ആയിരിക്കും. `wait(S)` ,`signal(S)` എന്നിങ്ങനെ രണ്ട് പ്രവർത്തനങ്ങളാണ് ഒരു സെമാഫോർ വേരിയബിളിൽ ചെയ്യുവാൻ സാധിക്കുക. ഈ രണ്ടു പ്രവർത്തനങ്ങളും സെമാഫോറിൻ്റെ വിലയിൽ മാറ്റം വരുത്തുന്നതിനുള്ളതാണ്.

##### ബൈനറി സെമാഫോറുകൾ
ഒരു സെമാഫോർ ഏതെങ്കിലും രണ്ട് വിലകൾ മാത്രം രേഖപ്പെടുത്തുന്നതിനാണ് ഉപയോഗിക്കുന്നതെങ്കിൽ അത്തരം സെമാഫോറുകളെ ബൈനറി സെമാഫോറുകൾ എന്നു പറയുന്നു. 1 അല്ലെങ്കിൽ 0 എന്നീ വിലകളാണ് സാധാരണയായി ബൈനറി സെമാഫോറുകളിൽ രേഖപ്പെടുത്തുക. ഈ വിലകളെ യഥാക്രമം ഉണ്ട് അല്ലെങ്കിൽ ഇല്ല, Locked അല്ലെങ്കിൽ Unlocked എന്നീ വിലകൾക്ക് പകരം ഉപയോഗിക്കാം.

ബൈനറി സെമാഫോറുകൾ ഉപയോഗിക്കുന്നത് കമ്പ്യൂട്ടർ വിഭവങ്ങൾ പങ്കിടുമ്പോൾ പരസ്പര ഒഴിവാക്കൽ ഉറപ്പു വരുത്തുന്നതിനാണ്. ഇതേ കാരണത്താൽ ഇത്തരം സെമാഫോറുകളെ **മ്യൂട്ടെക്സ്** (Mutex; Mutual Exclusion എന്നതിൻ്റെ ആദ്യഭാഗങ്ങൾ ചേർത്തത്)  എന്നും വിളിച്ചു വരുന്നു.

##### കൌണ്ടിങ്ങ് സെമാഫോറുകൾ
ഒരു വിഭവത്തെ സംബന്ധിച്ച് ഏതെങ്കിലും വിധത്തിലുള്ള എണ്ണം രേഖപ്പെടുത്തുന്നതിന് ഉപയോഗിക്കുന്ന സെമാഫോറുകളാണ് കൌണ്ടിങ്ങ് സെമാഫോറുകൾ ഉപയോഗിക്കുന്നത്. ഒരു വിഭവം ഒന്നിൽ കൂടുതൽ പ്രോസസ്സുകൾക്ക് ഉപയോഗിക്കേണ്ടി വരുമ്പോൾ അത് നിയന്ത്രിക്കുന്നതിനാണ് ഇവ ഉപയോഗിക്കുന്നത്.

## അവലംബം

വർഗ്ഗം:കമ്പ്യൂട്ടർ - അപൂർണ്ണലേഖനങ്ങൾ
വർഗ്ഗം:ഓപ്പറേറ്റിങ്ങ്‌ സിസ്റ്റം