Saturday, September 29, 2012

പ്രോഗ്രാം, പ്രോസസ്സ് - 3

വിര്‍ച്ച്വല്‍ മെമ്മറി

വിര്‍ച്ച്വല്‍ മെമ്മറിയുടെ ആവശ്യകതയെക്കുറിച്ചും  അത് എന്താണെന്നും  ഇതിനു മുന്‍പത്തെ പോസ്റ്റില്‍ പറഞ്ഞു. അതിന്റെ പ്രവര്‍ത്തന രീതികളെക്കുറിച്ച് വിശദമായി. ഇന്ന് ഡെസ്ക്‌‌ടോപ്പ് കമ്പ്യൂട്ടറുകളില്‍ ഏറ്റവുമധികം  ഉപയോഗിക്കപ്പെടുന്ന ഇന്റലിന്റെ x86 കുടുംബത്തിലുള്ള പ്രോസസറുകളുടെ പ്രവര്‍ത്തന രീതി അടിസ്ഥാനമാക്കിയാണ് തുടര്‍ന്നുള്ള വിശദീകരണങ്ങള്‍. വിര്‍ച്ച്വല്‍ മെമ്മറിയുടെ പ്രവര്‍ത്തനത്തെ കാണിക്കുന്ന ചിത്രം നോക്കൂ,
കടപ്പാട്: വിക്കിപീഡിയ
ലഭ്യമായ റാമും ഹാര്‍ഡ് ഡിസ്കും  ചേര്‍ന്നതാണ് വിര്‍ച്ച്വല്‍ മെമ്മറി. ഇന്നത്തെ മിക്കവാറും ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റങ്ങളും  ഓരോ പ്രോസസിനും  അതിന്റെ സ്വന്തമായ ഒരു അഡ്രസ് സ്പേസ് അനുവദിക്കുന്നു. ആ പ്രോഗ്രാമും  അതിന്റെ അനുബന്ധ ഫയലുകളും  ഒക്കെ ലോഡ് ചെയ്യാനുള്ള അഡ്രസ്സുകളുടെ പരിധിയെ ആണ് അഡ്രസ്സ് സ്പേസ് എന്ന് വിളിക്കുന്നത്. ഓരോ പ്രോഗ്രാമിനും  അതിനുള്ളിലെ ഫങ്ഷനുകള്‍, വേരിയബിളുകള്‍ തുടങ്ങിയവക്കൊക്കെ കമ്പൈലര്‍ തന്നെ നല്‍കിയിരിക്കുന്ന അഡ്രസ്സ് ഉണ്ടാകും. ഇതിന്റെ തുടക്കവും  ഒടുക്കവുമൊക്കെ എല്ലാ പ്രോഗ്രാമുകളിലും  ഒന്നായിരിക്കും. ഈ അഡ്രസ്സുകളെ വിര്‍ച്ച്വല്‍ അഡ്രസ്സ് എന്നാണ് വിളിക്കുന്നത്. ഈ അഡ്രസ്സ് റാമിലെ ശരിക്കുമുള്ള അഡ്രസ്സുമായി ബന്ധമില്ലാത്തതാണ്. എന്ന് മാത്രവുമല്ല കുറച്ച് മാത്രം റാം ഉള്ള കമ്പ്യൂട്ടറുകളില്‍ ചിലപ്പോഴൊന്നും  ആ അഡ്രസ്സുകള്‍ ഉണ്ടായിരിക്കുകയുമില്ല. ഒരു 32ബിറ്റ് പ്രോസസറിന്  നാല് ജി ബി വരെയുള്ള അഡ്രസ്സുകളെ കൈകാര്യം ചെയ്യാന്‍ സാധിക്കും. (2^32 = 4294967296). ഇന്നത്തെ മിക്കവാറും  കമ്പ്യൂട്ടറുകളില്‍ ഇത്രയും  തന്നെ റാം ഉണ്ടായിരിക്കുമല്ലോ. അപ്പോള്‍ വിര്‍ച്ച്വല്‍ മെമ്മറി ശരിക്കും  ആവശ്യമാണോ എന്ന സംശയം സ്വാഭാവികമായും  ഉണ്ടാകാം. ഈ 4 ജി ബി റാമില്‍ തന്നെ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം, ആ സമയത്ത് പ്രവര്‍ത്തിക്കുന്ന വിവിധ പ്രോഗ്രാമുകള്‍ എന്നിവക്കൊക്കെ സ്ഥലം‌‌ കണ്ടെത്തണം. എക്സിക്യൂട്ടബിള്‍ ഫയലിന്റെ വലിപ്പമല്ല ഒരു പ്രോഗ്രാമിന് പ്രവര്‍ത്തന സമയത്ത് ആവശ്യമായി വരുന്ന മെമ്മറിയുടെ വലിപ്പം  എന്ന കാര്യം ഓര്‍ക്കേണ്ടതാണ്. കമ്പ്യൂട്ടറിന്റെ അടിസ്ഥാന പ്രമാണങ്ങളില്‍ ഒന്നാണ് കൈകാര്യം ചെയ്യപ്പെടണ്ട വിവരങ്ങള്‍ നിര്‍ബന്ധമായും  മെമ്മറിയില്‍ ഉണ്ടായിരിക്കണം എന്നത്. 800x600 റെസല്യൂഷന്‍ ഉള്ള ഒരു ചിത്രം കൈകാര്യം ചെയ്യുന്ന ഒരു പ്രോഗ്രാമിന് ഈ ചിത്രത്തിന്റെ വിവരങ്ങള്‍ മുഴുവന്‍ മെമ്മറിയില്‍ സൂക്ഷിക്കണമെങ്കില്‍, 8ബിറ്റ് ആര്‍ജി‌‌ബി ചിത്രമാണെങ്കില്‍ 800x600x8x3 ബൈറ്റുകള്‍ ആവശ്യമായി വരും. ആകെ 11520000 ബൈറ്റുകള്‍ (10.986328125എംബി). ഈ പത്ത് എംബി ഈ പ്രോഗ്രാമിന്റെ എക്സിക്യൂട്ടബിള്‍ ഫയലില്‍ ഉള്‍പ്പെടുന്നില്ല. ആ ഫയലിന്റെ വലിപ്പം ഇതിലും  കുറവായിരിക്കുകയും  ചെയ്യാം. എന്നാല്‍ ആ ഫയലിന്റെ അകത്ത് രേഖപ്പെടുത്തിയിരിക്കുന്ന അഡ്രസ്സുകളില്‍ ഈ ഭാഗം കൂടി ഉണ്ടായിരിക്കും. മെമ്മറിയില്‍ ലോഡ് ചെയ്യപ്പെടുന്ന അവസരത്തില്‍ അതിന് ഈ അഡ്രസ്സുകള്‍ കൂടി നല്‍കേണ്ടതുണ്ട്. ഒരു പ്രോഗ്രാം പ്രവര്‍ത്തിക്കുമ്പോള്‍ സിസ്റ്റം മോണിറ്റര്‍/ടാസ്ക് മാനേജര്‍ തുറന്ന് ആ പ്രോഗ്രാം ഉപയോഗിക്കുന്ന മെമ്മറിയുടെ അളവ് നോക്കൂ, പിന്നെആ പ്രോഗ്രാമിന്റെ എക്സിക്യൂട്ടബിള്‍ ഫയലിന്റെ വലിപ്പവും. അപ്പോള്‍ഈ വ്യത്യാസം മനസ്സിലാകും. ചിലപ്പോളൊക്കെ ആപ്രോഗ്രാം മറ്റ് പ്രോഗ്രാമുകളെ പ്രവര്‍ത്തിപ്പിക്കുന്നുണ്ടാകും. അതിനാല്‍ ആദ്യത്തെ പ്രോഗ്രാം തന്നെയാണ് ആ മെമ്മറി മുഴുവന്‍ ഉപയോഗിക്കുന്നത് എന്ന് കരുതരുത്.

വിര്‍ച്ച്വല്‍ മെമ്മറി സെഗ്‌‌മെന്റഡ് വിര്‍ച്ച്വല്‍ മെമ്മറി, പേജ്‌‌ഡ് വിര്‍ച്ച്വല്‍ മെമ്മറി എന്നിങ്ങനെ രണ്ട് തരത്തില്‍ ഉണ്ട്. പേജ്ഡ് വിര്‍ച്ച്വല്‍ മെമ്മറിയില്‍ ആകെയുള്ള വിര്‍ച്ച്വല്‍ അഡ്രസ്സുകളെ ഒരേ വലിപ്പമുള്ള വിവിധ പേജുകളാക്കി വിഭജിക്കുന്നു. ഈ പേജുകളെ കുറിച്ചുള്ള വിവരങ്ങള്‍ ഉള്‍പ്പെടുന്ന പട്ടികയാണ് പേജ് ടേബിള്‍. ഓരോ പ്രോഗ്രാമും മെമ്മറിയില്‍ ലോഡ് ചെയ്യപ്പെടുമ്പോള്‍ ആപ്രോഗ്രാമിലെ പേജുകളുടെ വിവരം ഈ പട്ടികയില്‍ ചേര്‍ക്കപ്പെടുന്നു. ഒരു സമയത്ത് ആ പേജ് റാമില്‍ ഉണ്ടോ എന്ന കാര്യം ഒക്കെ ഈ പട്ടികയില്‍ രേഖപ്പെടുത്തിയിരിക്കും. ഇതിനോട് സമാനമാണ് സെഗ്‌‌മന്റഡ് വിര്‍ച്ച്വല്‍ മെമ്മറിയും. ഇതില്‍ അഡ്രസ്സുകളെ വിവിധ പേജുകളായി തിരിക്കുന്നതിന് പകരം വിവിധ വലിപ്പമുള്ള സെഗ്‌‌മന്റുകള്‍ ആയി വിഭജിക്കുന്നു. ഇന്ന് ഇവ രണ്ടും ചേര്‍ന്ന ഒരു രൂപമാണ് ഉപയോഗത്തില്‍ ഉള്ളത്. അതായത് ഒരു പ്രോഗ്രാമിന് ആകെ ആവശ്യമായ അഡ്രസ്സുകളെ ആദ്യം വിവിധ സെഗ്‌‌മന്റുകള്‍ ആയി വിഭജിക്കുന്നു. ഇതില്‍ ഓരോ സെഗ്മന്റിനും  ഓരോ ഉദ്ദേശ്യമുണ്ട്. പിന്നീട് ഓരോ സെഗ്മന്റിനെയും വിവിധ പേജുകള്‍ ആയി വിഭജിക്കുന്നു. ഈ പേജുകളുടെ എല്ലാം വലിപ്പം ഒന്നുതന്നെയായിരിക്കും.

ഒരു പ്രോഗ്രാം മെമ്മറിയിലേക്ക് ലോഡ് ചെയ്യപ്പെടുമ്പോള്‍ അതിലെ മുഴുവന്‍ പേജുകളും ഒറ്റയടിക്ക് മെമ്മറിയില്‍ വരുന്നില്ല. അവ ഹാര്‍ഡ് ഡിസ്കില്‍ ആയിരിക്കും ഉണ്ടാകുന്നത്. ഒരു പ്രത്യേക അഡ്രസ്സിലെ വിവരം ആവശ്യമായി വരുന്ന സമയത്ത് ആ അഡ്രസ്സ് ഉള്‍പ്പെടുന്ന പേജ് മെമ്മറിയില്‍ ഇല്ലെങ്കില്‍ അതിനെ ഡിസ്കില്‍ നിന്നും വായിച്ചെടുക്കുകയാണ് ചെയ്യുന്നത്. ഒരു അഡ്രസ് മെമ്മറിയില്‍ കാണാതാകുമ്പോള്‍ പ്രോസസര്‍ പേജ് ഫാള്‍ട്ട് എന്ന എക്സപ്ഷന്‍ പുറപ്പെടുവിക്കുന്നു. (സാധാരണ പ്രവര്‍ത്തന രീതിയില്‍ പിശക് വന്ന അവസ്ഥ). ഇത്തരത്തില്‍ ഉള്ള വിവിധ തരം അവസ്ഥകളെ എങ്ങനെ കൈകാര്യം ചെയ്യണം എന്ന കാര്യം ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം ഒരു പട്ടികയുണ്ടാക്കി രേഖപ്പെടുത്തിയിരിക്കും. അപ്പോള്‍ ഉള്ള അവസ്ഥക്കനുസരിച്ച് സ്വീകരിക്കേണ്ട നടപടികളെക്കുറിച്ചുള്ള വിശദാംശങ്ങള്‍, നിര്‍ദ്ദേശങ്ങള്‍ എന്നിവ ഉള്‍പ്പെടുന്ന മെമ്മറി അഡ്രസ്സ് ആണ് ഈ പട്ടികയില്‍ ഉണ്ടാകുന്നത്. പ്രോസസര്‍ ആ മെമ്മറി അഡ്രസ്സിലെ നിര്‍ദ്ദേശങ്ങളെ എക്സിക്യൂട്ട് ചെയ്യുകയും ആവശ്യമായ പേജ് മെമ്മറിയില്‍ എത്തിക്കഴിഞ്ഞാല്‍ തിരിച്ച്പോയി നേരത്തെ നിര്‍ത്തിയിടത്ത് നിന്ന് പ്രവര്‍ത്തനം തുടരുകയും  ചെയ്യും. ചിലപ്പോളൊക്കെ ആവശ്യത്തിന് റാം, ഗ്രാഫിക്സ് കാര്‍ഡ് ഒന്നും  ഇല്ലാത്ത കമ്പ്യൂട്ടറുകളില്‍ ഗെയിമുകള്‍ കളിക്കുമ്പോള്‍ സ്ക്രീന്‍ ഇടക്കിടെ അനങ്ങാതാകുന്ന അവസ്ഥയുണ്ടാകാറുണ്ട്. ഈ സമയത്ത് ഹാര്‍ഡ് ഡിസ്കിന് എല്‍ ഇ ഡി ഉണ്ടെങ്കില്‍ അത് തെളിഞ്ഞിരിക്കുന്നത്/മിന്നുന്നത് കാണാം. ഡിസ്കില്‍ നിന്ന് ആവശ്യമായ പേജുകള്‍ മെമ്മറിയില്‍ കൊണ്ടൂവരുന്നതാണിത്.

 പ്രോഗ്രാമുകളില്‍ ഉപയോഗിക്കുന്നത് വിര്‍ച്ച്വല്‍ അഡ്രസ്സുകള്‍ ആണെന്ന് നേരത്തേ‌ പറഞ്ഞു. ചില പ്രോസസറുകള്‍ ഈ വിര്‍ച്ച്വല്‍ അഡ്രസ് തന്നെ ഉപയോഗിക്കും. മിക്കവാറും അത് പ്രോസസര്‍ പ്രവര്‍ത്തിക്കുന്ന മോഡിനെ അടിസ്ഥാനമാക്കിയിരിക്കും. ഉദാഹരണത്തിന് ഇന്റല്‍ പ്രോസസറുകള്‍ പ്രവര്‍ത്തിച്ച് തുടങ്ങുമ്പോള്‍ റിയല്‍ മോഡില്‍ ആണ് ഉണ്ടാവുക. അവക്ക് ആ സമയത്ത് 16 ബിറ്റ് അഡ്രസ്സുകള്‍ മാത്രമേ കൈകര്യം ചെയ്യാന്‍ സാധിക്കുകയുള്ളു. ഈ അഡ്രസ്സുകള്‍ റാമിലുള്ള ഫിസിക്കല്‍ അഡ്രസ്സുകള്‍ ആയിരിക്കും. ഇതിനെ പിന്നീട് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം പ്രൊട്ടക്റ്റഡ് മോഡിലേക്ക് മാറ്റും. അതിനു ശേഷം അവ വിര്‍ച്ച്വല്‍ അഡ്രസ്സുകള്‍ ആയിരിക്കും ഉപയോഗിക്കുന്നത്. പ്രോസസര്‍ വിര്‍ച്ച്വല്‍ അഡ്രസ്സ് ഉപയോഗിച്ചാലും ആ അഡ്രസ്സില്‍ ഉള്ള വിവരങ്ങള്‍ റാമില്‍ ആയിരിക്കുമല്ലോ ഉണ്ടാകുന്നത്. പ്രോസസറിനാവശ്യമായ വിവരങ്ങള്‍ റാമില്‍ നിന്ന് എത്തിച്ചുകൊടുക്കുന്ന ഭാഗത്തിന് ആ അഡ്രസ്സുമായി ബന്ധപ്പെട്ട റാമിലെ ഫിസിക്കല്‍ അഡ്രസ് അറിയേണ്ടതുണ്ട്. ഇത് ചെയ്യുന്നത് മെമ്മറി മാനേജ്‌‌മെന്റ് യൂണിറ്റ് (mmu) ആണ്. ചില പ്രോസസറുകള്‍ക്കുള്ളില്‍ തന്നെ ഈ ഭാഗം ഉണ്ടായിരിക്കും. ഇത് പ്രത്യേകം ചിപ്പില്‍ പ്രോസസറിന് പുറത്തും  ആകാം. പ്രോസസര്‍ ഉപയോഗിക്കുന്ന വിര്‍ച്ച്വല്‍ അഡ്രസ്സില്‍ (പ്രോസസറിന്റെ കാര്യത്തില്‍ ഇതിനെ ലോജിക്കല്‍ അഡ്രസ്സ് എന്ന് പറയാറുണ്ട്) ഒരു ഭാഗം പേജിന്റെ അഡ്രസ്സും (ബേസ് അഡ്രസ്സ്) ബാക്കിഭാഗം ആ പേജിനുള്ളിലെ ഒരു സ്ഥാനവും  (ഓഫ്‌‌സെറ്റ് - അതായത് വേണ്ട വിവരം ആ പേജിന്റെ തുടക്കത്തില്‍ നിന്ന് എത്ര ബൈറ്റ് മാറിയാണ് എന്നത്) ആയിരിക്കും. എംഎംയു പേജുകളുടെ റാമിലുള്ള അഡ്രസ് ഉള്‍പ്പെടുന്ന ഒരു പട്ടിക സൂക്ഷിച്ചിരിക്കുന്നു. ഇതിനെ ടി എല്‍ ബി (TLB - Translation Look-aside Buffer) എന്ന് പറയുന്നു. ടി എല്‍ ബിയിലെ ഓരോ വിവരത്തെയും പേജ് ടേബിള്‍ എന്‍ട്രി (PTE - Page Table Entry) എന്ന് പറയുന്നു. ഇതില്‍ ഓരോ പേജിന്റെയും റാമിലെ ശരിക്കുള്ള അഡ്രസ്സ്, ആ പേജിന് മെമ്മറിയില്‍ എത്തിയതിനു ശേഷം മാറ്റം സംഭവിച്ചിട്ടുണ്ടോ, ഏതൊക്കെ പ്രോസസുകള്‍ക്ക് ആ പേജ് വായിക്കാനോ മാറ്റം വരുത്താനോ അനുവാദമുണ്ട് എന്ന വിവരങ്ങള്‍ ഒക്കെ ഉണ്ടാകും. ഈ ചിത്രം നോക്കൂ,
ചിത്രത്തിന് കടപ്പാട്: വിക്കിപീഡിയ
പ്രവര്‍ത്തനത്തിന് കൂടുതല്‍ പേജുകള്‍ ആവശ്യമായി വരികയും റാമില്‍ അവയെ ഉള്‍ക്കൊള്ളാനുള്ള സ്ഥലം ഇല്ലാതിരിക്കുകയും  ചെയ്യുമ്പോള്‍ അവയെ ഹാര്‍ഡ് ഡിസ്കിലേക്ക് താല്‍ക്കാലികമായി മാറ്റുന്നു. സ്വാപ്പിങ്ങ് എന്നാണ് ഈ പ്രക്രിയയെ വിളിക്കുന്നത്. മിക്കവാറും യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങളില്‍ ഇതിനായി ഒരു പ്രത്യേക ഡിസ്ക് പാര്‍ട്ടീഷ്യന്‍ തന്നെ കാണുമല്ലോ. ഹാര്‍ഡ് ഡിസ്കിലേക്ക് വിവരങ്ങള്‍ എഴുതുന്നത് അധികം സമയം വേണ്ട പ്രക്രിയ ആയതിനാല്‍ സ്വാപ്പിങ്ങ് കമ്പ്യൂട്ടറിന്റെ വേഗതയെ ബാധിക്കും. ചിലപ്പോളൊക്കെ ആവശ്യമായ പേജ് ഡിസ്കില്‍ നിന്ന് മെമ്മറിയില്‍ എത്തിക്കാന്‍ മെമ്മറിയില്‍ ഉള്ള പേജുകളെ നീക്കം ചെയ്യേണ്ടിവരും. അപ്പോള്‍ നീക്കം ചെയ്ത പേജ് ഉടനെ തന്നെ ആവശ്യമായി വന്നാല്‍ വേറൊരു പേജിനെ നീക്കം ചെയ്ത ശേഷം ആ പേജിനെ മെമ്മറിയിലേക്ക് കൊണ്ടുവരേണ്ടിവരും. ഇത് തുടര്‍ന്നുകൊണ്ടിരുന്നാല്‍ കമ്പ്യൂട്ടര്‍ ആകെ മന്ദഗതിയില്‍ ആവുകയും പ്രോഗ്രാമുകള്‍ പ്രവര്‍ത്തിക്കാത്തതുപോലെ തോന്നുകയും ചെയ്യും. ട്രാഷിങ്ങ് (Trashing) എന്നാണ് ഈ അവസ്ഥയുടെ പേര്. ഇത് അത്ര സാധാരണയായ ഒരു അവസ്ഥയല്ല.

ഒരേ പ്രോഗ്രാമിന്റെ തന്നെ വിവിധ പേജുകള്‍ മെമ്മറിയില്‍ തുടര്‍ച്ചയല്ലാത്ത സ്ഥലങ്ങളില്‍ ആയിരിക്കാം. ഇത് ഫ്രാഗ്മെന്റേഷന്‍ എന്നറിയപ്പെടുന്നു. എന്നാല്‍ ഇതൊന്നും ഒരിക്കലും  പ്രവര്‍ത്തിച്ചുകൊണ്ടിരിക്കുന്ന പ്രോഗ്രാം അറിയുന്നില്ല. പ്രോഗ്രാമിന്റെ നോട്ടത്തില്‍ അതിന് തുടര്‍ച്ചയായ, വളരെ വലിപ്പമുള്ള ഒരു മെമ്മറി സ്പേസ് ഉള്ളതായാണ് തോന്നുക. ഇത് തന്നെയാണ് വിര്‍ച്ച്വല്‍ മെമ്മറിയുടെ ഉദ്ദേശ്യവും.

6 comments:

  1. പേജ് ടേബിൾ എവിടെയാണ് സൂക്ഷിക്കുക എന്ന് പറഞ്ഞിട്ടില്ല.

    ReplyDelete
  2. ഇത് വിക്കീൽ കയറ്റുന്നില്ലേ സുബിൻ..

    ReplyDelete
  3. വിക്കിയില്‍ ചേര്‍ത്തിട്ടുണ്ട്. സുനിലിന് നന്ദി.. :)‌http://goo.gl/FSQTc

    ReplyDelete
  4. പേജ് ടേബിള്‍ മെമ്മറിയില്‍ തന്നെയാണുണ്ടാവുക സുനില്‍. പ്രത്യേകമായ mmu ഉണ്ടെങ്കില്‍ അതിന് രെജിസ്റ്റര്‍ ഉണ്ടാകും. ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം പി റ്റി തയ്യാറാക്കിയ ശേഷം ആ രെജിസ്റ്ററില്‍ അതിന്റെ സ്റ്റാര്‍ട്ടിങ്ങ് അഡ്രസ്സ് എഴുതുകയാണ് ചെയ്യാറ്.

    ReplyDelete
  5. വിക്കിയിലേക്കുള്ള കണ്ണി തെറ്റാണ്.

    ഒപ്പം വിക്കിപാഠശാലയില്‍ കൂടി ഉള്ളടക്കം ചേര്‍ത്താല്‍ നല്ല ഒരു പുസ്തകം തയ്യാറാകും.:)
    http://ml.wikibooks.org/wiki/

    ReplyDelete