Friday, December 07, 2012

ഇന്റര്‍ പ്രോസസ്സ് കമ്യൂണിക്കേഷന്‍ - 1 : സിഗ്നല്‍

സിഗ്നലുകള്‍ ഇന്റര്‍ പ്രോസസ്സ് കമ്മ്യൂണിക്കേഷനില്‍ വളരെ പ്രധാനപ്പെട്ടവയാണെങ്കിലും അവയുടെ സാധ്യതകള്‍ പരിമിതമാണ്. എന്നാല്‍ സിസ്റ്റത്തില്‍ നടക്കുന്ന വിവിധ സംഭവങ്ങളെക്കുറിച്ചുള്ള അറിയിപ്പുകള്‍ വിവിധ പ്രോസസ്സുകള്‍ക്ക് നല്‍കാനും പ്രോസസ്സുകളുടെ പ്രവര്‍ത്തനത്തെ നിയന്ത്രിക്കാനും സിഗ്നലുകള്‍ ഉപയോഗിക്കാന്‍ സാധിക്കും. ഓരോ സിഗ്നലുകള്‍ക്കും ഓരോ അര്‍ഥമാണുള്ളത്. ഈ സിഗ്നലുകളെ തിരിച്ചറിയാന്‍ പോസിക്സ് മാനദണ്ഡത്തില്‍ ഓരോ സംഖ്യകള്‍ അവക്ക് നല്‍കപ്പെട്ടിരിക്കുന്നു. kill സിസ്റ്റം കോള്‍, അല്ലെങ്കില്‍ kill കമാന്റ് തുടങ്ങിയവ വഴി വിവിധ പ്രോസസ്സുകളിലേക്ക് സിഗ്നലുകള്‍ അയക്കാന്‍ സാധിക്കും. പോസിക്സ് നിര്‍വ്വചിച്ചിരിക്കുന്നതില്‍ കൂടുതല്‍ സിഗ്നലുകള്‍ പല സിസ്റ്റങ്ങളിലും ലഭ്യമാണ്. ലഭ്യമായ സിഗ്നലുകളുടെ പട്ടിക കാണുന്നതിന് kill -l എന്ന കമാന്റ് ഉപയോഗിക്കാവുന്നതാണ്.

സിസ്റ്റത്തിലെ ഓരോ പ്രോസസ്സിനും കെര്‍ണലിന്റെ പ്രോസസ്സ് ടേബിളില്‍ ഒരു എന്‍ട്രി ഉണ്ടായിരിക്കും എന്ന് പറഞ്ഞിരുന്നല്ലോ. ഓരോ പ്രോസസ്സിലേക്കും അയക്കപ്പെടുന്ന സിഗ്നലുകള്‍ ഇതില്‍ രേഖപ്പെടുത്തിയിരിക്കുന്നു. ഒരു പ്രോസസ്സിന്റെ പ്രോസസ്സ് ടേബിള്‍ എന്‍ട്രിയില്‍ ഒരു സിഗ്നലിനെ സൂചിപ്പിക്കാന്‍ ഒരു ബിറ്റ് എന്ന കണക്കിലാണ് മെമ്മറി അനുവദിച്ചിരിക്കുക. അതിനാല്‍ത്തന്നെ ഒരേ സിഗ്നല്‍ എത്ര തവണ ഒരു പ്രോസസ്സിലേക്ക് അയക്കപ്പെട്ടു എന്ന് അറീയാന്‍ സാധ്യമല്ല. എന്നാല്‍ ആ പ്രോസസ്സിലേക്ക് ഏതൊക്കെ സിഗ്നല്‍ അയക്കപ്പെട്ടിട്ടുണ്ട് എന്നറിയാന്‍ സാധിക്കും.

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

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

ഇതില്‍നിന്ന് മനസ്സിലാക്കാനുള്ള കാര്യം സിഗ്നലുകള്‍ സ്വീകരിക്കുകയോ അവയെ കൈകാര്യം ചെയ്യുകയോ ചെയ്യുന്നത് ഒരു പ്രോസസ്സിന്റെ അധികാര പരിധിയില്‍ ഉള്ള കാര്യമല്ല. അവ നടക്കുന്നത് ആ പ്രോസസ്സ് അറിയുകയും ഇല്ല. ഒരു പ്രോസസ്സ് ഫോര്‍ക്ക് ഉപയോഗിച്ച് അതിന്റെ ചൈല്‍ഡ് പ്രോസസ്സിനെ സൃഷ്ടിക്കുമ്പോള്‍ അത് രെജിസ്റ്റര്‍ ചെയ്തിരുന്ന ഹാന്‍ഡ്‌‌ലര്‍ ഫങ്ങ്ഷനുകള്‍ ഒക്കെ ചൈല്‍ഡ് പ്രോസസ്സിലും അതേ നിലയില്‍ തുടരും. എന്നാല്‍ ചൈല്‍ഡ് പ്രോസസ്സ് സൃഷ്ടിക്കപ്പെടുന്നതിനു മുന്‍പ് പേരന്റ് പ്രോസസ്സ് സ്വീകരിച്ചതും കൈകാര്യം ചെയ്യപ്പെട്ടിട്ടില്ലാത്തതുമായ സിഗ്നലുകള്‍ ഒന്നും ചൈല്‍ഡ് പ്രോസസ്സിന് ബാധകമാകില്ല.

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

പോസിക്സില്‍ നിര്‍വ്വചിക്കപ്പെട്ടിരിക്കുന്ന സിഗ്നലുകളുടെ വിശദാംശങ്ങള്‍ ഈ വിക്കിപീഡിയ ലേഖനത്തില്‍ കാണാം. പ്രോസസ്സിലെ സിഗ്നല്‍ ഹാന്‍ഡ്ലിങ്ങിന്റെ വിശദാംശത്തിനും ഓരോ സിഗ്നലും എങ്ങനെ പെരുമാറുന്നു എന്നുമുള്ള വിശദാംശങ്ങള്‍ക്കായി man 7 signal എന്ന് ടെര്‍മിനലില്‍ ടൈപ്പ് ചെയ്ത് നോക്കുക.

കമാന്റ് ലൈനില്‍ നിന്നയക്കപ്പെടുന്ന SIGINT എങ്ങനെ കൈകാര്യം ചെയ്യാം എന്നൊരു ഉദാഹരണം നോക്കാം
 #include <stdio.h>  
 #include <signal.h>  
 #include <unistd.h>  
   
 volatile sig_atomic_t terminated = 0;  
   
 void sigint_handler(int signum)  
 {  
     printf("\nSignal %d received..\n", signum);  
     terminated = 1;  
 }  
   
 int main(void)  
 {  
     unsigned long counter = 0;  
   
     signal(SIGINT, sigint_handler);  
   
     printf("Entering an infinit loop..\n");  
   
     while (!terminated) {  
         counter++;  
         sleep(1);  
         printf("\r%ld seconds without signal..", counter);  
         fflush(stdout);  
     }  
   
     printf("\nLoop terminated\n");  
   
     return 0;  
 }

ഇവിടെ SIGINT എന്ന സിഗ്നല്‍ ഹാന്‍ഡില്‍ ചെയ്യാന്‍ sigint_handler എന്ന ഫങ്ങ്ഷനെ രെജിസ്റ്റര്‍ ചെയ്യുകയാണ് signal ഫങ്ങ്ഷന്‍ ഉപയോഗിച്ച് ചെയ്യുന്നത്. terminated എന്ന വേരിയബിളിന്റെ മൂല്യം പൂജ്യമല്ലാതാകുന്നത് വരെ മെയിന്‍ ഫങ്ങ്ഷനിനെ while ലൂപ്പ് പ്രവര്‍ത്തിച്ച് കൊണ്ടിരിക്കുന്നു. ഇവിടെ terminated എന്ന വേരിയബിളിന്റെ ഡാറ്റ ടൈപ്പ് ശ്രദ്ധിക്കുക. volatile sig_atomic_t എന്ന പ്രത്യേക ഡാറ്റാ ടൈപ്പ് ആണ് ഉപയോഗിച്ചിരിക്കുന്നത്. ഇതിലെ volatile എന്ന് കീവേര്‍ഡ് ആ ചരത്തിന് ചില പ്രത്യേകതകള്‍ നല്‍കുന്നതാണ്. ആ ചരത്തിന്റെ മൂല്യം പ്രോഗ്രാമില്‍ എവിടെ വേണമെങ്കിലും മാറ്റം വരാവുന്നതാണെന്നും അതിനാല്‍ തന്നെ ഒരു രീതിയിലുള്ള ഓപ്‌‌റ്റിമൈസേഷനും ആ വേരിയബിളിന്റെ മേല്‍ നടത്തരുതെന്നും ആ വേരിയബിള്‍ ആവശ്യമാകുമ്പോളൊക്കെ അതിനെ പ്രത്യേകം വായിക്കണം എന്നും സി കമ്പൈലറിനോട് പറയുന്നതാണത്. സിഗ്നലുകള്‍ റേസ് കണ്ടീഷന്‍സ് എന്ന പ്രശ്നത്തില്‍ നിന്ന് മുക്തമല്ലെന്ന് മാത്രമല്ല ആ പ്രശ്നത്തിന്റെ കാഠിന്യം നന്നായി അനുഭവിക്കുന്നവയും ആണ്. സ്വീകരിക്കപ്പെട്ട ഒരു സിഗ്നല്‍ കൈകാര്യം ചെയ്യപ്പെടുന്ന അവസരത്തില്‍ മറ്റൊരു സിഗ്നല്‍ സ്വീകരിക്കപ്പെട്ടാല്‍ സംഭവിക്കാവുന്ന പല പ്രശ്നങ്ങളും ഉണ്ട്. ഉദാഹരണത്തിന് ഒരു സിഗ്നല്‍ എത്ര തവണ പ്രോഗ്രാം കൈകാര്യം ചെയ്തു എന്നറിയാന്‍ ഒരു കൗണ്ടര്‍ ഉപയോഗിക്കുന്നു എന്ന് കരുതുക. ഓരോ കൈകാര്യം ചെയ്യലിലും അതിന്റെ മൂല്യം ഒന്ന് വീതം വര്‍ദ്ധിക്കുകയും ഒരു പ്രത്യേക മൂല്യം എത്തുമ്പോള്‍ ഒരു കാര്യം ചെയ്യേണ്ടതും ആണെന്ന് കരുതൂ. അതായത് ആ കൗണ്ടറിന്റെ മൂല്യം നാലിന്റെ ഗുണിതങ്ങളാകുമ്പോള്‍ ഒരു സന്ദേശം ഉപയോക്താവിനെ കാണിക്കണം. കൗണ്ടറിലെ മൂല്യം 3 ആയിരിക്കുമ്പോള്‍ പ്രോഗ്രാം സിഗ്നല്‍ സ്വീകരിക്കുകയും അതിന്റെ മൂല്യം 4 ആക്കുകയും ചെയ്തു എന്ന് കരുതുക. അതിന്റെ മൂല്യം നാലിന്റെ ഗുണിതമാണോ എന്ന് പരിശോധിക്കാനുള്ള നിര്‍ദ്ദേശത്തിന്റെ തൊട്ട് മുന്‍പേ കെര്‍ണല്‍ ഷെഡ്യൂളിങ്ങ് നടത്തുകയാണെങ്കില്‍ ആ പ്രോസസ്സ് താല്‍ക്കാലികമായി പ്രവര്‍ത്തനം നിര്‍ത്തും. വീണ്ടും പ്രവര്‍ത്തനം തുടങ്ങുന്നതിനു മുന്‍പേ ഒരിക്കല്‍ കൂടി ആ സിഗ്നല്‍ സ്വീകരിക്കപ്പെട്ടാല്‍ വീണ്ടും ആ നിര്‍ദ്ദേശത്തിലെത്തുമ്പോള്‍ ആ കൗണ്ടറിന്റെ മൂല്യം 5 ആയിട്ടുണ്ടാകും. ഷെഡ്യൂളിങ്ങ് നടന്നില്ലെങ്കില്‍ പോലും മൂല്യം വര്‍ദ്ധിപ്പിക്കുന്ന നിര്‍ദ്ദേശം പ്രവര്‍ത്തിക്കുമ്പോള്‍ അടുത്ത സിഗ്നല്‍ വന്നാലും ഈ പ്രശ്നം ഉണ്ടാകാം. sig_atomic_t ആ ചരത്തിന്റെ ഉപയോഗത്തെ ഒരു ആറ്റോമിക് ഓപ്പറേഷന്‍ ആയി നടത്തണം എന്ന് ജിസിസി കമ്പൈലറിനോട് ആവശ്യപ്പെടും. ഒരു പരിധി വരെ പ്രശ്നങ്ങള്‍ ഇതുവഴി പരിഹരിക്കാം. 

ഇനി SIGINT എന്ന സിഗ്നലിനെ കണ്ടില്ലെന്ന് നടിക്കുന്നതെങ്ങനെ എന്ന് നോക്കാം
 #include <stdio.h>  
 #include <signal.h>  
 #include <unistd.h>  
   
 volatile sig_atomic_t terminated = 0;  
   
 int main(void)  
 {  
     unsigned long counter = 0;  
   
     signal(SIGINT, SIG_IGN);  
   
     printf("Entering an infinit loop..\n");  
   
     while (!terminated) {  
         counter++;  
         sleep(1);  
         printf("\r%ld seconds without signal..", counter);  
         fflush(stdout);  
     }  
   
     printf("\nLoop terminated\n");  
   
     return 0;  
 }  
ഇവിടെ SIG_IGN എന്നതാണ് signal ഫങ്ങ്ഷന്റെ രണ്ടാമത്തെ ആര്‍ഗ്യുമെന്റ്. പരാമര്‍ശിക്കപ്പെട്ട സിഗ്നലിനെ ഇഗ്നോര്‍ ചെയ്യുക എന്നതാണ് ഇതിന്റെ അര്‍ഥം. ഈ പ്രോഗ്രാം പ്രവര്‍ത്തിക്കുമ്പോള്‍ CTRL+C അമര്‍ത്തിയാല്‍ ഒന്നും സംഭവിക്കില്ലെന്ന് കാണാം. എന്നാല്‍ ആദ്യത്തെ പ്രോഗ്രാം അതോടെ ലൂപ്പില്‍ നിന്ന് പുറത്ത് വരുമായിരുന്നു. ഇനി ഈ പ്രോഗ്രാമിന്റെ പ്രവര്‍ത്തനം അവസാനിപ്പിക്കാന്‍ ഒരു പുതിയ ടെര്‍മിനല്‍ തുറന്ന് ps -e കമാന്റ് ഉപയോഗിച്ച് അതിന്റെ പിഐഡി കണ്ടുപിടിക്കുക. അതിന് ശേഷം kill -9 <pid> ഉപയോഗിച്ച് SIGKILL എന്ന സിഗ്നല്‍ അതിലേക്ക് അയക്കാം. അപ്പോള്‍ ആ പ്രോസസ്സ് killed എന്ന് ടെര്‍മിനലില്‍ കാണിക്കും. SIGKILL സിഗ്നലിന്റെ സംഖ്യ 9 ആണ്. kill -l വഴി വിവിധ സിഗ്നലുകളുടെ സംഖ്യകള്‍ കണ്ട് പിടിച്ച് 9 നു പകരം ഉപയോഗിച്ച് എന്ത് സംഭവിക്കുന്നു എന്ന് നോക്കൂ.. 

പോസിക്സ് സിഗ്നലുകളെ വികസിപ്പിച്ചാണ് ജിറ്റികെ പോലെയുള്ള യുഐ ലൈബ്രറികള്‍ ഈവന്റ് മെക്കാനിസം പ്രായോഗികമാക്കിയതെന്ന് പറയപ്പെടുന്നു..

ഇന്റര്‍ പ്രോസസ്സ് കമ്യൂണിക്കേഷന്‍

എല്ലാ മള്‍ട്ടി പ്രോസസ്സ് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റങ്ങളിലും ഒന്നിലധികം പ്രോസസ്സുകള്‍ ഒരേ സമയത്ത് പ്രവര്‍ത്തിക്കുന്നുണ്ടാകും. ചില അവസരങ്ങളില്‍ ഈ പ്രോസസ്സുകള്‍ക്ക് പരസ്പരം വിവരങ്ങള്‍ കൈമാറേണ്ട ആവശ്യം വരും. ഇങ്ങനെയുള്ള വിവര കൈമാറ്റങ്ങളെ ഇന്റര്‍ പ്രോസസ്സ് കമ്യൂണിക്കേഷന്‍ എന്ന് പറയുന്നു. ഇതിന് വിവിധ മാര്‍ഗ്ഗങ്ങള്‍ ഉണ്ട്. യൂണിക്സ് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന്റെ ആദ്യകാല കമേര്‍ഷ്യല്‍ പതിപ്പുകളില്‍ ഒന്നായ സിസ്റ്റം വി (System V - വായിക്കുന്നത് സിസ്റ്റം ഫൈവ്) ആണ് ഇക്കാര്യത്തില്‍ അടിസ്ഥാന മാനദണ്ഡമായി പരിഗണിക്കപ്പെടുന്നവയില്‍ ഒന്ന്. SysV യില്‍ ഉണ്ടായിരുന്ന ഐ പി സി മെക്കാനിസങ്ങളെ SysV IPC Mechanisms എന്ന് വിളിക്കുന്നു. അതില്‍ ഉണ്ടായിരുന്നതിലധികം  സംവിധാനങ്ങള്‍ ഇന്ന് ലിനക്സിലടക്കം ഉണ്ട്.

രണ്ട് പ്രോഗ്രാമുകള്‍ക്ക് പരസ്പരം  വിവരങ്ങള്‍ കൈമാറാന്‍ അവയെ വെറുതെ ഒരു ഫയലില്‍ എഴുതി അടുത്ത പ്രോഗ്രാമിന് വായിക്കാനായി കൊടുക്കാവുന്നതാണ്. എന്നാല്‍ ഇതിനൊന്നും  പൊതുവായ മാനദണ്ഡങ്ങള്‍ ഇല്ല. കൂടാതെ ഒരു പ്രോസസ്സിനോട്‌ ഒരു പ്രത്യേക രീതിയില്‍ പെരുമാറാന്‍ ആവശ്യപ്പെടുക, സിസ്റ്റത്തില്‍ നടന്നിരിക്കുന്ന വിവിധ സംഭവങ്ങളെപ്പറ്റി അവക്ക് പൊതുവായ വിവരങ്ങള്‍ കൈമാറുക, ഒരു പ്രത്യേക സാഹചര്യം  ഉണ്ടാകുന്നത് വരെ കാത്തിരിക്കാന്‍ ആവശ്യപ്പെടുക തുടങ്ങി വിവിധ കാര്യങ്ങള്‍ ചെയ്യേണ്ടതായി വരും. ലഭ്യമായ വിവിധ ഐപിസി മെക്കാനിസങ്ങള്‍ താഴെ ചേര്‍ക്കുന്നു. ഇവയെപ്പറ്റി വിശദമായി ഓരോ പോസ്റ്റുകള്‍ ഇടാം.
  1. പൈപ്പുകള്‍ (pipe)
    1. പേരുള്ളവ (named pipes)
    2. പേരില്ലാത്തവ (unnamed pipes)
  2. സോക്കറ്റുകള്‍ (socket)
  3. സിഗ്നലുകള്‍ (signal)
  4. മെസ്സേജ് ക്യൂ (message queue)
  5. ഷെയേര്‍ഡ് മെമ്മറി (shared memory)
  6. സെമാഫോറുകള്‍ (semaphore)
പൈപ്പുകള്‍
വെള്ളവും മറ്റും  കൊണ്ടുപോകുന്ന പൈപ്പുകള്‍ പോലെ തന്നെയാണ് ഇവയുടെ പ്രവര്‍ത്തനം. ഇവക്ക് രണ്ട് അഗ്രങ്ങള്‍ ഉണ്ടായിരിക്കും. ഒരു വശത്തുകൂടി പോകുന്ന വിവരങ്ങള്‍ മറുവശത്ത് ലഭ്യമാകുന്നു. പേരുള്ള പൈപ്പുകള്‍ ആ പേര് അറിയാവുന്ന പ്രോസസ്സുകള്‍ക്ക് എല്ലാം  ഉപയോഗിക്കാം. എന്നാല്‍ പേരില്ലാത്തവ അതിനെ നിര്‍മ്മിച്ച പ്രോസസ്സിനും അതിന്റെ ചൈല്‍ഡ് പ്രോസസ്സുകള്‍ക്കും  മാത്രമേ ലഭ്യമാവുകയുള്ളു.

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

സിഗ്നലുകള്‍
സിഗ്നലുകള്‍ വഴി പ്രോസസ്സുകള്‍ക്ക് പരസ്പരം വിവരങ്ങള്‍കൈമാറാന്‍ സാധിക്കുകയില്ല. എന്നാല്‍ വിവിധ സാഹചര്യങ്ങളെക്കുറിച്ച് മറ്റ് പ്രോസസ്സുകള്‍ക്ക് അറിയിപ്പ് കൊടുക്കാന്‍ സിഗ്നലുകള്‍ വഴി സാധിക്കും. ഒരു പ്രോഗ്രാമിന്റെ വിവിധ അവസ്ഥകളെക്കുറിച്ച് ആ പ്രോഗ്രാമിനെ അറിയിക്കാന്‍ കെര്‍ണലിനും സിഗ്നലുകള്‍ വഴി സാധിക്കും.

മെസ്സേജ് ക്യൂ
അധികം വലിപ്പമില്ലാത്ത വിവരങ്ങള്‍ പ്രോസസ്സുകള്‍ക്ക് പരസ്പരം കൈമാറ്റം ചെയ്യാന്‍ മെസ്സേജ് ക്യൂ വഴി സാധിക്കും. പ്രോസസ്സുകള്‍ ക്യൂവിലേക്ക് മെസ്സേജുകള്‍ അയക്കുകയും ക്യൂവില്‍ നിന്ന് മെസ്സേജുകള്‍ സ്വീകരിക്കുകയും ചെയ്യും.

ഷെയേര്‍ഡ് മെമ്മറി
പ്രധാന മെമ്മറിയിലെ ഒരു ഭാഗം ഒന്നോ അതിലധികമോ പ്രോസസ്സുകള്‍ പങ്കിട്ട് ഉപയോഗിക്കുന്ന രീതിയിലാണ് ഇതിന്റെ രൂപകല്‍പ്പന. ഇത് വിവരങ്ങള്‍ പരസ്പരം കൈമാറാന്‍ ഏറ്റവും വേഗതയുള്ള രീതിയാണ്.

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

ലിനക്സ് അധിഷ്ഠിത സിസ്റ്റങ്ങള്‍ ഉപയോഗിക്കുന്നവര്‍ക്ക്  ipcs കമാന്റ് ഉപയോഗിച്ച് സിസ്റ്റത്തില്‍ വിവിധ പ്രോസസ്സുകള്‍ ഉപയോഗിച്ചുകൊണ്ടിരിക്കുന്ന ഐ പി സി മെക്കാനിസങ്ങളെക്കുറിച്ചുള്ള വിവരങ്ങള്‍ കാണാന്‍ സാധിക്കും. ഈ കമാന്റിന്റെ കൂടുതല്‍ വിവരങ്ങള്‍ക്ക് man ipcs ഉപയോഗിക്കുക.

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

Wednesday, October 24, 2012

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

പ്രോസസ്സുകളെക്കുറിച്ചുള്ള വിവരങ്ങള്‍ രണ്ട് വിഭാഗങ്ങളിലായി ആണ് സൂക്ഷിക്കപ്പെട്ടിരിക്കുന്നത്. പ്രോസസ്സ് ടേബിളും യു-ഏരിയയും. പ്രോസസ്സിനെക്കുറിച്ച് കെര്‍ണലിന് ആവശ്യമുള്ള വിവരങ്ങള്‍ പ്രോസസ്സ് ടേബിളില്‍ സൂക്ഷിച്ചിരിക്കും. പ്രോസസ്സിന് തന്നെ ആവശ്യമുള്ള വിവരങ്ങള്‍ യു-ഏരിയയിലും സൂക്ഷിച്ചിരിക്കും.

പ്രോസസ്സ് ടേബിള്‍ എന്‍ട്രി
കെര്‍ണല്‍ സൂക്ഷിക്കുന്ന പ്രോസസ്സുകളുടെ പട്ടികയാണ് പ്രോസസ്സ് ടേബിള്‍. കെര്‍ണല്‍ എങ്ങനെയാണ് പ്രോസസ്സുകളെ കൈകാര്യം ചെയ്യുന്നത് എന്ന് മനസ്സിലാക്കാന്‍ പ്രോസസ്സ് ടേബിളിനെക്കുറിച്ചൂള്ള വിവരങ്ങള്‍ സഹായകമായിരിക്കും.

പ്രോസസ്സ് ടേബിള്‍ ഒരു സര്‍ക്കുലാര്‍ ഡബ്ലി ലിങ്ക്ഡ് ലിസ്റ്റ് ആണ്. (Circular Doubly Linked List). ഇതില്‍ ഏത് പ്രോസസ്സിന്റെ എന്‍ട്രിയില്‍ നിന്ന് ആരംഭിച്ചാലും മുന്നിലേക്കോ പിന്നിലേക്കോ പോയി എല്ലാ പ്രോസസ്സുകളുടെയും  എന്‍ട്രികളിലൂടെ പോയി വരാന്‍ സാധിക്കും. ഒരു പ്രോസസ്സിന്റെ പ്രോസസ്സ് ടേബിള്‍ എന്‍ട്രിയില്‍ ഉള്ള വിവരങ്ങളില്‍ ചിലത് താഴെക്കൊടുക്കുന്നു.
1.പ്രോസസ്സിന്റെ അവസ്ഥ. യൂണിക്സിലെ വിവിധ പ്രോസസ്സ് അവസ്ഥകള്‍ വിശദമാക്കുന്ന ചിത്രം താഴെക്കൊടുത്തിരിക്കുന്നു.
2. പ്രോസസ്സ് ഐഡി
3. വിവിധ യൂസര്‍ ഐഡികള്‍ - ഇവ ഉപയോഗിച്ചാണ് ഒരു പ്രോസസ്സിനുള്ള അനുമതികള്‍ തീരുമാനിക്കപ്പെടുന്നത്.
4. പ്രോസസ്സിലും ഷെയേര്‍ഡ് ലൈബ്രറികളിലുമായി ഉള്ള ടെക്സ്റ്റ് സെഗ്‌‌മെന്റുകളിലേക്കുള്ള പോയിന്ററുകള്‍.
5. മെമ്മറി മാനേജ്‌‌മെന്റ് ആവശ്യങ്ങള്‍ക്കായി പേജ് ടേബിളിലേക്കുള്ള പോയിന്ററുകള്‍.
6. ഷെഡ്യൂളിങ്ങിന് ആവശ്യമായ വിവരങ്ങള്‍. ലിനക്സ് സിസ്റ്റങ്ങളില്‍ പ്രോസസ്സുകള്‍ക്ക് 'നൈസ് വാല്യു' എന്നറിയപ്പെടുന്ന മൂല്യങ്ങള്‍ നല്‍കിയിരിക്കും. പ്രോസസ്സ് ഷെഡ്യൂളിങ്ങിന്റെ സമയത്ത് ഏതൊക്കെ പ്രോസസ്സുകള്‍ക്ക് പ്രാധാന്യം നല്‍കണം എന്ന് തീരുമാനിക്കപ്പെടുന്നത് ഈ മൂല്യത്തിന്റെ അടിസ്ഥാനത്തിലാണ്.
7. വിവിധ ടൈമറുകള്‍. ഓരോ പ്രോസസ്സിനും പ്രവര്‍ത്തിക്കാന്‍ സി പി യു വില്‍ സമയ പരിധികള്‍ തീരുമാനിക്കപ്പെട്ടിരിക്കും. ഈ പരിധികള്‍ പാലിക്കാനും പ്രോസസ്സ് എത്ര സമയം ഏതൊക്കെ മോഡില്‍ പ്രവര്‍ത്തിച്ചു എന്നൊക്കെ കണക്കാക്കാനും ഈ ടൈമറുകള്‍ ഉപയോഗിക്കപ്പെടുന്നു.
8. പ്രോസസ്സിന്റെ യു-ഏരിയയിലേക്കുള്ള പോയിന്റര്‍.

യു-ഏരിയ
പ്രോസസ്സിന്റെ യു-ഏരിയയില്‍ ഉള്‍പ്പെടുത്തിയിരിക്കുന്ന കാര്യങ്ങള്‍ ചുവടെ ചേര്‍ക്കുന്നു.
1. റിയല്‍ യൂസര്‍ ഐഡി, എഫക്റ്റീവ് യൂസര്‍ ഐഡി.
2. പ്രോഗ്രാമിന്റെ വര്‍ക്കിങ്ങ് ഡയറക്ടറി (ഒരു പ്രോഗ്രാം പ്രവര്‍ത്തിക്കുന്നത് ഒരു സമയത്ത് ഫയല്‍ സിസ്റ്റത്തിലെ ഏതെങ്കിലും  ഒരു ഡയറക്ടറിയില്‍ ആയിരിക്കും. ഇതിന് പ്രോഗ്രാമുമായി നേരിട്ട് ബന്ധമൊന്നുമില്ലെങ്കിലും ആ ഡയറക്ടറിയില്‍ ഉള്ള ഫയലുകള്‍ ഉപയോഗിക്കാന്‍ മുഴുവന്‍ പാത്ത് നല്‍കാതെ ഫയലിന്റെ പേര് മാത്രം ഉപയോഗിച്ചാല്‍ മതിയാകും)
3. യൂസര്‍ മോഡിലും  കെര്‍ണല്‍ മോഡിലുമായി പ്രോഗ്രാം  ചെലവിട്ട സമയം കണക്കാക്കുന്നതിനായുള്ള ടൈമറുകള്‍.
4. പ്രോഗ്രാം സിഗ്നലുകളോട് എങ്ങനെ പ്രതികരിക്കണം എന്നതിനെ സംബന്ധിച്ച വിവരങ്ങള്‍.
5. പ്രോഗ്രാമുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന കണ്ട്രോളിങ്ങ് ടെര്‍മിനലിനെ സംബന്ധിച്ച വിവരങ്ങള്‍.
6. പ്രോഗ്രാം നടത്തിയ സിസ്റ്റം കോളൂകളെ സംബന്ധിച്ച വിവരങ്ങള്‍.
7. യൂസര്‍ ഫയല്‍ ഡിസ്ക്രിപ്റ്റര്‍ ടേബിള്‍ - ഒരു പ്രോഗ്രാം തുറക്കുന്ന ഫയലുകളുടെ ഡിസ്ക്രിപ്റ്ററുകളുടെ പട്ടിക.
8. ഫയല്‍ സിസ്റ്റത്തെയും പ്രോസസ്സ് എന്‍വയോണ്‍മെന്റിനെയും സംബന്ധിച്ച വിവരങ്ങള്‍യ്

യൂസര്‍ ഐഡികള്‍
ഫയലുകള്‍ക്ക് ഉള്ളത് പോലെ തന്നെ പ്രോസസ്സുകള്‍ക്കും യൂസറും ഗ്രൂപ്പും ഒക്കെ ഉണ്ട്. ഇത് കൂടാതെ സെഷനും. പ്രോസസ്സുകള്‍ക്കുള്ള വിവിധ യൂസര്‍/ഗ്രൂപ്പ് ഐഡികള്‍ എന്നിവ ചുവടെ. സിസ്റ്റത്തില്‍ ഉള്ള ഓരോ ഉപയോക്താവിന്റെയും ഗ്രൂപ്പിന്റെയും പേരുകള്‍ ഒരു യൂസര്‍ ഐഡിയും ഗ്രൂപ്പ് ഐഡിയും ആയി ബന്ധപ്പെട്ടിരിക്കുന്നു. എല്ലാ സമയത്തും മുഴുവന്‍ പേരും ഉപയോഗിക്കാനുള്ള വിഷമം പരിഗണിച്ചാണ് ഓരോ പേരുകളുമായി ബന്ധപ്പെട്ട് സംഘ്യകള്‍ നല്‍കിയിരിക്കുന്നത്. ഇതിനെപ്പറ്റിയുള്ള വിവരങ്ങള്‍ അടങ്ങിയിരിക്കുന്നത് /etc/passwd, /etc/group എന്നീ ഫയലുകളില്‍ ആണ് ഉണ്ടായിരിക്കുക.

റിയല്‍ യൂസര്‍ ഐഡി
ഇത് ഒരു പ്രോസസ്സ് തുടങ്ങിവച്ച ഉപയോക്താവിന്റെ ഐഡി ആയിരിക്കും. ഒരു പ്രോസസ്സ് ആരംഭിച്ച ശേഷം സെറ്റ്‌‌യുഐഡി വഴി അതിന്റെ യൂസര്‍ ഐഡി മാറ്റിയേക്കാം. എന്നാലും റിയല്‍ യൂസര്‍ ഐഡി പഴയത് തന്നെ ആയിരിക്കും. ഈ പ്രോസസ്സ് ഉണ്ടാക്കുന്ന ഫയലുകള്‍ക്കോ പ്രോസസ്സിന്റെ അനുമതികള്‍ക്കോ റിയല്‍ യൂസര്‍ ഐഡി ഉപയോഗിക്കാറില്ല. എന്നാല്‍ മറ്റ് പ്രോസസ്സുകള്‍ക്ക് സിഗ്നലുകള്‍ അയക്കുമ്പോള്‍ പരിഗണിക്കുന്നത് റിയല്‍ യൂസര്‍ ഐഡി ആണ്‍. സൂപ്പര്‍യൂസര്‍ അനുമതികളില്ലാത്ത ഒരു പ്രോസസ്സിന് അതിന്റെ റിയല്‍ യൂസര്‍ ഐഡി തന്നെയുള്ള പ്രോസസ്സുകള്‍ക്കേ സിഗ്നലുകള്‍ അയക്കാന്‍ സാധിക്കുകയുള്ളു.

എഫക്റ്റീവ് യൂസര്‍ ഐഡി
ഒരു പ്രോസസ്സ് സൃഷ്ടിക്കപ്പെട്ട ശേഷം സെറ്റ്‌‌യുഐഡി ഉപയോഗിച്ച് ആ പ്രോസസ്സിന്റെ എഫക്റ്റീവ് യൂസര്‍ ഐഡി റിയല്‍ യൂസര്‍ ഐഡിയില്‍ നിന്ന് മാറ്റാന്‍ സാധിക്കും. ഒരു പ്രോസസ്സ് ഫയലുകള്‍ നിര്‍മ്മിക്കുകയോ ഏതെങ്കിലും  ഒരു റിസോഴ്സ് ഉപയോഗിക്കാന്‍ ശ്രമിക്കുകയോ ചെയ്യുമ്പോള്‍ ആ പ്രോസസ്സിന്റെ എഫക്റ്റീവ് യൂസര്‍ ഐഡി ആണ് പരിഗണിക്കപ്പെടുക.

ഗ്രൂപ്പ് ഐഡികളും മേല്‍പ്പറഞ്ഞത് പോലെ തന്നെ. യൂസറിന് പകരം യൂസര്‍ ഉള്‍പ്പെടുന്ന ഗ്രൂപ്പിന്റെ ഐഡി ആയിരിക്കും പരിഗണിക്കപ്പെടുക. താഴെക്കൊടുത്തിരിക്കുന്ന പ്രോഗ്രാം പ്രോസസ്സിന്റെ യൂസര്‍ ഐഡി, ഗ്രൂപ്പ് ഐഡി തുടങ്ങിയവ കാണിച്ചു തരും. sudo ഉപയോഗിക്കാതെ റണ്‍ ചെയ്താല്‍ setuid പ്രവര്‍ത്തിക്കില്ല. 65534 nobody എന്ന യൂസറിന്റെ ഐഡി ആണ്. ലഭ്യമായ യൂസര്‍ ഐഡികള്‍ക്കായി /etc/passwd ഫയല്‍ തുറന്ന് നോക്കുക. സെറ്റ്‌‌യുഐഡി റിയല്‍ യൂസര്‍ ഐഡി മാറ്റുന്നില്ല എന്ന് ഈ പ്രോഗ്രാം  പ്രവര്‍ത്തിക്കുമ്പോള്‍ മനസ്സിലാക്കാം.

 #include <stdio.h>  
 #include <unistd.h>  
   
 int main(void)   
 {  
     printf("The real user of this process has ID %d\n",getuid());  
     printf("The effective user of this process has ID %d\n",geteuid());  
     printf("The real user group ID for this process is %d\n",getgid());  
     printf("The effective user group for this process is %d\n",getegid());  
   
     setuid(65534);  
   
     printf("The real user of this process has ID %d\n",getuid());  
     printf("The effective user of this process has ID %d\n",geteuid());  
     printf("The real user group ID for this process is %d\n",getgid());  
     printf("The effective user group for this process is %d\n",getegid());  
   
     return 0;  
 }  

പ്രോസസ്സ് സെഷന്‍
എല്ലാ പ്രോസസ്സുകളും  ഒരു പ്രോസസ്സ് സെഷന്റെ ഭാഗമായിരിക്കും. മിക്കവാറും സിസ്റ്റം പ്രവര്‍ത്തിച്ച് തുടങ്ങുമ്പോള്‍ ഉള്ള ലോഗിന്‍ പ്രോസസ്സ് ആയിരിക്കും ഒരു സെഷന്‍ ആരംഭിക്കുക. അതിന്റെ ചൈല്‍ഡ് പ്രോസസ്സുകള്‍ ഒക്കെ ആ സെഷനില്‍ ആയിരിക്കും. ഒരു സെഷനിലെ ആദ്യത്തെ പ്രോസസ്സ് ആണ് സെഷന്‍ ലീഡര്‍ എന്നറിയപ്പെടുന്നത്. സെഷന്‍ ഐഡി സെഷന്‍ ലീഡറിന്റെ പിഐഡി ആയിരിക്കും. എല്ലാ പ്രോസസ്സ് സെഷനുകള്‍ക്കും ഒരു കണ്ട്രോളിങ്ങ് റ്റിറ്റിവൈ ഉണ്ടായിരിക്കും. ഇതിനെ ടെര്‍മിനല്‍ എന്ന് വിളിക്കാം. ആദ്യകാലത്ത് ഒരു പ്രധാന കമ്പ്യൂട്ടറുമായി ഘടിപ്പിക്കപ്പെട്ടിരുന്ന ഉപകരണങ്ങളായിരുന്നു ടെര്‍മിനലുകള്‍. ഒന്നിലധികം ടെര്‍മിനലുകള്‍ ഉപയോഗിച്ച് ഒന്നിലധികം ഉപയോക്താക്കള്‍ ഒരേ കമ്പ്യൂട്ടര്‍ തന്നെ പ്രവര്‍ത്തിപ്പിച്ചിരുന്നു. ps -e കമാന്റ് ഉപയോഗിച്ച് സിസ്റ്റത്തിലെ പ്രോസസ്സുകളും അവയുടെ TTY ഉം  കാണാന്‍ സാധിക്കും. ചില പ്രോസസ്സുകള്‍ക്ക് കണ്ട്രോളിങ്ങ് ടെര്‍മിനല്‍ കാണില്ല. അവയെക്കുറിച്ച് പിന്നീട് പറയാം. താഴെക്കൊടുത്തിരിക്കുന്ന പ്രോഗ്രാം അതിന്റെ സെഷന്‍ ഐഡി കാട്ടിത്തരും. അതിന് ശേഷം ps കമാന്റ് ഉപയോഗിച്ചാല്‍ ആ പ്രോഗ്രാമിനെ പ്രവര്‍ത്തിപ്പിച്ച ഷെല്ലിന്റെ പിഐഡി തന്നെയാണ് സെഷന്‍ ഐഡി എന്ന് കാണാം. അതിന്റെ കാരണം ഊഹിക്കാമല്ലോ..

 #include <stdio.h>  
 #include <stdlib.h>  
 #include <unistd.h>  
   
 int main(void)  
 {  
     printf("My session id is: %d\n", getsid(getpid()));  
   
     return 0;  
 }  

ഇന്റര്‍ പ്രോസസ്സ് കമ്യൂണിക്കേഷന്‍, സിഗ്നലുകള്‍ എന്നിവയെപ്പറ്റി അടുത്ത പോസ്റ്റ്..

Sunday, October 14, 2012

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

യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങളില്‍ ബൂട്ടിങ്ങിന് ശേഷം കെര്‍ണല്‍ തന്നെ നിര്‍മിക്കുന്ന പ്രോസസ്സാണ് ഇനിറ്റ്. ഇനിറ്റ് വരെ സിസ്റ്റം കെര്‍ണല്‍ മോഡിലായിരിക്കും. ഇനിറ്റ് പ്രവര്‍ത്തനമാരംഭിക്കുന്നതോടെ സിസ്റ്റം യൂസര്‍മോഡിലേക്ക് മാറുന്നു. ഇനിറ്റിന്റെ വകഭേദങ്ങളും  പ്രവര്‍ത്തനവും ഒരു പോസ്റ്റി വിശദീകരിക്കാം. ഇനിറ്റിനു ശേഷമുള്ള  എല്ലാ പ്രോസസ്സുകളും ഫോര്‍ക്ക് സിസ്റ്റം കോള്‍ ഉപയോഗിച്ച് സൃഷ്ടിക്കപ്പെടുന്നവയാണ്. ഇനിറ്റ് പ്രോസസ്സ് ഷെല്ലുകളോ ഗ്രാഫിക്കല്‍ യൂസര്‍ ഇന്റര്‍ഫേസുകളോ എക്സിക്യൂട്ട് ചെയ്യുന്നു. അപ്പോള്‍ ഉപഭോക്താവിന് കമ്പ്യൂട്ടര്‍ പ്രവര്‍ത്തിപ്പിക്കാനുള്ള ഉപാധികള്‍ ലഭ്യമാകും. ഉപഭോക്താവ് കമാന്റുകളോ മൗസോ ഉപയോഗിച്ച് ഒരു പുതിയ പ്രോഗ്രാം തുറക്കുമ്പോള്‍ സംഭവിക്കുന്ന കാര്യങ്ങള്‍ എന്തൊക്കഎയാണെന്ന് നോക്കാം. ഷെല്ലോ ഗ്രാഫിക്കല്‍ ഇന്റര്‍ഫേസോ ആദ്യം ഫോര്‍ക്ക് സിസ്റ്റം കോള്‍ ഉപയോഗിച്ച് അതിന്റെ തന്നെ ഒരു കോപ്പി നിര്‍മ്മിക്കുന്നു. ഈ കോപ്പി നിര്‍മ്മിക്കപ്പെടുന്ന വഴി ഇങ്ങനെയാണ്.
1. ഫോര്‍ക്ക് സിസ്റ്റം കോള്‍ ഉപയോഗിക്കപ്പെടുമ്പോള്‍ സിസ്റ്റം യൂസര്‍ മോഡില്‍ നിന്ന് കെര്‍ണല്‍ മോഡിലേക്ക് മാറുന്നു.
2. കെര്‍ണലിന്റെ സിസ്റ്റം കോള്‍ ഇന്റര്‍ഫേസ് ഫോര്‍ക്ക് സിസ്റ്റം കോളിലെ നിര്‍ദ്ദേശങ്ങള്‍ പ്രവര്‍ത്തിപ്പിക്കാന്‍ ആരംഭിക്കുന്നു.
3. സിസ്റ്റത്തില്‍  ഓരോ ഉപയോക്താവിനും ഒരു സമയത്ത് പ്രവര്‍ത്തിപ്പിക്കാനാകുന്ന പ്രോസസ്സുകളുടെ എണ്ണം തീരുമാനിക്കപ്പെട്ടിട്ടുണ്ടെങ്കില്‍ ആ പരിധി പാലിക്കപ്പെട്ടിട്ടുണ്ടോ എന്ന് പരിശോധിക്കപ്പെടുന്നു.
4. ഒരു പ്രോസസ്സ് ആരംഭിക്കാനാവശ്യമായ വിഭവങ്ങള്‍ സിസ്റ്റത്തില്‍ ബാക്കിയുണ്ടോ എന്ന് പരിശോധിക്കപ്പെടുന്നു (മെമ്മറി ഇതില്‍ പ്രധാനമാണ്)
5. പുതിയ ഒരു എന്‍ട്രി പ്രോസസ്സ് ടേബിളില്‍ സൃഷ്ടിക്കപ്പെടുന്നു. യു-ഏരിയക്കായി മെമ്മറി തയ്യാറാക്കുന്നു.
6. ഫോര്‍ക്ക് ഉപയോഗിച്ച പ്രോസസ്സിന്റെ ടെക്സ്റ്റ്, ഡാറ്റ, സ്റ്റാക്ക്, ഹീപ്പ് എന്നിവയുടെ കോപ്പി തയ്യാറാക്കപ്പെടുന്നു. ഇവിടെ ശരിക്കും കോപ്പി ഉണ്ടാക്കുകയില്ല. ടെക്സ്റ്റ് സെഗ്മന്റ് ആദ്യത്തെ പ്രോസസ്സിന്റെ തന്നെ ഉപയോഗിക്കപ്പെടും. ശരിക്കും കോപ്പികള്‍ ഉണ്ട് എന്ന് തോന്നിപ്പിക്കുകയും  അവിടെ പഴയ സെഗ്മെന്റുകളുടെ വിലാസം രേഖപ്പെടുത്തുകയും ആണ് ചെയ്യുന്നത്. സ്റ്റാക്ക്, ഡാറ്റ, ഹീപ്പ് സെഗ്മന്റുകള്‍ ടെക്സ്റ്റ് സെഗ്മന്റില്‍ നിന്നും വ്യത്യസ്തമായി മാറ്റങ്ങള്‍ വരുത്താന്‍ അനുവദിക്കപ്പെട്ടവയായതിനാല്‍ അവിടെ കോപ്പി ഓണ് റൈറ്റ് എന്ന സങ്കേതം ഉപയോഗിക്കും. അതായത് അവയില്‍ മാറ്റങ്ങള്‍ വരുത്തപ്പെടുന്നത് വരെ ആദ്യമുണ്ടായിരുന്നവ തന്നെ ഉപയോഗിക്കുകയും മാറ്റങ്ങള്‍ വരുത്തപ്പെട്ട ശേഷം മാത്രം പുതിയ പതിപ്പ് സൃഷ്ടിക്കുകയും ചെയ്യുന്നു.

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

 #include <stdio.h>  
 #include <stdlib.h>  
 #include <unistd.h>  
   
 int main(void)  
 {  
     int pid;  
   
     pid = fork();  
     if (pid == -1) {  
         printf("fork failed..\n");  
         exit(-1);  
     }  
   
     if (pid == 0) {  
         printf("I am the child process. My PID is %d\n", getpid());  
         exit(0);  
     } else {  
         printf("I am the parent process PID is %d. Child PID is %d\n",getpid(), pid);  
     }  
   
     return 0;  
 }  

ഇതിനെ fork.c എന്ന ഫയലില്‍ സേവ് ചെയ്യുക. അതിനു ശേഷം ടെര്‍മിനലില്‍
gcc fork.c -o fork എന്ന് ടൈപ്പ് ചെയ്ത് എന്റര്‍ അമര്‍ത്തുക. പ്രവര്‍ത്തിപ്പിക്കാന്‍ ./fork എന്ന് ടൈപ്പ് ചെയ്ത് എന്റര്‍ അമര്‍ത്തുക. താഴെക്കാണുന്നതിന് സമാനമായ ഔട്ട്പുട്ട് ലഭിക്കും,
I am the parent process PID is 3691. Child PID is 3692
I am the child process. My PID is 3692
if സ്റ്റേറ്റ്മെന്റ് ഉപയോഗിക്കുമ്പോള്‍ സാധാരണയായി നിര്‍ദ്ദേശത്തിലെ ഒരു ഭാഗം മാത്രം പ്രവര്‍ത്തിക്കുന്നിടത്ത് ഇവിടെ രണ്ട് ഭാഗങ്ങളും പ്രവര്‍ത്തിക്കുന്നതായി കാണാം. ശരിക്കും  ഇത് രണ്ട് വ്യത്യസ്ത പ്രോസസ്സുകളില്‍ നിന്നാണ് വരുന്നത്. ആദ്യം ചൈല്‍ഡ്‌ പ്രവര്‍ത്തിക്കുമോ പേരന്റ് പ്രവര്‍ത്തിക്കുമോ എന്ന് പറയാന്‍ സാധിക്കുകയില്ല. സിസ്റ്റം കോള്‍ പൂര്‍ത്തിയായ ശേഷം പ്രോസസ്സ് വീണ്ടും യൂസര്‍ മോഡിലേക്ക് തന്നെ മടങ്ങി വരുന്നു.

ഒരു പുതിയ പ്രോസസ്സ് ഇവിടെ സൃഷ്ടിക്കപ്പെട്ടെങ്കിലും അത് ആദ്യത്തെ പ്രോസസ്സിന്റെ തന്നെ പകര്‍പ്പാണെന്ന് മനസ്സിലാക്കിയിരിക്കുമല്ലോ. എന്നാല്‍ നമുക്കാവശ്യം ഒരു പുതിയ പ്രോഗ്രാമിനെ പ്രവര്‍ത്തിപ്പിക്കലാണ്. ഇതിനായി ഉപയോഗിക്കുന്ന സിസ്റ്റം കോള്‍ ആണ് എക്സക്ക് (exec). ഈ സിസ്റ്റം കോള്‍ ചെയ്യുന്നത് അതിനെ ഉപയോഗിച്ച പ്രോസസ്സിന്റെ സെഗ്മന്റുകള്‍ മാറ്റി അവിടെ ഒരു പുതിയ പ്രോഗ്രാമില്‍ നിന്നുള്ള സെഗ്‌‌മന്റുകള്‍ ചേര്‍ക്കുകയാണ്. ഇതുവഴി ഒറിജിനല്‍ പ്രോസസ്സ് ഇല്ലാതാകുകയും പകരം പുതിയ പ്രോഗ്രാം പ്രോസസ്സായി അവിടെ വരികയും ചെയ്യുന്നു. ഇതിന്റെ പ്രവര്‍ത്തനം താഴെപ്പറയുന്നത് പോലെയാണ്.
1. എക്സെക്ക് സിസ്റ്റം കോള്‍ ഉപയോഗിക്കുമ്പോള്‍ പ്രതിപാദിക്കപ്പെട്ട എക്സിക്യൂട്ടബിള്‍ ഫയല്‍ ഡിസ്കില്‍ കണ്ടെത്തുക. (ഫയല്‍ അനുബന്ധമായ ക്രിയകളുടെ വിശദാംശങ്ങള്‍ക്കായി ഫയല്‍ സിസ്റ്റങ്ങളെക്കുറിച്ചുള്ള പോസ്റ്റുകള്‍ കാണുക)
2. ആ ഫയല്‍ സാധുവായ ഒരു പ്രോഗ്രാം ആണോ എന്ന് പരിശോധിക്കുക (elf ഫയലുകളെപ്പറ്റി നേരത്തെ പ്രദിപാദിച്ചിരുന്നു)
3. സാധുവായ ഒരു പ്രോഗ്രാം ആണെങ്കില്‍ അതില്‍ നിന്ന് വിവിധ സെഗ്മന്റുകളെക്കുറിച്ചുള്ള വിവരങ്ങള്‍ വായിക്കുകയും അവയെ മെമ്മറിയിലേക്ക് കൊണ്ടുവരികയും ചെയ്യുക.
4. നിലവിലെ സെഗ്മന്റുകളെ നശിപ്പിക്കുകയും അവക്ക് പകരം പുതിയ സെഗ്മെന്റുകള്‍ അവിടെ ചേര്‍ക്കുകയും ചെയ്യുക.
5. പുതിയ പ്രോഗ്രാമിന്റെ തുടക്കം മുതല്‍ പ്രവര്‍ത്തനം ആരംഭിക്കുക.

ഇവിടെ ശ്രദ്ധിക്കേണ്ട ഒരു പ്രധാന കാര്യം വിജയകരമായ ഒരു എക്സെക്ക് സിസ്റ്റം കോള്‍ ഫോര്‍ക്ക് സിസ്റ്റം കോള്‍ ചെയ്തതുപോലെ മൂല്യങ്ങളൊന്നും മടക്കി നല്‍കുന്നില്ല. ഒരു ഫങ്ങ്ഷന്‍ റിട്ടേണ്‍ ചെയ്യുന്നത് അതിനെ വിളിച്ച പ്രോസസ്സിലേക്കാണ്. ഇവിടെ എക്സെക്കിനെ വിളിച്ച പ്രോസസ്സ് ബാക്കിയില്ല. അവിടെ പുതിയ പ്രോഗ്രാം പ്രവര്‍ത്തനം തുടങ്ങിയിരിക്കുന്നു. അതിനാല്‍ തന്നെ വിജയകരമായ എക്സെക്കില്‍ നിന്ന് റിട്ടേണ്‍ ഇല്ല. (ഇത് മിക്കവാറും ഇന്റര്‍വ്യൂകളില്‍ ഒക്കെ ചോദിക്കാറുള്ള ഒരു ചോദ്യമാണ്) മുകളിലെ പ്രോഗ്രാമിനെ അല്‍പം പരിഷ്കരിച്ച് ls എന്ന പ്രോഗ്രാമിനെ എങ്ങനെ പ്രവര്‍ത്തിപ്പിക്കം എന്ന് നോക്കാം. ഷെല്ലുകള്‍ എങ്ങനെ പ്രവര്‍ത്തിക്കുന്നു എന്ന് മനസ്സിലാക്കാന്‍ ഇത് ഉപകരിക്കും. സി പ്രോഗ്രാമിങ്ങില്‍ എക്സെക്ക് നേരിട്ട് ഉപയോഗിക്കാന്‍ വിഷമമാണ്. അതിനാല്‍ സി ലൈബ്രറി നല്‍കുന്ന execl, execlp, execle, execv, execvp, execvpe എന്ന വകഭേദങ്ങളില്‍ ഒന്ന് ഉപയോഗിക്കാം. ഇവയൊക്കെ ഉള്ളില്‍ എക്സെക്ക് തന്നെയാണ് ഉപയോഗിക്കുന്നത്.

 #include <stdio.h>  
 #include <stdlib.h>  
 #include <unistd.h>  
   
 int main(void)  
 {  
     int pid, ret;  
   
     pid = fork();  
     if (pid == -1) {  
         printf("fork failed..\n");  
         exit(-1);  
     }  
   
     if (pid == 0) {    
         printf("I am the child process. Now executing ls\n");  
         ret = execl("/bin/ls", "ls", "/", NULL);  
         if (ret == -1) {   
             printf("exec failed\n");  
         }   
     } else {  
         printf("I am the parent process PID is %d. Child PID is %d\n",getpid(), pid);  
     }  
   
     return 0;  
 }  

ആദ്യത്തെ പ്രോഗ്രാമിനെ മേലെ കാണുന്നതുപോലെ മാറ്റുക. ബാക്കി നിര്‍ദ്ദേശങ്ങള്‍ പഴയത് തന്നെ. ഇവിടെ താരതമ്യേന എളുപ്പമുള്ള execl എന്ന രൂപമാണ് ഉപയോഗിച്ചിരിക്കുന്നത്. അതിലെ ആദ്യത്തെ പരാമീറ്റര്‍ എക്സിക്യൂട്ട് ചെയ്യണ്ട പ്രോഗ്രാമിന്റെ പാത്ത് ആണ്. ബാക്കിയുള്ളവ ആ പ്രോഗ്രാമിന് ഉള്ള ആര്‍ഗ്യുമെന്റുകള്‍. യൂണിക്സ് സിസ്റ്റങ്ങളില്‍ ഒരു പ്രോഗ്രാമിന്റെ ആദ്യത്തെ ആര്‍ഗ്യുമെന്റായി ആ പ്രോഗ്രാമിന്റെ തന്നെ പേര് നല്‍കുന്നതാണ് കീഴ്‌‌വഴക്കം. വിവിധ പേരുകളില്‍ ഉപയോഗിക്കുമ്പോള്‍ വിവിധ തരത്തില്‍ പ്രവര്‍ത്തിക്കുന്ന പ്രോഗ്രാമുകള്‍ തയ്യാറാക്കാന്‍ ഇതുവഴി സാധിക്കും. അതാണ് രണ്ടാമത്തെ ആര്‍ഗ്യുമെന്റായി ls എന്ന് തന്നെ കൊടുത്തിരിക്കുന്നത്. മൂന്നാമതെ ആര്‍ഗ്യുമെന്റ്‌‌ "/" ആണ്. / എന്ന പാത്തിലെ ഫയലുകളുടെ പട്ടിക നല്‍കാന്‍ ls പ്രോഗ്രാമിനോട് ആവശ്യപ്പെടുന്നതിനാണ് ഇത്. അവസാനമായി NULL എന്നത് സെന്റിനല്‍ ആര്‍ഗ്യുമെന്റ് അഥവാ സെന്റിനല്‍ എന്നറിയപ്പെടുന്നു. വ്യത്യസ്ത എണ്ണത്തിലുള്ള പരാമീറ്ററുകള്‍ സ്വീകരിക്കുന്ന ഫങ്ങ്ഷനുകളോട് ഇതാണ് അവസാനത്തെ പരാമീറ്റര്‍ എന്ന് സൂചിപ്പിക്കാന്‍ ഇവ ഉപയോഗിക്കുന്നു. (NULL എന്നത് സെന്റിനല്‍ അല്ല. അതിന് മറ്റ് ഉപയോഗങ്ങള്‍ ഉണ്ട്. ഇനി പരാമീറ്ററുകള്‍ ഇല്ല എന്നത് സൂചിപ്പിക്കാനായി ഉപയോഗിക്കുന്നവയെ ആണ് സെന്റിനല്‍ എന്ന് വിളിക്കുന്നത്. എക്സെക്ക് പ്രതീക്ഷിക്കുന്ന സെന്റിനല്‍ NULL ആണ്). ls കമാന്റ് -l എന്ന ആര്‍ഗ്യുമെന്റ് സ്വീകരിക്കും. ls -l എന്നുപയോഗിക്കുമ്പോള്‍ ലഭിക്കുന്ന രീതിയിലുള്ള ഔട്ട്പുട്ട് ലഭിക്കാന്‍  ret = execl("/bin/ls", "ls", "-l", "/", NULL); എന്നാക്കി ആ വരിയെ മാറ്റിയാല്‍ മതി.

ഒരു പ്രോസസ്സിലെ തന്നെ സ്വതന്ത്രമായ ഒരു ഭാഗം മറ്റൊരു പ്രോസസ്സ് പോലെ ഷെഡ്യൂള്‍ ചെയ്യാന്‍ സാധിക്കുന്ന തരത്തില്‍ പ്രവര്‍ത്തിപ്പിക്കുക എന്നതാണ് ത്രെഡുകള്‍ വഴി ചെയ്യുന്നത്. ഒരു പ്രോസസ്സില്‍ ചിലപ്പോള്‍ ത്രെഡുകള്‍ ഉണ്ടാകാം. ഈ ത്രെഡുകള്‍ക്ക് വ്യത്യസ്ത സ്റ്റാക്ക് സെഗ്‌‌മന്റുകള്‍ ഉണ്ടായിരിക്കുമെങ്കിലും ടെക്സ്റ്റ്, ഡാറ്റ തുടങ്ങിയ സെഗ്മന്റുകള്‍ ഒക്കെ ഒന്നുതന്നെ ആയിരിക്കും. ലിനക്സില്‍ ഒരു ത്രെഡ് സൃഷ്ടിക്കാന്‍ ഉപയോഗിക്കുന്ന സിസ്റ്റം കോള്‍ ക്ലോണ്‍ (clone) ആണ്. ഇത് ഒരു പ്രോഗ്രാമില്‍ നേരിട്ട് ഉപയോഗിക്കുന്നതിന് പകരം  പി-ത്രെഡ്‌ പോലെ ത്രെഡുകള്‍ കൈകാര്യം ചെയ്യാനുള്ള ലൈബ്രറികള്‍ എന്തെങ്കിലും  ഉപയോഗിക്കുന്ന രീതിയാണ് ശുപാര്‍ശ ചെയ്യപ്പെട്ടിരിക്കുന്നത്.

പ്രോസസ്സ് ടേബിള്‍, യു-ഏരിയ എന്നിവയെക്കുറിച്ച് വിശദമായി അടുത്ത പോസ്റ്റില്‍.

Saturday, October 13, 2012

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

ഒരു ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം  നല്‍കുന്ന സേവനങ്ങള്‍ ഉപയോഗിക്കുന്നത് സിസ്റ്റം കോളുകള്‍ വഴിയാണ്. സാധാരണ പ്രോഗ്രാമിങ്ങ് ഭാഷകളൊക്കെ സിസ്റ്റം കോളുകള്‍ ഉപയോഗിക്കാനുള്ള ഫങ്‌‌ഷനുകള്‍ നല്‍കാറുണ്ട്. ജാവ പോലെയുള്ള വിര്‍ച്ച്വല്‍ മെഷീനുകള്‍ ഉപയോഗിക്കുന്ന അല്ലെങ്കില്‍ ഒരു ഇന്റര്‍പ്രിറ്റര്‍ കൈകാര്യം  ചെയ്യുന്ന  പ്രോഗ്രാമിങ്ങ് ഭാഷകളാണെങ്കില്‍ ഈ സിസ്റ്റം കോളുകള്‍ അവയുടെ ഇന്റര്‍പ്രിറ്റര്‍ തന്നെ കൈകാര്യം ചെയ്യും. പ്രോഗ്രാമര്‍ക്ക് അവയെക്കുറിച്ചറിയണ്ട കാര്യമില്ല. സി/സി++ ഭാഷകളില്‍ ഈ സിസ്റ്റം കോളുകള്‍ നേരിട്ട് ഉപയോഗിക്കാന്‍ സാധിക്കും. യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങളില്‍ ഒരു പുതിയ പ്രോസസ് ഉണ്ടാക്കാനുള്ള സിസ്റ്റം കോള്‍ ഫോര്‍ക്ക്  (fork) ആണ്. നിലവിലുള്ള ഒരു പ്രോസസ് ഫോര്‍ക്ക് സിസ്റ്റം കോള്‍ ഉപയോഗിക്കുമ്പോള്‍  ആ പ്രോസസിന്റെ മറ്റൊരു പതിപ്പ് സൃഷ്ടിക്കപ്പെടുന്നു. ഈ പതിപ്പിനെ ചൈല്‍ഡ് പ്രോസസ്സ് എന്നും ഫോര്‍ക്ക് സിസ്റ്റം കോള്‍ ഉപയോഗിച്ച പ്രോസസിനെ പേരന്റ് പ്രോസസ്സ് എന്നും  വിളിക്കുന്നു. എല്ലാ പ്രോസസുകള്‍ക്കും ഒരു പ്രോസസ്സ് ഐഡി ഉണ്ടായിരിക്കും. പ്രോസസുകളെ കൈകാര്യം ചെയ്യാന്‍ ഈ പ്രോസസ്സ് ഐഡി ഉപയോഗിക്കാം. ഇതിനെ ചുരുക്കു പിഐഡി (PID) എന്ന് വിളിക്കുന്നു. ലിനക്സ് കെര്‍ണല്‍ അതിന്റെ പ്രാധമിക ക്രമീകരണങ്ങള്‍ ഒക്കെ നടത്തിയ ശേഷം ഇനിറ്റ് (init) എന്ന പ്രോസസ്സിന്റെ സൃഷ്ടിക്കുന്നു. ഈ പ്രോസസ് മാത്രമാണ് ഫോര്‍ക്ക് ഉപയോഗിക്കാതെ സൃഷ്ടിക്കപ്പെടുന്ന ഒരേ ഒരെണ്ണം. ഇനിറ്റ് പ്രോസസ്സിന്റെ പിഐഡി 1 ആയിരിക്കും. തുടക്കത്തില്‍ ആവശ്യമായ ബാക്കിയുള്ള പ്രോസസുകളെ ഒക്കെ സൃഷ്ടിക്കുന്നത് ഇനിറ്റ് ആണ്. അപ്പോള്‍ ഇനിറ്റ് ഒഴികെയുള്ള എല്ലാ പ്രോസസ്സുകള്‍ക്കും  ഒരു പേരന്റ് പ്രോസസ് ഉണ്ടാകും. ഈ പേരന്റ് പ്രോസസിനെ മനസ്സിലാക്കാന്‍ പേരന്റ് പ്രോസസ് ഐഡി - പിപിഐഡി (PPID) ഉപയോഗിക്കുന്നു. ഒരു ചൈല്‍ഡ് പ്രോസസ്സിന്റെ പേരന്റ് പ്രോസസ്സ് പ്രവര്‍ത്തനം നിര്‍ത്തിയാല്‍ ആ ചൈല്‍ഡ് പ്രോസസ്സിനെ ഓര്‍ഫണ്‍ പ്രോസസ്സ് എന്ന് വിളിക്കാം. എല്ലാ ഓര്‍ഫണ്‍ പ്രോസസ്സുകളുടെയും  പേരന്റ് പ്രോസസ്സ് ഇനിറ്റ് ആയിരിക്കും. കെര്‍ണല്‍ എല്ലാ പ്രോസസ്സുകളുടെയും ഒരു പട്ടിക സൂക്ഷിക്കും. ഇതിനെ പ്രോസസ്സ് ടേബിള്‍ എന്ന് വിളിക്കുന്നു. ഇത് എല്ലാ പ്രോസസ്സുകള്‍ക്കും പ്രോസസ്സ് ടേബിളില്‍ ഒരു സ്ഥലം അനുവദിച്ചിരിക്കും. ഇതിനെ ആ പ്രോസസ്സിന്റെ പ്രോസസ്സ് ടേബിള്‍ എന്‍ട്രി എന്ന് വിളിക്കാം. കൂടാതെ ഓരോ പ്രോസസ്സിനും യു-ഏരിയ എന്ന പേരില്‍ അതിനെപ്പറ്റിയുള്ള വിവരങ്ങള്‍ സൂക്ഷിച്ചിരിക്കുന്ന ഒരു സ്ഥലം കൂടിയുണ്ട്. ഒരു പ്രോസസ്സിലെ വിവിധ സെഗ്‌‌മന്റുകളെക്കുറിച്ച് നേരത്തേ പറഞ്ഞിരുന്നല്ലോ. കെര്‍ണലിനും  ഈ സെഗ്മെന്റുകള്‍ ഉണ്ടായിരിക്കും. അവയിലാണ് ഈ വിവരങ്ങള്‍ ശേഖരിക്കപ്പെടുക.

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

പ്രോസസ്സിന്റെ വിവിധ അവസ്ഥകള്‍ (Process states)
ഒരു പ്രോസസ്സിന്റെ വിവിധ അവസ്ഥകള്‍ താഴെപ്പറയുന്നവയാണ്,
കടപ്പാട്: വിക്കിപീഡിയ
ഹാര്‍ഡ് ഡിസ്കില്‍ നിന്നും  പ്രോഗ്രാമിനെ മെമ്മറിയില്‍ എത്തിച്ചുകഴിഞ്ഞാല്‍ അത് ക്രിയേറ്റഡ് എന്ന അവസ്ഥയിലായിരിക്കും. സൃഷ്ടിക്കപ്പെട്ടു എന്ന അര്‍ഥത്തില്‍. ഒന്നിലധികം  പ്രോസസ്സുകള്‍ പ്രവര്‍ത്തിക്കുന്ന സിസ്റ്റത്തില്‍ സൃഷ്ടിക്കപ്പെട്ട ഉടനെ തന്നെ പ്രോസസ്സിന് പ്രവര്‍ത്തിച്ചു തുടങ്ങാനാകില്ല. ഒരു സമയത്ത് ഒരൊറ്റ പ്രോസസ്സിന് മാത്രമേ പ്രവര്‍ത്തിക്കാന്‍ സാധിക്കുകയുള്ളു എന്നതാണ് ഇതിന് കാരണം. അപ്പോള്‍ ആ പ്രോസസ്സ് കാത്തിരിപ്പ് (വെയിറ്റിങ്ങ്‌‌) അവസ്ഥയിലായിരിക്കും. ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം ഷെഡ്യൂള്‍ ചെയ്യുന്നതിനനുസരിച്ച് അതിന് പ്രവര്‍ത്തിച്ച് തുടങ്ങാന്‍ സാധിക്കുന്നു. പ്രവര്‍ത്തിച്ചുകൊണ്ടിരിക്കുന്ന അവസ്ഥയാണ് റണ്ണിങ്ങ്. മെയിന്‍ മെമ്മറിയുടെ ലഭ്യതയുടെ അടിസ്ഥാനത്തില്‍ ചിലപ്പോള്‍ പ്രോസസ്സിനെ മെമ്മറിയില്‍ നിന്നും  ഡിസ്കിലേക്ക് സ്വാപ്പ് ചെയ്യാന്‍ സാധ്യതയുണ്ട്. സ്വാപ്പിങ്ങിനെപ്പറ്റി മെമ്മറി മാനേജ്‌‌മെന്റിനെക്കുറിച്ചുള്ള പോസ്റ്റില്‍ വായിക്കാം. കാത്തിരിക്കുന്ന സമയത്ത് മെമ്മറിയില്‍ നിന്ന് ഡിസ്കിലേക്ക് മാറ്റപ്പെട്ട അവസ്ഥയാണ് ഇടതുവശത്ത് താഴെയുള്ളത്. ഇനിയുള്ള അവസ്ഥ ബ്ലോക്ക് ചെയ്യപ്പെട്ട അവസ്ഥയാണ്. ഒരു പ്രോസസ്സിന് പ്രവര്‍ത്തനം തുടരാന്‍ ഏതെങ്കിലും  ഉപകരണത്തില്‍ നിന്നുള്ള സിഗ്നല്‍ ആവശ്യമാണെന്ന് കരുതുക. ഇത് ചിലപ്പോള്‍ ഉപഭോക്താവ് കീബോര്‍ഡില്‍ എന്തെങ്കിലും  അമര്‍ത്താനായിരിക്കാം, ഇന്റര്‍നെറ്റില്‍ നിന്ന് ഒരു പാക്കറ്റ് ലഭിക്കാനായിരിക്കാം. ഇത് പൂര്‍ത്തിയാകുന്നത് വരെ ആ പ്രോസസ്സിന് തുടരാന്‍ സാധിക്കില്ല. ഈ അവസ്ഥയില്‍ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം ആ പ്രോസസ്സിനെ ബ്ലോക്ക് ചെയ്‌‌ത് സി പി യു മറ്റൊരു പ്രോസസ്സിനായി വിട്ടു കൊടുക്കുന്നു. ആ അവസ്ഥയില്‍ ചിലപ്പോള്‍ പ്രോസസ്സ് മെമ്മറിയില്‍ നിന്നും  ഡിസ്കിലേക്ക് മാറ്റപ്പെട്ടേക്കാം. ഈ അവസ്ഥയാണ് വലതുവശത്ത് താഴെക്കാണുന്നത്.

ഫോര്‍ക്ക് സിസ്റ്റംകോളിന്റെ പ്രവര്‍ത്തനത്തെപ്പറ്റി വിശദമായി അടുത്ത പോസ്റ്റില്‍.

Sunday, October 07, 2012

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

 പ്രോഗ്രാം
പ്രോസസ് എന്നത് മെമ്മറിയില്‍ ലോഡ് ചെയ്യപ്പെട്ട പ്രോഗ്രാം ആണെന്ന് നേരത്തേ‌ പറഞ്ഞു. പ്രോസസ്സുകള്‍ ആയി മാറുന്ന പ്രോഗ്രാമുകളെക്കുറിച്ച് ഈ ഭാഗത്തില്‍..

ലിനക്സിലെ ഫയല്‍ അനുമതികളില്‍ എക്സിക്യൂട്ടബിള്‍ എന്ന ഒരു അനുമതി ഉണ്ട്. ഇത് ഏത് ഫയലിന് വേണമെങ്കിലും  കൊടുക്കാവുന്നതാണ്. ഈ അനുവാദം ഉള്ളതുകൊണ്ട് മാത്രം  ഒരു ഫയല്‍ എക്സിക്യൂട്ടബിള്‍ ഫയല്‍ ആകുന്നില്ല. ഒരോ ഫയലുകളും  ഏത് തരത്തില്‍ ഉള്ളവയാണെന്ന് മനസ്സിലാക്കാന്‍ ലിനക്സില്‍ ഫയല്‍ (file) കമാന്റ് ഉപയോഗിക്കാവുന്നതാണ്. ചില ഉദാഹരണങ്ങള്‍ നോക്കൂ, 

subin@subin:~/Pictures/Tux$ file 100px-NewTux.png
100px-NewTux.png: PNG image data, 100 x 120, 8-bit/color RGBA, non-interlaced

subin@subin:/bin$ file bash
bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, stripped

subin@subin:/lib$ file libfuse.so.2.8.6
libfuse.so.2.8.6: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

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

1. .text: പ്രോഗ്രാമിലെ നിര്‍ദ്ദേശങ്ങള്‍. ഇവക്കനുസരിച്ചാണ് പ്രോഗ്രാം  പ്രവര്‍ത്തിക്കുന്നത്.
2. .data: ഒരു സി പ്രോഗ്രാമിലെ മൂല്യം തീരുമാനിക്കപ്പെട്ട ഗ്ലോബല്‍ വേരിയബിളുകള്‍, സ്റ്റാറ്റിക് വേരിയബിളുകള്‍ എന്നിവയൊക്കെ.
3. .bss: മൂല്യം തീരുമാനിക്കപ്പെട്ടിട്ടില്ലാത്ത ഗ്ലോബല്‍ വേരിയബിളുകള്‍.
4. .stack: പ്രോഗ്രാമിലെ വിവിധ ഫങ്ഷനുകള്‍ക്ക് പ്രവര്‍ത്തിക്കാനാവശ്യമായ വിവരങ്ങള്‍. പ്രോഗ്രാമിന്റെ ആരംഭത്തില്‍ ഇതില്‍ മെയിന്‍ ഫങ്ങ്ഷനിലെ ലോക്കല്‍/ഓട്ടോമാറ്റിക് വേരിയബിളുകള്‍, റിട്ടേണ്‍ അഡ്രസ്സ്, കമാന്റ് ലൈന്‍ ആര്‍ഗ്യുമെന്റുകള്‍, എന്‍വയോണ്‍മെന്റ് വേരിയബിളുകള്‍ എന്നിവയായിരിക്കും  ഉണ്ടാവുക. മറ്റൊരു ഫങ്ങ്ഷന്‍ വിളിക്കപ്പെടുമ്പോള്‍ ആ ഫങ്ങ്‌‌ഷന്റെ ലോക്കല്‍ വേരിയബിളുകള്‍, അതിന്റെ ആര്‍ഗ്യുമെന്റുകള്‍, അതിന്റെ റിട്ടേണ്‍ അഡ്രസ് തുടങ്ങിയ വിവരങ്ങള്‍ ഉള്‍ക്കൊള്ളിച്ച് ഒരു പുതിയ ഉപ ഭാഗം  ഇതിനുള്ളില്‍ സൃഷ്ടിക്കപ്പെടുന്നു.
5. .heap: പ്രോഗ്രാം  പ്രവര്‍ത്തിക്കുന്ന സമയത്ത് അതിന് കൂടുതല്‍ മെമ്മറി ആവശ്യമായി വന്നാല്‍ അത് അനുവദിക്കാനുള്ള സ്ഥലം.
(മുകളിലുള്ള സി പ്രോഗ്രാമിങ്ങുമായി ബന്ധപ്പെട്ട പദങ്ങള്‍ വിശദീകരിക്കാന്‍ കൂടുതല്‍ സ്ഥലവും  സമയവും  വേണ്ടിവരുമെന്നതിനാല്‍ അവയുടെ വിശദീകരണം ഒഴിവാക്കുന്നു. അവ എന്താണെന്ന് സൂചിപ്പിക്കുന്ന വിക്കി ലേഖനത്തിലേക്ക് കണ്ണികള്‍ നല്‍കിയിട്ടുണ്ട്)

ആധുനിക കമ്പൈലറുകള്‍ ഇവക്ക് പുറമേ മറ്റ് പല ഭാഗങ്ങളും  എക്സിക്യൂട്ടബിള്‍ ഫയലുകളില്‍ ഉള്‍പ്പെടുത്താറുണ്ട്. ജി ഡി ബി പോലെയുള്ള ഡീബഗ്ഗര്‍ പ്രോഗ്രാമുകള്‍ക്കാവശ്യമായ വിവരങ്ങള്‍ Dwarf എന്ന ക്രമീകരണ രീതി ഉപയോഗിച്ച് ചില എക്സിക്യൂട്ടബിള്‍ ഫയലുകളില്‍ കാണും. (Elf എന്ന പേരിന്റെ കൂടെ നില്‍ക്കാന്‍ Dwarf എന്ന് പേരിട്ടതാണ്. ഇവ രണ്ടും മാന്ത്രിക ജീവികളുടെ പേരാണല്ലോ.) മറ്റുള്ള ബൈനറി എക്സിക്യൂട്ടബിള്‍ ക്രമീകരണ രീതികളിലും  ഈ ഭാഗങ്ങള്‍ ഒക്കെ ഉണ്ടാകും. Elf ഒരു ഉദാഹരണമായി എടുത്തത് യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങള്‍ അത് ഉപയോഗിക്കുന്നു എന്നതിനാലാണ്. എക്സിക്യൂട്ടബിള്‍ ഫയലുകളെ കുറിച്ചുള്ള വിവരങ്ങള്‍ ലഭിക്കാനും  അവയെ അപഗ്രഥിക്കാനും  മറ്റുമായി വിവിധ പ്രോഗ്രാമുകള്‍ ലഭ്യമാണ്. ഉദാഹരണത്തിന്, എക്സിക്യൂട്ടബിള്‍ ഫയലിലെ വിവിധ സെഗ്മന്റുകളുടെ വലിപ്പം അറിയാന്‍ size, ഫയലിലെ വിവിധ ചിഹ്നങ്ങളുടെ വിവരങ്ങള്‍ ലഭിക്കാന്‍ nm, elf ഫയലുകളിലെ വിവിധ വിവരങ്ങള്‍ക്കായി readelfഎന്നിവ.

കമ്പൈലര്‍ ഒരു എക്സിക്യൂട്ടബിള്‍ ഫയല്‍ ഉണ്ടാക്കിക്കഴിഞ്ഞാല്‍ അതില്‍ പ്രവര്‍ത്തനസമയത്ത് അത്യാവശ്യമല്ലാത്ത വിവിധ വിവരങ്ങള്‍ ഉണ്ടായിരിക്കും. സാധാരണ ഉപഭോക്താക്കള്‍ക്ക് ആവശ്യമില്ലാത്ത ഈ വിവരങ്ങള്‍ ഒഴിവാക്കുന്നത് ഫയലുകളുടെ വലിപ്പം കുറക്കാന്‍ സഹായിക്കും. ഇങ്ങനെയുള്ള വിവരങ്ങള്‍ ഒഴിവാക്കുന്ന പ്രക്രിയയെ സ്ട്രിപ്പിങ്ങ് എന്ന് പറയുന്നു. strip എന്ന പ്രോഗ്രാം  ഉപയോഗിച്ച് ഇത് ചെയ്യാവുന്നതാണ്. ആദ്യം  നല്‍ലിയിരിക്കുന്ന ഫയല്‍ കമാന്റ് ഉദാഹരണങ്ങളില്‍ അവസാനം stripped എന്ന് പരാമര്‍ശിച്ചിട്ടുള്ളത് ശ്രദ്ധിക്കൂ.

യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങളില്‍ പ്രോസസുകള്‍ തുടങ്ങുന്നത്, അവസാനിപ്പിക്കുന്നത് എന്നിവയെക്കുറിച്ച് അടുത്ത പോസ്റ്റില്‍.


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) എന്നാണ് ഈ അവസ്ഥയുടെ പേര്. ഇത് അത്ര സാധാരണയായ ഒരു അവസ്ഥയല്ല.

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

Wednesday, September 26, 2012

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

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

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

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

വിര്‍ച്ച്വല്‍ മെമ്മറിയുടെ പ്രവര്‍ത്തന രീതികളും  പ്രോസസ്സുകളും  വിശദമായി അടുത്ത പോസ്റ്റില്‍..

Thursday, September 20, 2012

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

യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങളിലെ ഫയല്‍ സിസ്റ്റങ്ങളെക്കുറിച്ചും ഫയല്‍ മാനേജ്‌‌മെന്റിനെക്കുറിച്ചും  ഒരു ഏകദേശ ധാരണ കിട്ടിയിരിക്കും എന്ന് കരുതുന്നു. ഏതൊരു വിവിധോപയോഗ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിലെയും സുപ്രധാനമായ ഭാഗമാണ് പ്രോസസ് മാനേജ്‌‌മെന്റ്. യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങള്‍ ഇത് എങ്ങനെ കൈകാര്യം ചെയ്യുന്നു എന്ന് തുടര്‍ന്നുള്ള പോസ്റ്റുകളില്‍.

ആദ്യം തന്നെ പ്രോഗ്രാം, പ്രോസസ്സ്, ത്രെഡ് ഇവയൊക്കെ എന്താണെന്ന് നോക്കാം. ഒരു പ്രോഗ്രാം എന്നത് എക്സിക്യൂട്ട് ചെയ്യാന്‍ അല്ലെങ്കില്‍ പ്രവര്‍ത്തിപ്പിക്കാന്‍ സാധിക്കുന്ന ഒരു ഫയല്‍ ആണ്. യന്ത്രഭാഷയിലുള്ള നിര്‍ദ്ദേശങ്ങള്‍ അടങ്ങിയിരിക്കുന്ന ഈ ഫയലുകളില്‍ വിവരങ്ങള്‍ ക്രമീകരിക്കുന്നതിന് പ്രത്യേക രീതികള്‍ അവലംബിക്കുന്നു. ഓരോ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റങ്ങളും  ഓരോ തരത്തിലാണ് എക്സിക്യൂട്ടബിള്‍ ഫയലുകള്‍ രേഖപ്പെടുത്തുന്നത്. വിന്‍ഡോസില്‍ പോര്‍ട്ടബില്‍ എക്സിക്യൂട്ടബിള്‍ ഫോര്‍മാറ്റ് (PE), യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങളില്‍ എക്സിക്യൂട്ടബിള്‍ ലിങ്കബിള്‍ ഫോര്‍മാറ്റ് (ELF) എന്നിവയാണ് പൊതുവേ ഉപയോഗിച്ച് വരുന്നത്. ഇതിനു പുറമേ a.out, COFF, HEX  തുടങ്ങിയ നിരവധി ക്രമീകരണ രീതികളും  ഉപയോഗത്തിലുണ്ട്.

പ്രോസസ്സ് എന്ന് പറയുന്നത് പ്രവര്‍ത്തന സജ്ജമായ അല്ലെങ്കില്‍ പ്രവര്‍ത്തിച്ചുകൊണ്ടിരിക്കുന്ന പ്രോഗ്രാമുകളെ ആണ്. ഇതിനായി ഡിസ്കില്‍ നിന്ന് പ്രോഗ്രാമുകളെ മൊത്തമായോ ഭാഗികമായോ പ്രധാന മെമ്മറിയിലേക്ക് (RAM) കൊണ്ടുവരേണ്ടതുണ്ട്. ഇവിടെയാണ് വിര്‍ച്ച്വല്‍ മെമ്മറി, സെഗ്‌‌മെന്റേഷന്‍, സ്വാപ്പിങ്ങ് തുടങ്ങിയവയൊക്കെ വരുന്നത്.

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


Monday, September 10, 2012

ഫയല്‍ സിസ്റ്റങ്ങള്‍ - 4

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

ലിനക്സില്‍ ഓരോ ഫയലിന്റെയും അനുമതി മൂന്ന് വിഭാഗങ്ങളായാണ് ക്രമീകരിച്ചിരിക്കുന്നത്. ആ ഫയല്‍ ഉണ്ടാക്കിയ ആള്‍ അഥവാ ആ ഫയലിന്റെ ഉടമ (യൂസര്‍), ഉടമ ഉള്‍പ്പെടുന്ന ഉപഭോക്താക്കളുടെ കൂട്ടം (ഗ്രൂപ്പ്), മറ്റുള്ളവര്‍ (അതേഴ്സ്) എന്നിങ്ങനെ. ഈ മൂന്ന് വിഭാഗങ്ങളില്‍ ഉള്ളവര്‍ക്കും വായിക്കുക (റീഡ്), എഴുതുക/മാറ്റം വരുത്തുക (റൈറ്റ് ), പ്രവര്‍ത്തിപ്പിക്കുക (എക്സിക്യൂട്ട്) എന്നിങ്ങനെ അനുമതികള്‍ കൊടുത്തിരിക്കും. താഴെക്കൊടുത്തിരിക്കുന്ന ചിത്രം നോക്കൂ,
1 എന്നുള്ളത് ഒരു വിഭാഗത്തിന്ആ പ്രവര്‍ത്തി ചെയ്യാന്‍ അനുവാദമുണ്ട് എന്നും 0 അനുവാദമില്ല എന്നും സൂചിപ്പിക്കുന്നു.ഈ ചിത്രത്തില്‍ കാണുന്നതുപോലെ ആണെങ്കില്‍ ഉടമക്ക്ആ ഫയലിനെ വായിക്കാനും, മാറ്റം വരുത്താനും പ്രവര്‍ത്തിപ്പിക്കാനും ഉള്ള അനുവാദമുണ്ട്. കൂട്ടത്തിനും മറ്റുള്ളവര്‍ക്കുംആ ഫയലിനെ വായിക്കാന്‍ മാത്രമേ അനുവാദമുള്ളു. ഈ ബിറ്റുകളെ ബൈനറി സംഘ്യ ആയി പരിഗണിച്ചാല്‍ഒക്റ്റല്‍ നമ്പര്‍ സിസ്റ്റത്തില്‍ 0744 എന്ന് എഴുതാന്‍ സാധിക്കും. ഈ രീതിയിലാണ് സാധാരണ ഫയല്‍ അനുമതികള്‍ എഴുതാറുള്ളത്. 0660 എന്നാണെങ്കില്‍ ഉടമക്കും കൂട്ടത്തിനും വായിക്കാനും എഴുതാനും അനുവാദമുണ്ട്, മറ്റുള്ളവര്‍ക്ക് ആ ഫയല്‍ ഉപയോഗിക്കാന്‍ സാധിക്കില്ല എന്നാണ്. (ബൈനറിയില്‍ 110 110 000, ഏറ്റവും  ഇടതുവശത്തുള്ള 0 ഈ സംഘ്യ ഒക്റ്റല്‍ സംഘ്യാ രീതിയി എഴുതപ്പെട്ടതാണ് എന്നതിനെ സൂചിപ്പിക്കുന്നു.) ലിനക്സിലെ ls കമാന്റ് ഉപയോഗിക്കുമ്പോള്‍ ഇതിനെ rwxrwxrwx എന്നാണ് കാണിക്കാറൂള്ളത്. r - read, w - write, x - execute. ആദ്യത്തെ മൂന്നെണ്ണം ഉടമയുടെയും പിന്നീടുള്ളവ യഥാക്രമം കൂട്ടത്തിന്റെയും മറ്റുള്ളവരുടെയും അനുമതികള്‍ ആണ്. 0744 എന്ന അനുവാദത്തെ rwxr--r-- എന്ന് എഴുതാം. 0660 ത്തിനെ rw-rw---- എന്നും.

ലിനക്സ് റൂട്ട് ഫയല്‍ സിസ്റ്റത്തിലെ /etc പോലെയുള്ള ഡയറക്റ്ററികളില്‍ ചില പ്രോഗ്രാമുകളുടെ ക്രമീകരണങ്ങള്‍ സൂക്ഷിച്ചിരിക്കുന്ന ഫയലുക്കള്‍ക്ക് ചില പ്രത്യേക അനുവാദങ്ങള്‍ നിര്‍ബന്ധമാണ്. ആ അനുവാദങ്ങളില്‍ മാറ്റം വരുത്തിയാല്‍ അത്തരം പ്രോഗ്രാമുകള്‍ പിന്നീട് പ്രവര്‍ത്തിക്കാന്‍ വിസമ്മതിക്കും. ഉദാഹരണത്തിന് sudo പ്രോഗ്രാമിന്റെ ക്രമീകരണങ്ങള്‍ ഉള്‍ക്കൊള്ളുന്ന ഫയലായ /etc/sudoers ഇന്റെ അനുവാദങ്ങള്‍ നോക്കൂ, നിങ്ങളുടെ കമ്പ്യൂട്ടറില്‍ ഒരു റൂട്ട് യൂസര്‍ ഇല്ലെങ്കില്‍ ഇത് പരീക്ഷിക്കരുത്. സാധാരണ ഉബുണ്ടു/ഡെബിയന്‍ സിസ്റ്റങ്ങളില്‍ ഡിഫാള്‍ട്ട് ആയി ഒരു റൂട്ട് യൂസര്‍ ഉണ്ടാകില്ല. നിങ്ങള്‍ ഇത് പരീക്ഷിക്കുന്നുണ്ടെങ്കില്‍ അതിനു മുന്‍പേ sudo passwd root എന്ന കമാന്റ് ഉപയോഗിച്ച് റൂട്ട് യൂസറുടെ പാസ് വേര്‍ഡ്  ക്രമീകരിക്കേണ്ടതാണ്. പിന്നീട് su കമാന്റ് വഴി റൂട്ട് ആയി ലോഗിന്‍ ചെയ്ത് ഈ ഫയലിന്റെ അനുവാദങ്ങള്‍ പഴയപടി ആക്കാം. അതുവരെ പിന്നെ sudo കമാന്റും  അതുമായി ബന്ധപ്പെട്ട gksu പോലെയുള്ള കമാന്റുകളും പ്രവര്‍ത്തിക്കുകയില്ല. ഇത് വലിയ പ്രശ്നങ്ങള്‍ ഉണ്ടാക്കും.
subin@anna:~$ ls -l /etc/sudoers
-r--r----- 1 root root 723 Jan 31  2012 /etc/sudoers
ആദ്യം കാണുന്നത് അനുവാദം, പിന്നെ ലിങ്കുകളുടെ എണ്ണം (പിന്നാലെ), പിന്നെ ഉടമ, കൂട്ടം, ഫയല്‍ ഉണ്ടാക്കിയ തീയതി, ഫയലിന്റെ പേര് എന്നിങ്ങനെ. ഈ ഫയലിന്റെ ഉടമ റൂട്ട് ആണ്. റൂട്ടിനും പിന്നെ റൂട്ട് ഉപഭോക്താക്കളുടെ കൂട്ടത്തിനും  മാത്രമേ ഈ ഫയല്‍ വായിക്കാന്‍ അനുവാദമുള്ളു. ഇനി ഈ ഫയലിന്റെ ഉടമയെ മാറ്റി നോക്കാം,

subin@anna:~$ sudo chown subin:subin /etc/sudoers
subin@anna:~$ ls -l /etc/sudoers
-r--r----- 1 subin subin 723 Jan 31  2012 /etc/sudoers
ഇപ്പോള്‍ ഫയലിന്റെ ഉടമ സുബിന്‍ ആണ്. ഇനി ഞാന്‍ sudo പ്രോഗ്രാം  പ്രവര്‍ത്തിപ്പിക്കാന്‍ ശ്രമിക്കുമ്പോള്‍,
subin@anna:~$ sudo fdisk -l
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
എന്ന എറര്‍ സന്ദേശമാണ് കിട്ടുക.അനുവാദങ്ങള്‍ പഴയപടി ആക്കിയാല്‍ ഇത് വീണ്ടും  പ്രവര്‍ത്തിച്ച് തുടങ്ങും.

പ്രവര്‍ത്തിപ്പിക്കാന്‍ കഴിയുന്ന ഫയലുകള്‍ക്ക് (എക്സിക്യൂട്ടബിള്‍ ഫയലുകള്‍) ലിനക്സില്‍ മറ്റുചില അനുവാദങ്ങള്‍ കൂടിയുണ്ട്. സെറ്റ് യുഐഡി, സെറ്റ്ജിഐഡി തുടങ്ങിയവ. ഒരു കമ്പ്യൂട്ടര്‍ സിസ്റ്റത്തില്‍ ചില കാര്യങ്ങള്‍ ചെയ്യാന്‍ അഡ്മിനിസ്ട്രേറ്റര്‍ യൂസര്‍ അഥവാ റൂട്ട് യൂസറിന് മാത്രമേ അനുവാദമുള്ളു. എന്നിരുന്നാലും  ചിലപ്പോള്‍ സാധാരണ ഉപഭോക്താക്കള്‍ക്കും  ഇത്തരം കാര്യങ്ങള്‍ ചെയ്യേണ്ടതായി വരും. ഒരേ പ്രോഗ്രാം തന്നെ വിവിധ ഉപഭോക്താക്കള്‍ പ്രവര്‍ത്തിക്കുമ്പോള്‍ അവയുടെ പ്രവര്‍ത്തനം  വിവിധ രീതിയിലായിരിക്കും. ഒരു സിസ്റ്റത്തില്‍ ഒരു പുതിയ ഉപഭോക്താവിനെ ചേര്‍ക്കുന്നത്, ഉള്ള ഒരാളെ നീക്കം ചെയ്യുന്നത് തുടങ്ങിയ കാര്യങ്ങള്‍ ഒക്കെ റൂട്ടിന് മാത്രമായി നീക്കി വച്ചാല്‍ പോലും  ഉപഭോക്താക്കള്‍ അവരവരുടെ പാസ്‌‌വേര്‍ഡുകള്‍ മാറ്റുന്നത്, വേറൊരു കമ്പ്യൂട്ടറിനെ നെറ്റ്‌‌വര്‍ക്കില്‍ ping ചെയ്യുന്നത് തുടങ്ങിയവ പ്രത്യേക അധികാരങ്ങള്‍ വേണ്ടീവരുന്ന കാര്യങ്ങളാണ്. ഇതിനായി ഉള്ള പ്രൊഗ്രാമുകള്‍ സാധാരണയായി ചെയ്യുന്നത് setuid, setgid പോലെയുള്ള സിസ്റ്റം കോളുകള്‍ ഉപയോഗിച്ച് അവയുടെ അധികാരങ്ങള്‍ താല്‍ക്കാലികമായി ഉയര്‍ത്തുകയാണ്. പക്ഷേ ഏതൊരു പ്രോഗ്രാമിനും  ഇങ്ങനെ ചെയ്യാന്‍ അവസരമുണ്ടായാല്‍ ദുഷ്ടപ്രോഗ്രാമുകള്‍ക്ക് കമ്പ്യൂട്ടറിലെ ഏത് ഫയല്‍ വേണമെങ്കിലും  മായ്ചുകളയാനോ മാറ്റം  വരുത്താനോ ഒക്കെ സാധിക്കുമല്ലോ. അതിനാല്‍ സെറ്റ് യുഐഡി, സെറ്റ്ജിഐഡി തുടങ്ങിയ അനുവാദങ്ങള്‍ ഉള്ള ഫയലുകള്‍ക്ക് മാത്രമേ ഇത് ചെയ്യാന്‍ സാധിക്കുകയുള്ളു.

ഇനി ബാക്കിയുള്ള പ്രത്യേക അനുവാദം സ്റ്റിക്കി ബിറ്റ് ആണ്. ഇതും  എക്സിക്യൂട്ടബിള്‍ ഫയലുകള്‍ക്ക് മാത്രമായി ഉള്ള അനുവാദമാണ്. ഈ അനുവാദമുള്ള ഫയലുകള്‍ (പ്രോഗ്രാം) എക്സിക്യൂട്ട് ചെയ്ത ശേഷവും  (പ്രോസസ്) അവയെ മെമ്മറി അല്ലെങ്കില്‍ സ്വാപ്പ് ഏരിയയില്‍ തന്നെ തുടരാന്‍ അനുദിക്കും. വീണ്ടും  എക്സിക്യൂട്ട് ചെയ്യുമ്പോള്‍ വേഗത്തില്‍ പ്രവര്‍ത്തനമാഅംഭിക്കാന്‍ ഇതിനാല്‍ അവക്ക് സാധിക്കുന്നു.

ഒക്റ്റല്‍സംഖ്യാരീതിയില്‍ രേഖപ്പെടുത്തുമ്പോള്‍ സ്റ്റിക്കിബിറ്റ് 01000, സെറ്റ്‌‌ജിഐഡി 02000, സെറ്റ്‌‌യുഐഡി 04000 എന്നിങ്ങനെയാണ് രേഖപ്പെടുത്തുക. നേരത്ത് പറഞ്ഞ മൂന്ന് അനുവാദങ്ങളുമായി ചേര്‍ക്കുമ്പോള്‍ മൊത്തം  നാല് അക്കങ്ങളാകും. ഉദാഹരണത്തിന് 04777 എന്ന അനുവാദമാണെങ്കില്‍ എല്ലാവര്‍ക്കും  വായിക്കാനും മാറ്റം വരുത്താനും  പ്രവര്‍ത്തിപ്പിക്കാനും  കഴിയും, കൂടെ പ്രവര്‍ത്തന സമയത്ത് യു ഐ ഡി സെറ്റ് ചെയ്യാനുള്ള അനുവാദവും.

Sunday, August 19, 2012

ഫയല്‍ സിസ്റ്റങ്ങള്‍ - 3

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

ഒരു ഫയല്‍ സൃഷ്ടിക്കപ്പെടുന്നത് 
എല്ലാ ഫയലുകള്‍ക്കും അതിന്റെ പേരുള്‍പ്പെടുന്ന പാത്ത് ഉണ്ടാകുമല്ലോ. ആ പാത്തില്‍ നിന്നും ആദ്യം ഡിസ്ക് കണ്ടുപിടിക്കുന്നു. പിന്നെ ആ ഡിസ്കിന്റെ സൂപ്പര്‍ബ്ലോക്കില്‍ നിന്നും ആ സമയത്ത് ഉപയോഗിക്കപ്പെടാത്ത ഒരു ഐനോഡ് ആ ഫയലിനായി നീക്കിവയ്ക്കുന്നു. ആ ഐനോഡിനെ ഉപയോഗത്തിലില്ലാത്ത ഐനോഡുകളുടെ പട്ടികയില്‍ നിന്ന് നീക്കംചെയ്യുന്നു. ഐനോഡില്‍ ഫയലിന്റെ പേര്, അതുള്‍പ്പെടുന്ന ഡയറക്റ്ററി തുടങ്ങിയ വിവരങ്ങള്‍ ചേര്‍ക്കുന്നു. പിന്നെ സൂപ്പര്‍ബ്ലോക്കില്‍ നിന്നും ഉപയോഗത്തിലല്ലാത്ത ഡിസ്ക് ബ്ലോക്കുകള്‍ കണ്ടെത്തി ആ ഫയലിലെ വിവരങ്ങള്‍ അവിടെ എഴുതിച്ചേര്‍ക്കുന്നു. എന്നിട്ട് ആ ബ്ലോക്കുകളെ കുറിച്ചുള്ള വിവരങ്ങള്‍ ഐനോഡില്‍ രേഖപ്പെടുത്തുന്നു. ആ ബ്ലോക്കുകളെ ഉപയോഗത്തിലില്ലാത്ത ബ്ലോക്കുകളുടെ പട്ടികയില്‍ നിന്ന് നീക്കം ചെയ്യുന്നു. ആ ഫയല്‍ ചേര്‍ക്കപ്പെടുന്നത് ഏത് ഡയറക്റ്ററിയിലേക്കാണോ ആ ഡയറക്റ്ററിയില്‍ ഫയലിനെക്കുറിച്ചുള്ള വിവരങ്ങള്‍ ചേര്‍ക്കുന്നു. ഡിഎന്‍ട്രി എന്നാണ് ഈ വിവരങ്ങളെ വിളിക്കുന്നത്. ഡയറക്റ്ററികളും ഫയലുകള്‍ തന്നെയാണ്. എന്നാല്‍ അവ ഉള്‍ക്കൊള്ളുന്നത് സാധാരണ ഫയലുകളിലേതുപോലെയുള്ള വിവരങ്ങള്‍ അല്ല. അതിലുള്ള ഫയലുകളേയും ഡയറക്റ്ററികളേയും കുറിച്ചുള്ള വിവരങ്ങളാണ്. ഐനോഡിന്റെ വലിപ്പം പരിമിതമാണ്. വലിയ ഫയലുകള്‍ ശേഖരിക്കാന്‍ ഡിസ്കിലെ ഒന്നിലധികം ബ്ലോക്കുകള്‍ ആവശ്യമായി വന്നേക്കാം. ഈ ബ്ലോക്കുകളുടെ എല്ലാം വിവരങ്ങള്‍ ഐനോഡില്‍ തന്നെ ഉള്‍പ്പെടുത്താന്‍ കഴിയാതെ വന്നേക്കാം. ഇത്തരം സാഹചര്യങ്ങളില്‍ ഈ ബ്ലോക്കുകളെ കുറിച്ചുള്ള വിവരങ്ങള്‍ ഐനോഡിലല്ലാതെ മറ്റൊരു ബ്ലോക്കില്‍ രേഖപ്പെടുത്തുകയും ആ ബ്ലോക്കിനെക്കുറിച്ചുള്ള വിവരം ഐനോഡില്‍ ചേര്‍ക്കുകയും ചെയ്യും.ഇതിനെ ഇന്‍ഡയറക്റ്റ് ബ്ലോക്കുകള്‍ എന്ന് വിളിക്കുന്നു. അതുപോലെ ഡബിള്‍ ഇന്‍ഡയറക്റ്റ് ബ്ലോക്കുകളും ഉണ്ടാകാം. ഈ ചിത്രം നോക്കൂ,

[ചിത്രത്തിന് കടപ്പാട്: വിക്കിപീഡിയ]

48കെബി വരെ വലിപ്പമുള്ള ഫയലുകള്‍ക്ക് ഡയറക്റ്റ് ബ്ലോക്കുകള്‍ മതിയാകും. 4എംബി വരെയുള്ള ഫയലുകള്‍ക്ക് ഡയറക്റ്റ് ബ്ലോക്കുകളും ഇന്‍ഡയറക്റ്റ് ബ്ലോക്കുകളും ആവശ്യമാണ്. അതിലും വലിയ ഫയലുകള്‍ക്ക് ഡബിള്‍ ഇന്‍ഡയറക്റ്റ് ബ്ലോക്കുകള്‍ വേണം.

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

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

ഫ്രാഗ്‌‌മെന്റേഷന്‍
ഒരു ഫയല്‍ സിസ്റ്റത്തില്‍ ഉള്ള ഫയലിലെ വിവരങ്ങളുടെ അളവ് കൂടുതലാണെങ്കില്‍ അവ ശേഖരിക്കാന്‍ ഒരു ബ്ലോക്ക് മതിയാകില്ല. ഒരു ഫയല്‍ ഉപയോഗിക്കുന്ന ഒന്നില്‍ കൂടുതല്‍ ഉള്ള ബ്ലോക്കുകള്‍ തുടര്‍ച്ചയായ ബ്ലോക്കുകള്‍ ആവണമെന്നില്ല. തുടര്‍ച്ചയായ ബ്ലോക്കുകളില്‍ അല്ലാതെ ഒരുഫയല്‍ ശേഖരിക്കപ്പെടുന്ന അവസ്ഥയാണ് ഫ്രാഗ്‌‌മെന്റേഷന്‍. ഡിസ്കില്‍ തുടര്‍ച്ചയായ ഫ്രീ ബ്ലോക്കുകള്‍ ഇല്ലാത്ത അവസ്ഥ സാധാരണമാണ്. പ്രത്യേകിച്ച് ചെറിയ സംഭരണ  ശേഷിയുള്ളവയില്‍. ഡിസ്കില്‍ 10എംബി വലിപ്പമുള്ള ഒരു ഫയല്‍ ഉണ്ടായിരുന്നു എന്നിരിക്കട്ടെ. ആ ഫയല്‍ നീക്കം ചെയ്യപ്പെട്ടാല്‍ ആ ബ്ലോക്കുകള്‍ ഫ്രീ ആകും. പിന്നീട് 5എംബി വലിപ്പമുള്ള ഒരു ഫയല്‍ വന്നാല്‍ ഫ്രീ ആയ പത്ത് എംബിയില്‍ ആദ്യത്തെ 5 എംബി സ്ഥലത്ത് ആ ഫയല്‍ ചേര്‍ക്കപ്പെടുന്നു. പിന്നീട് മറ്റൊരു 10എംബി വലിപ്പമുള്ള ഫയല്‍ വരികയും തുടര്‍ച്ചയായി 10‌‌എംബി വലിപ്പത്തില്‍ ഫ്രീ ബ്ലോക്കുകള്‍ ഇല്ലാതെ വരികയും ചെയ്താല്‍ ആദ്യം ബാക്കി വന്ന 5‌‌എംബിയിലും വേറെ എവിടെയെങ്കിലുമായി വരുന്ന 5എംബിയിലും ആയി ആ ഫയല്‍ ചേര്‍ക്കേണ്ടിവരും. അപ്പോള്‍ ഫ്രാഗ്‌‌മെന്റേഷന്‍ ഉണ്ടാകുന്നു. രൂപകല്‍പ്പനയിലെ പ്രത്യേകതകളാല്‍ FAT, NTFS പോലെയുള്ള ഫയല്‍ സിസ്റ്റങ്ങള്‍ കൂടുതല്‍ ഫ്രാഗ്‌‌മെന്റേഷന്‍ പ്രശ്നങ്ങള്‍ കാണിക്കാറുണ്ട്. ഇങ്ങനെ ശേഖരിക്കപ്പെട്ട ഫയലുകള്‍ വായിക്കൂമ്പോള്‍ ഡിസ്കിലെ ഹെഡ്ഡിന് തുടര്‍ച്ചയില്ലാത്ത ചലനങ്ങല്‍ നടത്തേണ്ടിവരികയും ഇത് ഫയലുകള്‍ വായിക്കാന്‍ കൂടുതല്‍ സമയമെടുക്കുന്നതിന് കാരണമാവുകയും ചെയ്യും. കഴിയുന്നിടത്തോളം ഒരു ഫയലിലെ വിവരങ്ങള്‍ തുടര്‍ച്ചയായ ബ്ലോക്കുകളിലേക്ക് മാറ്റുന്ന പ്രവര്‍ത്തിയാണ് ഡീഫ്രാഗ്‌‌മെന്റേഷന്‍. ഇത് ചെയ്യാനുള്ള സോഫ്റ്റ്‌‌വെയറുകള്‍ ലഭ്യമാണ്. ഇടക്കൊക്കെ ചെയ്യുന്നത് നല്ലതുമാണ്. ലിനക്സിലെ EXT3 ഫയല്‍ സിസ്റ്റങ്ങളില്‍ ഫ്രാഗ്‌‌മെന്റേഷന്‍ വളരെ കുറവാണ്.

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

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

ഫയല്‍ സിസ്റ്റങ്ങള്‍ - 2

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

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

സൂപ്പര്‍ബ്ലോക്ക് എന്ന പദം  യൂണിക്സ് അധിഷ്ഠിത സിസ്റ്റങ്ങളില്‍ ആണ് ഉപയോഗിക്കുന്നത്. സൂപ്പര്‍ബ്ലോക്കില്‍ ഉള്ള വിവരങ്ങള്‍ ഉള്‍ക്കൊള്ളുന്ന ഭാഗത്തെ വിന്‍ഡോസിലുംമറ്റും  പലഭാഗങ്ങളായീ തിരിച്ച് പലപേരുകള്‍ വിളിക്കാറുണ്ട്.

ഡിസ്കില്‍ ഒരു ഫയല്‍ സൃഷ്ടിക്കപ്പെടുന്നത്, നീക്കം ചെയ്യപ്പെടുന്നത് ഒക്കെ എങ്ങനെയെന്ന് അടുത്തഭാഗത്തില്‍..

Sunday, August 12, 2012

ഫയല്‍ സിസ്റ്റങ്ങള്‍ - 1

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

ഡിസ്കുകളെ സിലിണ്ടറുകള്‍, ട്രാക്കുകള്‍, സെക്ടറുകള്‍ എന്നിങ്ങനെ ചെറിയ യൂണിറ്റുകളായി വിഭജിച്ചിരിക്കും.
[ചിത്രത്തിന് കടപ്പാട് : വിക്കിപീടിയ]
യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങളില്‍ പൊതുവേ സെക്റ്ററുകള്‍ക്കോ സെക്റ്ററുകളുടെ ഒരു കൂട്ടത്തിനോ ബ്ലോക്ക് എന്ന വാക്കാണ് ഉപയോഗിക്കാറുള്ളത്. ശരിക്കും ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന്റെ സൗകര്യത്തിനനുസരിച്ചാണ് ഇത് തീരുമാനിക്കുന്നത്. ഡിസ്കുകളെ ബ്ലോക്ക് ഡിവൈസുകള്‍ എന്നാണ് ലിനക്സ് വിളിക്കുന്നത്. ഒരു ക്യാമറയില്‍ നിന്നോ പ്രിന്ററിലേക്കോ ഒക്കെ വിവരങ്ങള്‍ വായിക്കുകയും എഴുതുകയും ചെയ്യുന്നത് ഓരോരോ ബൈറ്റുകള്‍ ആയിട്ടാണ്. എന്നാല്‍ ഡിസ്കുകളുമായുള്ള വിവര കൈമാറ്റങ്ങള്‍ ബ്ലോക്കുകള്‍ ആയിട്ടാണ് നടത്താറുള്ളത്. ഈ ബ്ലോക്കുകളുടെ വലിപ്പം പല സാഹചര്യങ്ങളിലും  പലതായിരിക്കും.

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

ഹാര്‍ഡ് ഡിസ്കിനെ ഇനിയുള്ള കാര്യങ്ങള്‍ എളുപ്പത്തില്‍ മനസ്സിലാക്കാനായി നമുക്ക് നീട്ടി പരത്തിവയ്ക്കണം. ജി ബി കണക്കിനുള്ള സംഭരണശേഷി വൃത്താകൃതിയില്‍ ഉള്ള ഒരു പ്രതലത്തില്‍ നിന്നും മാറ്റി പരന്ന നീളമുള്ള ഒരു പ്രതലത്തിലേക്ക് കൊണ്ടുവയ്ക്കാം. ഒന്നിലധികം സെക്റ്ററുകള്‍ ഉള്‍ക്കൊള്ളുന്ന ബ്ലോക്കുകള്‍ ഒന്നിനുപിന്നില്‍ ഒന്നായി അടുക്കിവചിരിക്കുന്നത് പോലെ. എല്ലാ ഹാര്‍ഡ് ഡിസ്കിന്റെയും ആദ്യത്തെ 512 ബൈറ്റുകള്‍ മാസ്റ്റര്‍ ബൂട്ട് റെക്കോര്‍ഡ് (MBR) എന്ന് വിളിക്കപ്പെടുന്നു. ഇതില്‍ ആദ്യത്തെ 446 ബൈറ്റുകള്‍ ഡിസ്കില്‍ ഉള്ള ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തെ മെമ്മറിയിലേക്ക് കൊണ്ടുവരുന്നതിനായി (ബൂട്ടിങ്ങ്) ആവശ്യമുള്ള നിര്‍ദ്ദേശങ്ങളെ ഉള്‍ക്കൊള്ളുന്നു. ഇത് മിക്കവാറും ഒരു ബൂട്ട് ലോഡറിന്റെ ആദ്യഭാഗമായിരിക്കും. പിന്നീടുവരുന്ന 64 ബൈറ്റുകള്‍ പാര്‍ട്ടീഷ്യന്‍ ടേബിള്‍ ഉള്‍ക്കൊള്ളുന്നു. നിങ്ങളുടെ ഡിസ്കില്‍ ഉള്ള പാര്‍ട്ടീഷ്യനുകളുടെ ഒരു പട്ടികയാണ് പാര്‍ട്ടീഷ്യന്‍ ടേബിള്‍. ഓരോ പാര്‍ട്ടീഷ്യനും ആരംഭിക്കുന്ന സെക്റ്റര്‍ - ട്രാക്ക് വിവരങ്ങള്‍ ഇതില്‍ ഉണ്ടാകും. പിന്നെ ആ പാര്‍ട്ടീഷ്യന്‍ ബൂട്ടിങ്ങിനായി ഉപയോഗിക്കാമോ, അതില്‍ ഒരു ഓപ്പറേറ്റിങ് സിസ്റ്റം ഉണ്ടോ എന്നുള്ള വിവരങ്ങളും. പരമാവധി നാല് പ്രൈമറി പാര്‍ട്ടീഷ്യനുകളുടെ വിവരങ്ങള്‍ മാത്രം. ബാക്കിയുള്ള 2 ബൈറ്റുകള്‍ മാജിക്ക് നമ്പറിനുവേണ്ടി ഉള്ളതാണ്. നിങ്ങളുടെ ഹാര്‍ഡ് ഡിസ്കില്‍ ഒരു ആധികാരികമായ എം ബി ആര്‍ ഉണ്ട് എന്നതിന്റെയും അതിന്റെ അവസാനവും സൂചിപ്പിക്കാന്‍ വേണ്ടിയും ആണ് ഈ നമ്പര്‍. ഇത് ബയോസിന്റെ ഉപയോഗത്തിന് വേണ്ടിയുള്ളതാണ്. ഇതിനെക്കുറിച്ച് വിശദമായി ബൂട്ടിങ്ങിനെക്കുറിച്ചുള്ള ഭാഗത്തില്‍ പരാമര്‍ശിക്കാം.

എക്സ്റ്റന്‍ഡഡ് പാര്‍ട്ടീഷ്യനുകളുടെ തുടക്കത്തില്‍ ഈ എം ബിആര്‍ പൊലെ  ഒരു ഇ ബി ആര്‍ ഉണ്ടാകും. എക്സ്റ്റന്‍ഡഡ് ബൂട്ട് റെക്കോര്‍ഡ്. എക്സ്റ്റന്‍ഡഡ് പാര്‍ട്ടീഷ്യനില്‍ ഉള്ള ലോജിക്കല്‍ പാര്‍ട്ടീഷ്യനുകളുടെ വിവരങ്ങള്‍ രേഖപ്പെടുത്തിയിരിക്കുന്നത് ഇതില്‍ ആണ്.

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

ഇത്രയും കാര്യങ്ങള്‍ ഒരു ഡിസ്ക് ഏത് ഫയല്‍ സിസ്റ്റം ഉപയോഗിച്ചാലും അതില്‍ ഉണ്ടാകും. ഫയല്‍ സിസ്റ്റങ്ങള്‍ ഉപയോഗിക്കുന്നത് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റങ്ങള്‍ ആണ്. ഓരോ പാര്‍ട്ടീഷ്യനിലും എങ്ങനെയാണ് ഒരു ഫയല്‍ സിസ്റ്റം സജ്ജീകരിക്കപ്പെട്ടിരിക്കുന്നത് എന്നതിനെക്കുറീച്ച് അടുത്ത ഭാഗം.

Saturday, August 11, 2012

നിങ്ങളുടെ ലിനക്സിനെ അറിയൂ.. - 2

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

/bin - വിവിധ പ്രോഗ്രാമുകള്‍ ഇതില്‍ ഉണ്ടാകും. ബൈനറി എന്നതിന്റെ ചുരുക്കപ്പേരാണ് ബിന്‍. വിന്‍ഡോസില്‍ C:\WINDOWS\System32 എന്ന ഫോള്‍ഡറിന് സമാനമാണിത്.
/sbin - ഇതിലും വിവിധ പ്രോഗ്രാമുകള്‍ തന്നെ. എന്നാല്‍ ബിന്‍ ഡയറക്ടറിയില്‍ ഉള്ള പ്രോഗ്രാമികളില്‍ നിന്നും വ്യത്യസ്തമായി ഇതിലെ മിക്കവാറും പ്രോഗ്രാമുകള്‍ ഉപയോഗിക്കാന്‍ സാധാരണ ഉപഭോക്താവിന് കഴിയില്ല. റൂട്ട് യൂസര്‍ എന്ന സിസ്റ്റം അഡ്മിനിസ്റ്റ്രെറ്റര്‍ക്ക് ഉള്ളവയാണ് ഇവ. റൂട്ട് യൂസറിന്റെ പാസ് വേര്‍ഡ്  അറിയാമെങ്കില്‍ ആര്‍ക്കും ഉപയോഗിക്കാം.
/usr - ഇതില്‍ തീമുകള്‍, ഫോണ്ടുകള്‍, യൂസര്‍ മാനുവലുകള്‍ ഒക്കെ.
/usr/bin - /bin പോലെ തന്നെ. വിന്‍ഡോസില്‍ C:\Program Files എന്ന ഫോള്‍ഡറിന് സമാനമാണിത്.
/usr/sbin - /sbin പോലെ തന്നെ.
/etc - വിവിധ പ്രോഗ്രാമുകളുടെ ക്രമീകരണങ്ങള്‍ ഉള്‍ക്കൊള്ളുന്ന ഫയലുകള്‍ ആണ് ഇതില്‍ ഉണ്ടാവുക.
/mnt - ലിനക്സ് വിവിധ ഫയല്‍ സിസ്റ്റങ്ങളെ പിന്തുണക്കുന്നു. ഇപ്പോള്‍ നിങ്ങളുടെ ഹാര്‍ഡ് ഡിസ്കില്‍ നാല് പാര്‍ട്ടീഷ്യനുകള്‍ ഉണ്ടെന്നിരിക്കട്ടെ. വിന്‍ഡോസില്‍ C: D: E: F: എന്നിങ്ങനെ ഇവയെ കാണാം. ലിനക്സില്‍ ഇവ ഉപയോഗിക്കണമെങ്കില്‍ അതിനെ റൂട്ട് ഫയല്‍ സിസ്റ്റത്തിലെ ഏതെങ്കിലും  ഒരു ഡയറക്ടറിയുമായി ബന്ധിപ്പിക്കണം. മൗണ്ടിങ്ങ് എന്നാണ് ഇതിന് പറയുന്നത്. ഒരു ഡിസ്ക് അല്ലെങ്കില്‍ ഡിസ്ക് പാര്‍ട്ടീഷ്യനുമായി ബന്ധിപ്പിച്ചിരിക്കുന്ന ഡയറക്റ്ററിയെ ആ ഡിസ്കിന്റെ മൗണ്ട് പോയിന്റ് എന്ന് വിളിക്കുന്നു. നിങ്ങളുടെ കമ്പ്യൂട്ടറുമായി ബന്ധിപ്പിച്ചിരിക്കുന്ന വിവിധ ഡിസ്കുകളെ /mnt യില്‍ ഉള്ള വിവിധ ഡയറക്റ്ററികളില്‍ മൗണ്ട് ചെയ്യാം.
/media - /mnt പോലെതന്നെ.
/home - കമ്പ്യൂട്ടറിലെ ഓരോ യൂസര്‍ക്കും ഈ ഡയറക്റ്ററിയില്‍ ഒരു ഡയറക്റ്ററി ഉണ്ടാകും. ആ യൂസറിന്റെ ക്രമീകരണങ്ങള്‍, ഫയലുകള്‍ ഒക്കെ ഇതില്‍ കാണും. വിന്‍ഡോസിലെ My Documents പോലെ. ഈ ഡയറക്റ്ററി ചിലപ്പോളൊക്കെ വേറെ ഒരു ഡിസ്ക് പാര്‍ട്ടീഷ്യന്റെ മൗണ്ട് പോയിന്റ് ആയിരിക്കും. ലിനക്സ് ഇന്സ്റ്റാള്‍ ചെയ്യുന്ന സമയത്ത് റൂട്ട് ഫയല്‍ സിസ്റ്റം ക്രമീകരിക്കാന്‍ ഒരു പ്രത്യേക പാര്‍ട്ടീഷ്യന്‍ നിര്‍ബന്ധമാണല്ലോ. അതുപോലെ ഉപഭോക്താക്കളുടെ വിവരങ്ങള്‍ ശേഖരിക്കാന്‍ വേറെ ഒരു പാര്‍ട്ടീഷ്യന്‍ ഉണ്ടെങ്കില്‍ അതിനെ /home ഇല്‍ മൗണ്ട് ചെയ്യാം. ഇങ്ങനെ ചെയ്യുന്നതിന് പല മെച്ചങ്ങളും  ഉണ്ട്. ഉബുണ്ടു പോലെയുള്ള ലിനക്സ് ഡിസ്ട്രിബ്യൂഷനുകള്‍ കൂടെക്കൂടെ പുതിയ പതിപ്പുകള്‍ ഇറക്കാറുണ്ട്.പുതിയ പതിപ്പുകള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യുമ്പോള്‍ പഴയതില്‍ ഉണ്ടായിരുന്ന വിവരങ്ങള്‍ മിക്കവാറും നഷ്ടമാകും. ഡെസ്ക്ടോപ്പില്‍ സൂക്ഷിച്ച ഫയലുകള്‍, ക്രമീകരണങ്ങള്‍, വെബ് ബ്രൗസറിലെ ബുക്ക് മാര്‍ക്കുകള്‍ ഒക്കെ. ഉപഭോക്താക്കളുടെ വിവരങ്ങള്‍ക്കായി വേറെ പാര്‍ട്ടീഷ്യന്‍ ഉണ്ടെങ്കില്‍ ഇതിനെ ഫോര്‍മാറ്റ് ചെയ്യാതെ റൂട്ട് ഫയല്‍ സിസ്റ്റം മാത്രം ഫോര്‍മാറ്റ് ചെയ്ത് പുതിയ പതിപ്പുകള്‍ സജ്ജീകരിക്കാം. അപ്പോള്‍ ഉപഭോക്താക്കളുടെ വിവരങ്ങള്‍ നഷ്ടപ്പെടാതെ ഇരിക്കും.
/var - ഇത് ഏകദേശം /etc പോലെ തന്നെ.
/boot - കെര്‍ണല്‍, ബൂട്ട് ലോഡര്‍ തുടങ്ങിയവ ഇതില്‍ കാണും. /boot/vmlinuz ആണ് ലിനക്സ് കെര്‍ണല്‍. ബൂട്ട് ലോഡറുകളെ പറ്റി വഴിയെ..

മേല്‍പ്പറഞ്ഞ ഡയറക്റ്ററികളിലെ വിവരങ്ങള്‍ ഡിസ്കില്‍ സൂക്ഷിക്കപ്പെട്ടവയും കമ്പ്യൂട്ടര്‍ ഓഫ് ചെയ്താലും നഷ്ടപ്പെടാത്തവയും ആണ്. ഇനി വരുന്നവ ലിനക്സ് ഉപയോഗിക്കുന്ന യതാര്‍ഥങ്ങള്‍ അല്ലാത്ത (സ്യൂഡോ) ഫയല്‍ സിസ്റ്റങ്ങളുടെ മൗണ്ട് പോയിന്റുകള്‍ ആണ്. ഈ ഡയറക്റ്ററികളിലെ വിവരങ്ങള്‍ ഓരോ തവണ കംപ്യൂട്ടര്‍ ഓഫ് ചെയ്യുമ്പോളും ഇല്ലാതാകും. ഇതിലെ ഫയലുകളില്‍ ഉള്ള വിവരങ്ങള്‍ എവിടേയും രേഖപ്പെടുത്തിയവ അല്ല, ഓരോ തവണ ആ ഫയലുകള്‍ വായിക്കുമ്പോളും താല്‍ക്കാലികമായി ഉണ്ടാക്കപ്പെടുന്നവയാണ്.

/tmp - പ്രോഗ്രാമുകള്‍ പ്രവര്‍ത്തിക്കുമ്പോള്‍ താല്‍ക്കാലിക വിവരങ്ങള്‍ സൂക്ഷിക്കാന്‍.
/dev - ലിനക്സ്/യൂണിക്സ് സിസ്റ്റങ്ങള്‍ എല്ലാത്തിനെയും ഫയലുകള്‍ ആയിട്ടാണ് പരിഗണിക്കുക എന്ന് ആദ്യത്തെ പോസ്റ്റില്‍ പറഞ്ഞിരുന്നല്ലോ. കംപ്യൂട്ടറുമായി ഘടിപ്പിച്ചിരിക്കുന്ന ഓരോ ഉപകരണങ്ങള്‍ക്കും ആയുള്ള ഫയലുകള്‍ ആണ് ഇതില്‍ ഉണ്ടാകുക.
/proc - ലിനക്സില്‍ പ്രവര്‍ത്തിച്ചുകൊണ്ടിരിക്കുന്ന എല്ലാ പ്രോഗ്രാമുകളെയും സമ്ബന്ധിച്ച വിവരങ്ങള്‍ അടങ്ങിയ ഫയലുകള്‍, പ്രോസസറിനെയും മെമ്മറിയെയും കുറിച്ചുള്ള വിവരങ്ങള്‍ ഒക്കെ.
/sys - /dev പോലെ തന്നെ. ചില്ലറ വ്യത്യാസങ്ങള്‍ ഉണ്ട്.

ഫയല്‍ സിസ്റ്റങ്ങളെ കുറിച്ച് വിശദമായി അടുത്ത് പോസ്റ്റ്. സംശയങ്ങളും അഭിപ്രായങ്ങളും അറിയിക്കുമല്ലോ..